Floyd Warshall'的Java实现;s算法
一周来,我一直在努力为我正在进行的一个游戏寻找路径。我用的是弗洛伊德·沃沙尔的算法。我相信我已经设法将问题缩小到这个范围内:Floyd Warshall'的Java实现;s算法,java,path-finding,floyd-warshall,Java,Path Finding,Floyd Warshall,一周来,我一直在努力为我正在进行的一个游戏寻找路径。我用的是弗洛伊德·沃沙尔的算法。我相信我已经设法将问题缩小到这个范围内: 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
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];
}
输出:
[x: 4, y: 4] 0
[x: 4, y: 5] 1
[x: 5, y: 4] 2
[x: 5, y: 5] 3
[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]
2147483647 1 1 1
1 2147483647 1 1
1 1 2147483647 1
1 1 1 2147483647
[x: 4, y: 4] 0
[x: 4, y: 4] 0
[x: 4, y: 4] 0
[x: 4, y: 5] 1
这是意料之中的
for(Edge e:edgeList)
System.out.println(e.from.pos.toString() + " " + e.to.pos.toString());
输出:
[x: 4, y: 4] 0
[x: 4, y: 5] 1
[x: 5, y: 4] 2
[x: 5, y: 5] 3
[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]
2147483647 1 1 1
1 2147483647 1 1
1 1 2147483647 1
1 1 1 2147483647
[x: 4, y: 4] 0
[x: 4, y: 4] 0
[x: 4, y: 4] 0
[x: 4, y: 5] 1
这也是意料之中的
for(int[] ia:D){
for(int a:ia)System.out.print(a + " ");
System.out.print("\n");
}
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: 5] 1
[x: 5, y: 4] 2
[x: 5, y: 5] 3
[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]
2147483647 1 1 1
1 2147483647 1 1
1 1 2147483647 1
1 1 1 2147483647
[x: 4, y: 4] 0
[x: 4, y: 4] 0
[x: 4, y: 4] 0
[x: 4, y: 5] 1
这也是意料之中的
for(int[] ia:D){
for(int a:ia)System.out.print(a + " ");
System.out.print("\n");
}
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);
}
这就是我认为问题所在,我希望输出包含所有不同的节点,只有在这里找到的两个节点在getShortestPath函数中工作。
我相信这将是循环的正确输出,就我所知,顺序应该是无关的
[x: 4, y: 4] 0
[x: 4, y: 5] 1
[x: 5, y: 4] 2
[x: 5, y: 5] 3
我不知道到底是什么导致了循环中的问题,或者我是否误解了算法。从结果来看:
[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\u值
。因此,前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,比如恢复最短路径路径,这是一个更容易出现bug的地方。如果你向我们展示你期望的输出,那将非常有帮助。说“它不像预期的那样”并没有多大帮助,因为有许多可能的“其他”结果。不幸的是,实现中的InitializeWight函数与我得到的完全相同,所以这不是问题所在,我现在已经在问题中添加了D变量的值。谢谢你的尝试。