Beispiel #1
0
    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
            }
        }
    }
Beispiel #2
0
    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);
    }