gpt4 book ai didi

algorithm - 精确的欧几里德旅行推销员

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:30:33 24 4
gpt4 key购买 nike

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

我知道它是 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;

最佳答案

你应该使用:

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

代替:

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

关于algorithm - 精确的欧几里德旅行推销员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17160140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com