void BnB4(int Pierwszy) { Task Zadanie; int LB; for (int i = TasksCount - Iteracja; i > 0; i--) { Permutacja[Iteracja] = Tasks[Pierwszy].N; if (Iteracja != OstIteracja) { Zadanie = Tasks[Pierwszy]; Pierwszy = Zadanie.Forget(); // Funkcja zwraca numer nastepnego zadania Iteracja++; LB = Bound4(Pierwszy); if (LB <= NajlepszyCzas) { Rekurencje++; BnB4(Pierwszy); } Iteracja--; Zadanie.Remind(); } else { Pierwszy = Tasks[Pierwszy].Next.N; Permutacja[Iteracja + 1] = Tasks[Pierwszy].N; PoliczPermutacje(); // Funkcja załatwia sprawe z uaktualnieniem UB i zapisania permutacji } } }
int Dynamiczny(int Pierwszy, int CzasZbioru) { Task Zadanie; float KaraMin = Mathf.Infinity; int MiejsceWBazie; for (int i = Count - Iteracja; i > 0; i--) { if (Iteracja != OstIteracja) //przedostatnie wywołanie bedzie ostatnim { Zadanie = Tasks[Pierwszy]; Pierwszy = Zadanie.Forget(); // Funkcja zwraca numer nastepnego zadania Iteracja++; if (!ZborJuzByl(Pierwszy)) { // Zbioru nie było MiejsceWBazie = (int)Zbior; KaraPodzbioru[MiejsceWBazie] = Dynamiczny(Pierwszy, CzasPodzbioru); KaraZbioru = Mathf.Max(CzasZbioru - Zadanie.D, 0) * Zadanie.W; KaraMin = (int)Mathf.Min((KaraZbioru + KaraPodzbioru[MiejsceWBazie]), KaraMin); } else { KaraZbioru = Mathf.Max(CzasZbioru - Zadanie.D, 0) * Zadanie.W; KaraMin = (int)Mathf.Min((KaraZbioru + KaraPodzbioru[(int)Zbior]), KaraMin); // c wskazuje na miejsce gdzie funkcja ZbiorJuzByl znalazla zbior } Iteracja--; Zadanie.Remind(); } else { Zadanie = Tasks[Pierwszy]; KaraZbioru = Mathf.Max(CzasZbioru - Zadanie.D, 0) * Zadanie.W; Zadanie = Zadanie.Next; Pierwszy = Zadanie.N; karaPodzbioru = Mathf.Max(Zadanie.P - Zadanie.D, 0) * Zadanie.W; KaraMin = (int)Mathf.Min((KaraZbioru + karaPodzbioru), KaraMin); } } return((int)KaraMin); }