.Alpha. 2024-11-28 21:26 采纳率: 60%
浏览 47
已结题

小规模TSP问题的动态规划求解

求解答:
在使用动态规划算法解决旅行商(TSP)问题出现错误,对于任何合法样例输入返回的都是INT_MIN值,即为 -2147483648。求找出源代码中的问题

#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int solveTSP(const vector<vector<int>>& graph, int n) {
    vector<vector<int>> dp(n, vector<int>((1 << n), INT_MAX));
    dp[0][1] = graph[0][0]; // 初始化起点城市到自身的距离为0(如果需要从城市0出发再回到0,这里应设为0)
    for (int mask = 1; mask < (1 << n); ++mask) {
        for (int i = 0; i < n; ++i) {
            if ((mask & (1 << i)) != 0) { // 检查i是否在mask中
                for (int j = 0; j < n; ++j) {
                    if ((mask & (1 << j)) == 0) { // 检查j是否未被访问过(不在mask中)
                        // 更新dp数组,从所有已访问的城市i到未访问的城市j
                        dp[j][mask | (1 << j)] = min(dp[j][mask | (1 << j)], dp[i][mask] + graph[i][j]);
                    }
                }
            }
        }
    }
    int result = INT_MAX;
    for (int i = 0; i < n; ++i) {
        result = min(result, dp[i][(1 << n) - 1]);
    }
    return result;
}
int main() {
    int n;
    cout << "Enter the number of cities (n): ";
    cin >> n;
    vector<vector<int>> graph(n, vector<int>(n, 0));
    cout << "Enter the distance matrix:\n";
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> graph[i][j];
        }
    }
    cout << "Best path: " << solveTSP(graph, n) << endl;
    return 0;
}


  • 写回答

28条回答 默认 最新

  • 阿里嘎多学长 2024-11-28 21:26
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题分析 旅行商问题(TSP)是一种经典的计算问题,是 NP-complete 问题,可以使用动态规划算法来求解。然而,在您的代码中出现了错误,返回的结果总是 INT_MIN 值,即 -2147483648。

    问题检查 检查您的代码中是否存在以下问题:

    1. 缴税数组的初始化:请检查您的代码是否正确初始化了距离矩阵。如果没有初始化,可能会出现错误。
    2. 缴税数组的遍历:请检查您的代码是否正确遍历了距离矩阵。如果遍历的顺序错误,可能会出现错误。
    3. 缴税数组的更新:请检查您的代码是否正确更新了距离矩阵。如果更新的顺序错误,可能会出现错误。

    解决方案 以下是一个简单的动态规划算法来解决小规模TSP问题:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int tsp(vector<vector<int>>& distance) {
        int n = distance.size();
        vector<vector<int>> dp(n, vector<int>(1 << n, INT_MAX));
    
        dp[0][1] = 0;
        for (int mask = 1; mask < (1 << n); mask++) {
            for (int i = 0; i < n; i++) {
                if (!(mask & (1 << i))) continue;
                for (int j = 0; j < n; j++) {
                    if ((mask & (1 << j)) && i != j) {
                        int newMask = mask ^ (1 << i);
                        dp[i][mask] = min(dp[i][mask], dp[j][newMask] + distance[i][j]);
                    }
                }
            }
        }
    
        int res = INT_MAX;
        for (int i = 0; i < n; i++) {
            res = min(res, dp[i][(1 << n) - 1] + distance[i][0]);
        }
        return res;
    }
    
    int main() {
        int n;
        cin >> n;
        vector<vector<int>> distance(n, vector<int>(n));
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                cin >> distance[i][j];
            }
        }
    
        cout << tsp(distance) << endl;
        return 0;
    }
    

    注意:上述代码只考虑小规模TSP问题,如果您的问题规模较大,可能需要使用其他算法或优化技术。

    问题结果 如果您的问题仍然出现错误,请检查您的代码中的具体错误,可以 debug 到 specific error 位置来确认问题的根本原因。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(27条)

报告相同问题?

问题事件

  • 系统已结题 12月7日
  • 已采纳回答 11月29日
  • 创建了问题 11月28日