Zapętlenie funkcji - tabu search

0

Witam,

Zwracam się z dość zapewne dziwną prośbą, ale niestety program, który muszę jutro oddać na zaliczenie nie działa. W związku z tym, że wcześniej działał domyślam się, że problem polega na zapętleniu w tej funkcji (główna funkcja algorytmu, generowanie instancji problemu działa bez zarzutów). Algorytm (przynajmniej w zamyśle :P) tabu search.

Z góry dzięki za wszelką pomoc.

        public void run()
        {
            Result Res = new Result();

            TabuElem elem = new TabuElem();

            List<long> instantResult = new List<long>();

            List<long> taboo = new List<long>();

            this.readInstance();
            Res.mark = 0;
            int steper = 0;
            while (Res.mark < 90 || steper < 10)
            {
                instantResult = this.losuj();
                elem = this.Rate(instantResult);

                

                int steps = 0;
                while (steps < 10)
                {
                    if (Res.mark > 90)
                        break;
                    if (elem.mark < Res.mark)
                    {
                        this.tabuList.Add(elem);
                    }
                    else
                    {
                        Res.result = elem.result;
                        Res.mark = elem.mark;
                    }

                    foreach (int ind in elem.toImprove)
                    {
                        taboo.Add(instantResult[ind]);
                        bool changer = false;
                        while (changer)
                        {
                            Random rand = new Random();
                            int index = rand.Next(0, this.odcinki.Count() - 1);
                            if (!instantResult.Contains(this.odcinki[index]) &&
                                !taboo.Contains(this.odcinki[index]))
                            {
                                instantResult[ind] = this.odcinki[index];
                                changer = true;
                            }
                        }
                     }
                     elem = this.Rate(instantResult);
                     steps++;
                 }
                 steper++;
            }
        }
0
Mateuszek napisał(a)

Debugowałem. Po odpaleniu algorytmu zawiesza się i nie wyrzuca żadnych błędów. No chyba, że to normalne w przypadku długich obliczeń, że pod Windowsem program wygląda jakby się zawiesił.

Na której linijce się zatrzymuje?

0

W takim układzie widzę, że muszę poczytać coś więcej o debugowaniu w VS, bo nie widziałem, żeby zwracał linię, na której się zatrzymał, lub pokazywał linia po linii co teraz robi.

A w jaki sposób debugujesz? Ja używam głównie klawiszy F10,F11 i shift-F11. Brakepointy są też bardzo przydatne, szczególnie z ustawionym condition. A i jeszcze jest klasa Debug potrafiąca pisać do output.

0
Sarrus napisał(a)

A w jaki sposób debugujesz? Ja używam głównie klawiszy F10,F11 i shift-F11. Brakepointy są też bardzo przydatne, szczególnie z ustawionym condition. A i jeszcze jest klasa Debug potrafiąca pisać do output.

Cóż, pierwszy projekt w C# i VS, więc robiłem tylko F5. :/

Dzięki za wskazówki pobawię się tym dzisiaj, przypuszczalnie pójdzie szybciej niż dochodzenie czemu to może nie działać.

0

F5 to nie jest debugowanie, tylko uruchomienie programu w trybie debug.
Debugowanie to wykonywanie krokowe programu i obserwowanie co się w nim dzieje. Czyli np. ustawiasz w jakiejś li ni breakepoint (klikając obok edytora kodu albo wciskając F9), dopiero wciskasz F5, program się uruchamia, dochodzi do tej linii i pauzuje. Następnie możesz iść naprzód używając F10 i F11, różnica między nimi jest taka, że F10 idzie po prostu po instrukcjach po kolei, a F11 pozwala wejść do funkcji.

0
Mateuszk napisał(a)

Witam,

Zwracam się z dość zapewne dziwną prośbą, ale niestety program, który muszę jutro oddać na zaliczenie nie działa. W związku z tym, że wcześniej działał domyślam się, że problem polega na zapętleniu w tej funkcji (główna funkcja algorytmu, generowanie instancji problemu działa bez zarzutów). Algorytm (przynajmniej w zamyśle :P) tabu search.

Z góry dzięki za wszelką pomoc.

        public void run()
        {
            Result Res = new Result();

            TabuElem elem = new TabuElem();

            List<long> instantResult = new List<long>();

            List<long> taboo = new List<long>();

            this.readInstance();
            Res.mark = 0;
            int steper = 0;
            while (Res.mark < 90 || steper < 10)
            ...

błąd masz w pętli while:

  1. ustawiasz właściwość Res.mark = 0 i nigdy jej nie inkrementujesz
  2. z punktu 1. wynika, że pierwszy warunek we while zawsze jest spełniony, więc drugi nawet nie jest sprawdzany, choć zmienna steper może mieć wartość nawet 100000000.

1 użytkowników online, w tym zalogowanych: 0, gości: 1