我已经尝试了一个星期的时间来寻找适合我正在努力的游戏的路径。我正在使用Floyd Warshall算法的this implementation。我相信我已经设法将问题缩小到这个循环范围内:
for(int k = 0; k < nodes.length; k++)
for(int i = 0; i < nodes.length; i++)
for(int j = 0; j < nodes.length; j++)
if(D[i][k] != Integer.MAX_VALUE
&& D[k][j] != Integer.MAX_VALUE
&& D[i][k] + D[k][j] < D[i][j]){
D[i][j] = D[i][k]+D[k][j];
P[i][j] = nodes[k];
}
我一直在测试4个节点,每个节点连接到所有其他节点,所有连接的权重都是1.这是循环之前所有相关变量的值。
for(Node n:nodes)System.out.println(n.pos.toString() + " " + n.index);
输出:
[x: 4, y: 4] 0
[x: 4, y: 5] 1
[x: 5, y: 4] 2
[x: 5, y: 5] 3
这是预期的
for(Edge e:edgeList)
System.out.println(e.from.pos.toString() + " " + e.to.pos.toString());
输出:
[x: 4, y: 4] [x: 5, y: 4]
[x: 4, y: 4] [x: 4, y: 5]
[x: 4, y: 4] [x: 5, y: 5]
[x: 4, y: 5] [x: 4, y: 4]
[x: 4, y: 5] [x: 5, y: 4]
[x: 4, y: 5] [x: 5, y: 5]
[x: 5, y: 4] [x: 4, y: 4]
[x: 5, y: 4] [x: 4, y: 5]
[x: 5, y: 4] [x: 5, y: 5]
[x: 5, y: 5] [x: 4, y: 4]
[x: 5, y: 5] [x: 5, y: 4]
[x: 5, y: 5] [x: 4, y: 5]
这也是预期的。
for(int[] ia:D){
for(int a:ia)System.out.print(a + " ");
System.out.print("\n");
}
输出:
2147483647 1 1 1
1 2147483647 1 1
1 1 2147483647 1
1 1 1 2147483647
这也是预期的。
P = new Node[nodes.length][nodes.length];
for(int k = 0; k < nodes.length; k++)
for(i = 0; i < nodes.length; i++)
for(int j = 0; j < nodes.length; j++)
if(D[i][k] != Integer.MAX_VALUE
&& D[k][j] != Integer.MAX_VALUE
&& D[i][k]+D[k][j] < D[i][j]){
D[i][j] = D[i][k]+D[k][j];
P[i][j] = nodes[k];
System.out.println(nodes[k].pos.toString() + " " + k);
}
输出:
[x: 4, y: 4] 0
[x: 4, y: 4] 0
[x: 4, y: 4] 0
[x: 4, y: 5] 1
这就是我认为问题所在,我希望输出包含所有不同的节点,只有这里找到的两个节点在getShortestPath函数中起作用。 我相信这将是循环的正确输出,并且据我所知,顺序应该是无关紧要的。
[x: 4, y: 4] 0
[x: 4, y: 5] 1
[x: 5, y: 4] 2
[x: 5, y: 5] 3
我不知道究竟是什么导致了循环中的问题,或者我是否误解了算法。
答案 0 :(得分:1)
从结果:
[x: 4, y: 4] 0
[x: 4, y: 4] 0
[x: 4, y: 4] 0
[x: 4, y: 5] 1
我几乎可以猜到发生了什么。您可能已将所有D[i][j]
初始化为1
,但将D[i][i]
初始化为Integer.MAX_VALUE
。因此,前3个更新为D[i][i] = D[i][0] + D[i][0]
k = 0
,i = 1..3
。
但D[0][0]
只能更新为d[0][1] + d[1][0]
。
你的floyd-warshall的实现看起来完全没问题。也许你应该在其他地方检查你的bug,比如恢复最短路径路径,这样就有更多错误。