如何在旅行商问题中打印路径

时间:2019-05-04 01:08:00

标签: c traveling-salesman

我试图使用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 

谢谢!

1 个答案:

答案 0 :(得分:0)

if (complete(visited, arrSize) == arrSize) {块中 仅当当前路径比找到的最佳路径短时,才应该写入min_path。