Я работаю над небольшим проектом по решению TSP, но у меня возникла проблема. Идея состоит в том, чтобы оптимизировать локальную часть неоптимального пути, просто найдя лучшую комбинацию. Это достигается с помощью простой рекурсивной функции генерации перестановок.
Что я хочу сделать сейчас, так это проверить, есть ли у текущего решения потенциал для улучшения (логика: не вызывать функцию перестановки, если вес решения больше текущего лучшего).
Проблема, с которой я сталкиваюсь, заключается в том, что текущая реализация улучшает решение, но не делает его оптимальным (я сравнил результаты с простым перебором). Я был бы признателен, если бы вы указали на мои логические недостатки или/и ошибки. M - матрица затрат. help - текущее решение, best - лучшее решение (переменные класса)
void City::Generate(int** M, int* help, int k, int &auxcost, int* best) {
int cost2 = 0; // текущая цена
if (k == range){
for (int i = 0; i < range - 1; i++)
cost2 += M[help[i]][help[i + 1]];
if (cost2 < auxcost ){
auxcost = cost2;
memcpy(best, help,range *sizeof(int));
changed = true;
}
}
else{
for (int j2 = k; j2<range; j2++){
swap(help[k], help[j2]);
for (int i = 0; i < range - 1; i++)
tcost += M[help[i]][help[i + 1]];
if (tcost <= auxcost)
Generate(M, help, k + 1, start, end, auxcost, best);
swap(help[k], help[j2]);
}
}
}