Java 解读Dijkstra';s算法
Java 解读Dijkstra';s算法,java,algorithm,dijkstra,Java,Algorithm,Dijkstra,我理解如何找到从开始到结束的最短路径,正如Dijkstra算法所解释的,我不理解的是解释。在这里,从图中的图形来看,从A到E添加到已知集合的顺序是A、C、B、D、F、H、G、E我没有得到的是,如何获得从A到E的路径,如图中所示(数学方面)每个节点都有一个父节点。当您到达'E'时,您只需查看它的父对象,依此类推,直到找到'A'。这样,您将以相反的顺序找到列表。颠倒列表,找到从'A'到'E'的路径 如果您按顺序追加,您的父列表将是'E''G''H''F''B''A' 注意:“父节点”是表的“路径”列
我理解如何找到从开始到结束的最短路径,正如Dijkstra算法所解释的,我不理解的是解释。在这里,从图中的图形来看,从A到E添加到已知集合的顺序是
A、C、B、D、F、H、G、E
我没有得到的是,如何获得从A到E的路径,如图中所示(数学方面)每个节点都有一个父节点。当您到达'E'
时,您只需查看它的父对象,依此类推,直到找到'A'
。这样,您将以相反的顺序找到列表。颠倒列表,找到从'A'
到'E'
的路径
如果您按顺序追加,您的父列表将是'E''G''H''F''B''A'
注意:“父节点”是表的“路径”列中指示的节点考虑包含要遍历的路径的最小优先级队列,其中队列上的路径优先级是遍历从根到该边的路径中的边的成本。在算法的每个步骤中,从队列中弹出成本最低的路径,并考虑其每个事件边,使用该事件边扩展路径,并按优先级顺序将新路径推回到队列中。重复此操作,直到第一条路径到达目标 例如:
A
开始,将所有事件边(A->B
、A->C
和A->D
,成本分别为2、1和4)放入队列并按优先级排序:C,1)、(A->B,2)、(A->D,4)>
A->B
并扩展带有事件边的路径:D,4)、(A->B->F,4)、(A->B->C,7)、(A->C->A,10)、(A->B->E,12)、(A->C->E,12)>
A->D
并推送更多事件边缘: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
并推送更多事件边缘: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
并推送更多事件边缘:B->F->H->G,8)、(A->C->A,10)、(A->B->E,12)、(A->C->E,12)>
A->B->F->H
并推送更多事件边缘: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)李>
从开始节点开始,在将图形遍历到可用节点时进行累积权重计算。将从一个节点到相邻节点的累积权重与任何先前结果(即,到该节点的可能遍历)进行比较。然后选择累积重量最低的路线作为“赢家”。该过程将重复,直到找到从起始节点到终端节点的路径并将其计算为最低累积权重 因此,在您展示的示例中:
- ACE=12
- ADCE=17
- ABE=12
当您从一开始计算时,一些路径最初看起来可能较短(AC),但随着算法的进行,这些选择将被放弃,因为从A到E的所有路径都将被探索。提示:首先,找到从E到A的路径,然后将其反转。@Kevin:这是一个有向图,因此,从E到A的路径实际上并不是从A到E的路径的倒数(问题中显示的计算无助于构建从E到A的路径)。所以你的提示,正如所呈现的,是不正确的。请注意,“父节点”是表的“路径”列中指示的节点。正如@ruakh在注释中所指出的,这是一个有向图,因此从E到a的路径与从a到E的路径不同。在您的示例中,实际上没有从G到H的路径,因此不起作用。此外,例如,从E到G的重量与从G到E的重量不同。