【问题标题】:Interpreting Dijkstra's Algorithm解释 Dijkstra 算法
【发布时间】:2015-04-20 18:33:09
【问题描述】:

我了解如何找到 Dijkstra 算法所解释的从头到尾的最短路径,但我不明白的是解释。在这里,从图中的图中,从A到E添加到我已知集合的顺序是A,C,B,D,F,H,G,E我没有得到的是,如何获得从A到E的路径如图所示(数学方面)

【问题讨论】:

  • 提示:首先,找到从 E 到 A 的路径。然后将其反转。
  • @Kevin:这是一个有向图,所以从 E 到 A 的路径实际上并不是从 A 到 E 的路径的反向(并且问题中显示的计算无助于构造从 E 到 A 的路径)。因此,您提出的提示是不正确的。

标签: java algorithm dijkstra


【解决方案1】:

每个节点都有一个父节点。当您到达'E' 时,您只需查看其父代,依此类推,直到找到'A'。这样,您会以相反的顺序找到列表。反转列表以找到从'A''E' 的路径。

如果您按顺序添加,您的父级列表将为'E' 'G' 'H' 'F' 'B' 'A'

注意:“父节点”是表的“路径”列中指示的节点

【讨论】:

  • 加一。请注意,“父节点”是表的“路径”列中指示的节点。
  • 正如@ruakh 在 cmets 中所指出的,这是一个有向图,因此从 E 到 A 的路径与从 A 到 E 的路径不同。在您的示例中,实际上没有路径从 G 到 H,所以这不起作用。例如,从 E 到 G 的权重与从 G 到 E 的权重不同。
【解决方案2】:

考虑一个包含要遍历的路径的最低优先级队列,其中路径在队列上的优先级是遍历路径中从根到并包括该边的边的成本。在算法的每个步骤中,从队列中弹出成本最低的路径,并考虑其每个入射边,使用该入射边扩展路径,并将新路径按优先级顺序推回队列。重复直到第一条路径到达目的地。

例如:

  1. 从一个空队列开始<>
  2. 然后,从根A 开始,将所有事件边(A->BA->CA->D,成本分别为 2、1 和 4)放入队列并按优先级排序:<(A->C,1),(A->B,2),(A->D,4)>
  3. 从队列的前面弹出最小优先级路径A->C,然后考虑到路径末尾的边缘C,并将这些路径推回队列(保持优先级顺序):<(A->B,2),(A->D,4),(A->C->A,10),(A->C->E,12)>
  4. 重复,弹出最小优先级路径A->B 并扩展具有事件边缘的路径:<(A->D,4),(A->B->F,4),(A->B->C,7),(A->C->A,10),(A->B->E,12),(A->C->E,12)>
  5. 继续...弹出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)>
  6. 弹出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)>
  7. pop A->D->C - 但是,我们已经以较低成本的路径到达 C,因此可以忽略它。
  8. 弹出A->B->C 并忽略它。
  9. 弹出A->B->F->H 并推送更多事件边缘:<(A->B->F->H->G,8),(A->C->A,10),(A->B->E,12),(A->C->E,12)>
  10. 弹出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)>
  11. 弹出A->B->F->H->G->F 并忽略它。
  12. 弹出A->C->A 并忽略它。
  13. 弹出A->B->F->H->G->E,我们已经达到目标(成本为 11)!

【讨论】:

    【解决方案3】:

    从起始节点开始,在遍历图到可用节点时进行累积权重计算。从一个节点到相邻节点的累积权重与任何先前的结果(即可能遍历该节点)进行比较。然后选择具有最低累积权重的路线作为“获胜者”。重复该过程,直到找到从起点到终点节点的路径,并将其评估为最低累积权重。

    所以在你展示的例子中:

    • ACE = 12
    • ADCE = 17
    • ABE = 12

    ABFHGE 是唯一的左侧路径(在有向图中),从开始到结束的累积权重最低为 11(也是最长的路径)。

    当您从一开始计算时,一些路径最初可能看起来更短 (AC),但随着算法的进展,这些选择被放弃,因为探索了从 A 到 E 的所有路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 2021-03-13
      • 2011-06-27
      • 2021-07-10
      • 1970-01-01
      相关资源
      最近更新 更多