Я пытаюсь реализовать локальный поиск (с двумя опциями), чтобы решить проблему коммивояжера. Однако у меня возникли проблемы с правильным воссозданием полной схемы (тур по узлам). Я думаю, что мой алгоритм может быть ошибочным. Это моя реализация 2-opt:
а->б->...г->в->...а
переключается на
а->г->...б->в->...а
мой общий процесс выглядит как стандартный обмен: сохранить b как temp сохранить c как temp2 a->d b->c
Мой код выглядит так:
node* twoOpt(double** distance_matrix, node* tour, int NUM_CITIES)
{
int rand1, rand2;
int temp, temp2;
rand1 = rand() % NUM_CITIES; //a
rand2 = rand() % NUM_CITIES; //d
do
{
//Ensure the two numbers are different
while (rand1 == rand2 || tour[rand1].destination == rand2 || rand1 == tour[rand2].destination)
rand2 = rand() % NUM_CITIES;
//Make swap
temp = tour[rand1].destination; //b
temp2 = tour[rand2].destination; //c
tour[rand1].destination = rand2;
tour[rand1].distance = distance_matrix[rand1][rand2]; //a->d
tour[temp].destination = temp2;
tour[temp].distance = distance_matrix[temp][temp2]; //b->c
} while(!travelTour(tour, NUM_CITIES));
return tour;
}
Теперь я понимаю, что этот код не идеален. Например, если два перетасованных узла не создают полной цепи, код изменяет только второй узел перед повторной попыткой. Но вопрос, который у меня есть, в первую очередь о том, почему я не могу получить этот полный тур.
Спасибо за вашу помощь!