【问题标题】:Dijkstra's bi-directional implementationDijkstra 的双向实现
【发布时间】:2021-08-13 07:40:23
【问题描述】:

我正在实现一个双向 Dijkstra 算法,但在理解停止条件的各种实现如何发挥作用时遇到问题。

以此图为例,我们从节点 A 开始,以节点 J 为目标。在图下方,我列出了算法停止时的集群(已处理)和松弛(边缘)节点:

“Bidirectional Dijkstra” by NetworkX 接受的答案解释说,当在两个方向上处理相同的节点时,算法停止。在我的图中,将是节点 F。如果是这种情况,算法会在找到从 A-B-C...H-I-J 开始的长度为 9 的最短路径后停止。但这不会是最短路径,因为 A-J 有一条长度为 8 的直接边,它永远不会被采用,因为权重 8 永远不会从优先级队列中弹出。

即使在 Dijksta 的双向算法的this Java implementation on github 中,停止条件是:

double mtmp = DISTANCEA.get(OPENA.min()) +
                          DISTANCEB.get(OPENB.min());            
if (mtmp >= bestPathLength) return PATH;

当顶部节点权重(来自每个前向和后向队列)的总和至少达到迄今为止的最佳路径长度时,该算法将停止。但这也不会返回正确的最短路径。因为在这种情况下,节点 G(6) 和 E(5) 的总和为 11,大于迄今为止长度为 9 的最佳路径。

我不明白这两种停止条件似乎都会产生不正确的最短路径。我不确定我误解了什么。

Dijkstra 的双向算法的良好停止条件是什么?另外,双向 A* 的停止条件是什么?

【问题讨论】:

    标签: algorithm graph-algorithm dijkstra a-star bidirectional-search


    【解决方案1】:

    从概念上讲,无论是否双向,Dijkstra 算法的停止条件是,当您找到的最佳路径与继续下去时可能找到的任何路径一样好时,您就会停止。只有封闭路径(上述“集群”集中的路径)才算找到。

    对于双向 Dijkstra,只要在正向和反向封闭集中都存在相同的顶点,就会“找到”路径。这部分很简单,但是您将来可能找到的最佳路径有多好?

    为确保您得到的答案是正确的,您对可能找到的最佳路径的评估需要准确或低估。让我们考虑一下可能性:

    1. 路径可能由双向开放的顶点构成。
    2. 在一个方向上打开的顶点可能会与另一个方向上已经关闭的顶点形成一条路径。

    问题是情况(2)。我们用于 Dijkstra 算法的集合和优先级队列允许我们在这种情况下对最佳路径进行非常有用的低估。闭集的最小距离总是0,如果我们把它加到从另一个方向开的最小距离上,那么我们得出:

    double mtmp = min ( DISTANCEA.get(OPENA.min()) , DISTANCEB.get(OPENB.min()) );
    

    这个有效,并且会产生正确的答案,但它会使算法运行,直到在至少一个方向上找到最佳完整路径。在许多情况下,单向 Dijkstra 会更快。

    我认为这种“双向 Dijkstra 的”想法需要大量修改才能真正做到出色。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      相关资源
      最近更新 更多