我一直在嘗試一個星期才能找到適合我正在開發的遊戲的路徑。我使用Floyd Warshall算法的this implementation。我相信我已經成功地縮小問題是在這個循環中:Floyd Warshall算法的Java實現
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
我不知道究竟是什麼導致循環,或者如果我誤解了一些關於算法的問題。
如果您向我們展示您期望的輸出,那將會有很大幫助。說「這不是預期的」並沒有多大幫助,因爲有很多可能的「其他」結果。 – Bohemian