c - 如何打印旅行商问题中的路径

标签 c traveling-salesman

我试图用C解决旅行商问题。我成功地计算出正确的最小距离,但我似乎无法生成相应的路径。 注意:我不需要回到第一个城市,这就是为什么功能可能与经典城市略有不同。

我用来解决这个问题的想法如下: 我递归地调用一个名为travelingSalesMan的函数,如果访问过的所有城市(我使用访问过的数组来跟踪访问过的城市)或当前遵循的路径大于前一个路径,我只返回当前距离之间的最小值,存储在变量中,以及当前的最小距离(在开始时设置为最大)。

我尝试使用一个名为 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 

谢谢!

最佳答案

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

关于c - 如何打印旅行商问题中的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55978671/

相关文章:

c - 隐藏用户输入,仅允许某些字符

c - 半字节半数转换器

我可以使用 munge SDP 示例连接另一台 PC 吗?

c - 我如何使用 scanf 检测新行输入和打印目录,如终端

java - 谷歌地图的 "optimizeWaypoints"如何解决旅行推销员问题?

java - 使用近似算法的旅行商库

c - 在动态规划中使用位掩码

c - 创建 MPI 结构时出现问题,调用 MPI_Bcast 时出现错误 11

javascript - 异步旅行推销员子旅行的本地搜索启发式

python - 如何在 Python 中对 TSP 实现动态编程算法?