【发布时间】: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