задача коммивояжера динамическое программирование

#c #recursion #traveling-salesman

#c #рекурсия #коммивояжер

Вопрос:

Я написал код, который дает наименьшую стоимость для массива, в котором хранится длина путей из каждого города в каждый город. Я использовал рекурсию в своем коде. Пользователь выбирает первый город, из которого продавец начинает свой тур. Продавец должен посетить каждый город один раз и вернуться в город, из которого он начал. Мой код дает правильную стоимость, но я понятия не имею, как получить путь, который дает наименьшую стоимость. Должен ли я использовать некоторые дополнительные массивы? Я не знаю, когда добавить город к пути. Какая-нибудь помощь?

 void Dynamic::dynamic(Array array) {  int start;  size = array.getSize();  s = size;  path = new int[size 1];        cout lt;lt; "Which city we start from?" lt;lt; endl;  cin gt;gt; start;  int* cities = new int[size];  for (int i=0; ilt;size 1; i  )  {  cities[i] = i;    }        int cost = g(array, size-1, cities, start, start, s);    coutlt;lt;"Minimum cost: " lt;lt; cost lt;lt; endl;  cout lt;lt; "Path:" lt;lt;endl;    for (int i=size; igt;=0; i--)  {  cout lt;lt; path[i] lt;lt; "t";  }    cout lt;lt; "n";   }  int Dynamic::g(Array amp; array, int level, int* tab, int city, int start, int z) {  if (levelgt;0)  {     int minimum = INF;      int position;  bool exists = false;  int k = z;    for (int i=0; ilt;z; i  )  {    if (tab[i] == city)  {  position = i;  exists = true;  }  }    int* tmp;    if (exists == true)    {  k = z-1;  tmp = new int [k];  for (int i=0; ilt;position; i  )  {  tmp[i] = tab[i];  }    for (int i=position; ilt;k; i  )  {  tmp[i] = tab[i 1];  }  }    else  {  tmp = new int [k];  for (int i=0; ilt;k; i  )  {  tmp[i] = tab[i];  }  }      for (int i=0; ilt;k; i  )  {        int c = array[city][tmp[i]];    int* t = new int [k-1];  for(int j=0; jlt;i; j  )  {  t[j] = tmp[j];  }     for (int j=i; jlt;k-1; j  )  {  t[j] = tmp[j 1];  }      int a = g(array, level-1, t, tmp[i], start, k-1);    int result = c   a;    if (minimumgt; result)  {  minimum = result;        }      }    return minimum;  }    if (level == 0)  {    return array[city][start];  } }   

Комментарии:

1. Цикл for (int i=0; ilt;size 1; i ) выйдет за рамки cities и приведет к неопределенному поведению . И почему вы используете свою собственную явную обработку памяти вместо std::vector этого ? Особенно учитывая, что вы не освобождаете выделяемую вами память.

2. И что же Array это такое ? Вы создали свою собственную std::vector альтернативу? Почему? И почему вы передаете его по значению своей dynamic функции?

3. массив классов просто считывает файл .txt, в котором хранятся пути из каждого города в каждый город

4. первая строка-это количество городов, а в следующих строках у меня есть расходы на другие города. Массив похож на [number_of_cities][number_of_cities] стоимость от города до того же города равна 0. Но мой код позволяет избежать риска повторной поездки в один и тот же город.

5. @czesiek Вы написали код, из-за которого повсюду происходит утечка памяти. Используйте std::vector , new[] а не delete[] и.