我试图使用C解决旅行商的问题。我能够成功计算出正确的最小距离,但似乎无法生成相应的路径。 注意:我不需要回到第一个城市,这就是为什么功能可能与经典城市略有不同的原因。
我用来解决此问题的想法如下: 我递归地调用一个名为travellingSalesMan的函数,如果所有访问过的城市(我使用访问过的数组跟踪访问过的城市)或当前所遵循的路径大于前一个路径,我只是返回当前距离之间的最小值,存储在变量中,以及当前的最小距离(开始时设置为最大)。
我试图使用名为currentPath的数组以及pathLen来跟踪路径,该数组告诉我路径中有多少个元素。
这是我现在拥有的代码:
int travelingSalesMan(int** distMatrix, int arrSize, int* visited, int currentCity, int* currentPath, int cur_dist, int min_dist, int* minPath, int pathLen){
if (complete(visited, arrSize) == arrSize) {
// minPath[index] = currentPath[index];
printf("Path len: %d\n", pathLen);
for(int i = 0; i<arrSize; i++){
minPath[i] = currentPath[i];
}
minPath[arrSize - 1] = currentCity;
return min(cur_dist, min_dist);
}
// no need to pursue the path that is not minimum
if(cur_dist >= min_dist){
pathLen--;
return min(cur_dist, min_dist);
}
for (int i = 0; i<arrSize; i++) {
if (visited[i] == 0 && i != currentCity) {
cur_dist += distMatrix[currentCity][i];
currentPath[pathLen++] = currentCity;
visited[i] = 1;
min_dist = travelingSalesMan(distMatrix, arrSize, visited, i, currentPath, cur_dist, min_dist, minPath, pathLen);
visited[i] = 0;
cur_dist -= distMatrix[currentCity][i];
pathLen--;
}
}
return min_dist;
}
我使用以下参数调用了上面的函数:
distance = travelingSalesMan(distMatrix, N, visited, 0, currentPath, 0, INT_MAX, minPath, 1);
对于给定的distMatrix:
[
{0 10 10 10 10}
{10 0 2 4 11}
{10 2 0 12 4}
{10 4 12 0 8}
{10 11 4 8 0}
]
最小重量是20,所以我希望看到一条路径,例如:
0 3 1 2 4
谢谢!
答案 0 :(得分:0)
在if (complete(visited, arrSize) == arrSize) {
块中
仅当当前路径比找到的最佳路径短时,才应该写入min_path。