[英]Interpreting Dijkstra's Algorithm
我理解如何找到Dijkstra算法所解释的从开始到结束的最短路径,我不明白的是解释。 在这里,从图片中的图表,从A到E添加到我的已知集合的顺序是A,C,B,D,F,H,G,E
我得不到的是,如何获得从A到A的路径E如图所示(数学方面)
每个节点都有一个父节点。 当你到达'E'
,你只需看看它的父母,依此类推,直到找到'A'
。 这样您就可以按相反的顺序找到列表。 将列表反转以查找从'A'
到'E'
的路径。
如果您按顺序追加,您的父母列表将为'E' 'G' 'H' 'F' 'B' 'A'
。
注意:“父节点”是表的“路径”列中指示的节点
考虑包含要遍历的路径的最小优先级队列,其中路径在队列上的优先级是遍历从根到包括该边的路径中的边的成本。 在算法的每个步骤中,从队列中弹出最低成本路径,并考虑其每个事件边缘,使用该事件边缘扩展路径,并按优先级顺序将新路径推回到队列中。 重复,直到第一条路径到达目的地。
例如:
<>
A
,将所有事件边缘( A->B
, A->C
和A->D
为成本2,1和4)放入队列并按优先级排序: <(A->C,1),(A->B,2),(A->D,4)>
A->C
,然后考虑事件到路径C
末尾的边缘,并将这些路径推回队列(保持优先级顺序): <(A->B,2),(A->D,4),(A->C->A,10),(A->C->E,12)>
A->B
off并扩展具有入射边缘的路径: <(A->D,4),(A->B->F,4),(A->B->C,7),(A->C->A,10),(A->B->E,12),(A->C->E,12)>
A->D
并推动更多的入射边缘: <(A->B->F,4),(A->D->C,6),(A->B->C,7),(A->C->A,10),(A->B->E,12),(A->C->E,12)>
A->B->F
并推动更多的入射边缘: <(A->D->C,6),(A->B->C,7),(A->B->F->H,7),(A->C->A,10),(A->B->E,12),(A->C->E,12)>
A->D->C
- 但是,我们已经以较低的成本路径到达C
,因此可以忽略它。 A->B->C
并忽略它。 A->B->F->H
并推动更多的入射边缘: <(A->B->F->H->G,8),(A->C->A,10),(A->B->E,12),(A->C->E,12)>
A->B->F->H
并推动更多的入射边缘: <(A->B->F->H->G->F,10),(A->C->A,10),(A->B->F->H->G->E,11),(A->B->E,12),(A->C->E,12)>
A->B->F->H->G->F
并忽略它。 A->C->A
并忽略它。 A->B->F->H->G->E
,我们达到了目标(成本为11)! 从起始节点开始,在将图形遍历到可用节点时进行累积权重计算。 将从一个节点到相邻节点的累积权重与任何先前结果(即,到该节点的可能遍历)进行比较。 然后选择具有最低累积权重的路线作为“赢家”。 重复该过程,直到找到从开始到终端节点的路径并评估为最低累积权重。
所以在示例中您已经显示:
ABFHGE是从开始到结束时剩余的唯一路径(在有向图内),最低累积权重为11(也是最长路径)。
当你从头开始计算时,一些路径最初可能看起来更短(AC),但随着算法的进展,这些选择被放弃,因为探索了从A到E的所有路径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.