0

我正在尝试实现算法来解决旅行商问题。

我知道这是 NP-Hard 但我只需要为 20 个城市解决它。我想要一个 excat 结果并想要使用动态编程算法。

在我当前的实现中,我收到了一个 java 堆空间错误。发生这种情况是因为我创建了一个索引为“1 << n”的解决方案矩阵。

我找不到与此问题相关的任何信息。仅找到最多 10 个城市的一些信息。

谁能帮我?

这是我的 TSP 代码:

 int n = dist.length;
        int[][] dp = new int[n][n];
        for (int[] d : dp)
            Arrays.fill(d, Integer.MAX_VALUE / 2);
        dp[1][0] = 0;
        for (int mask = 1; mask < 1 << n; mask += 2) {
            for (int i = 1; i < n; i++) {
                if ((mask & 1 << i) != 0) {
                    for (int j = 0; j < n; j++) {
                        if ((mask & 1 << j) != 0) {
                            dp[mask][i] = Math.min(dp[mask][i], dp[mask ^ (1 << i)][j] + dist[j][i]);
                        }
                    }
                }
            }
        }
        int res = Integer.MAX_VALUE;
        for (int i = 1; i < n; i++) {
            res = Math.min(res, dp[(1 << n) - 1][i] + dist[i][0]);
        }

        // reconstruct path
        int cur = (1 << n) - 1;
        int[] order = new int[n];
        int last = 0;
        for (int i = n - 1; i >= 1; i--) {
            int bj = -1;
            for (int j = 1; j < n; j++) {
                if ((cur & 1 << j) != 0 && (bj == -1 || dp[cur][bj] + dist[bj][last] > dp[cur][j] + dist[j][last])) {
                    bj = j;
                }
            }
            order[i] = bj;
            cur ^= 1 << bj;
            last = bj;
        }
        System.out.println(Arrays.toString(order));
        return res;
4

1 回答 1

1

你应该使用:

int[][] dp = new int [1 << n][n];

代替 :

int[][] dp = new int [n][n];
于 2013-06-18T07:56:50.380 回答