您在具有坐标的网格上有一个具有6个顶点的图形:
A ( 0,0)
B ( 4,7)
C ( 7,4)
D (10,4)
E (16,2)
F (16,0)
您可以在这些顶点上生成一个完整的图,并为每个边分配一个成本,其中,成本是MAX( ABS( x1 - x2 ), ABS( y1 - y2 ) )
标准边,虫洞的成本是0。
这将为您带来成本(作为邻接矩阵):
A B C D E F
- -- -- -- -- -- --
A - 7 7 10 16 16
B 7 - 0 6 12 12
C 7 0 - 3 9 9
D 10 6 3 - 0 6
E 16 12 9 0 - 2
F 16 12 9 6 2 -
如果存在单向扭曲,则仅在图形(或邻接矩阵)中创建沿该方向而不是相反的边。
然后,您可以将Dijkstra的算法与优先级队列一起使用。
从A
每个相邻的边缘开始并将其推入优先级队列:
格式:(路径:费用)
queue = [ (A-B : 7), (A-C : 7), (A-D : 10), (A-E : 16), (A-F : 16) ]
将项目推入队列时-跟踪每个顶点的最低成本,并且仅在路径成本低于现有最低成本时才将路径推入队列。
min-costs = { A: 0, B: 7, C: 7, D: 10, E: 16, F: 16 }
从队列中删除第一项,如果其成本仍与最低成本匹配,则将由该路径及其相邻边形成的所有复合路径推回到优先级队列中(如果复合路径的成本低于现有的最低成本):
去掉: (A-B : 7)
- 尝试
(A-B-A : 14)
-拒绝支付更高的费用
- 尝试
(A-B-C : 7)
-拒绝相同费用
- 尝试
(A-B-D : 13)
-拒绝支付更高的费用
- 尝试
(A-B-E : 19)
-拒绝支付更高的费用
- 尝试
(A-B-F : 19)
-拒绝支付更高的费用
去掉 (A-C : 7)
- 尝试
(A-C-A : 14)
-拒绝支付更高的费用
- 尝试
(A-C-B : 7)
-拒绝相同费用
- 尝试
(A-C-D : 10)
-拒绝相同费用
- 尝试
(A-C-E : 16)
-拒绝相同费用
- 尝试
(A-C-F : 16)
-拒绝相同费用
去掉 (A-D : 10)
- 尝试
(A-D-A : 20)
-拒绝支付更高的费用
- 尝试
(A-D-B : 16)
-拒绝支付更高的费用
- 尝试
(A-D-C : 13)
-拒绝支付更高的费用
- 尝试
(A-D-E : 10)
-插入队列
- 尝试
(A-D-F : 16)
-拒绝相同费用
现在,队列将如下所示:
queue = [ (A-D-E : 10), (A-E : 16), (A-F : 16) ]
min-costs = { A: 0, B: 7, C: 7, D: 10, E: 10, F: 16 }
去掉 (A-D-E : 10)
- 尝试
(A-D-E-A : 26)
-拒绝支付更高的费用
- 尝试
(A-D-E-B : 22)
-拒绝支付更高的费用
- 尝试
(A-D-E-C : 19)
-拒绝支付更高的费用
- 尝试
(A-D-E-D : 10)
-拒绝相同费用
- 尝试
(A-D-E-F : 12)
-插入队列
那么队列是:
queue = [ (A-D-E-F : 12), (A-E : 16), (A-F : 16) ]
min-costs = { A: 0, B: 7, C: 7, D: 10, E: 10, F: 12 }
删除(A-D-E-F : 12)
,发现到达目的地节点的成本为12。
注:路径(A-B-C-D-E-F)
,(A-C-D-E-F)
并且(A-D-E-F)
都有12相同的最低成本。