我正在寻找Java中Dijkstra(或任何其他源到目的地最短路径算法)的双向搜索(a.k.a。“在中间相遇”算法)的实现。
由于双向搜索处理比看起来更复杂(Graph Algorithms, p.26),我想在重新发明轮子之前考虑现有的实现!
P.S。:我在谈论bidirectional search,不要与双向图混淆)
以下是一个棘手的图表示例:
答案 0 :(得分:5)
在双向Dijkstra算法中,您实际上维护了两个" Dijkstra算法":前向搜索和后向搜索。现在,前向搜索类似于单向Dijkstra算法。然而,向后搜索在"反转"时尚。如果存在有向边(通俗地称为弧) (u, v)
,则前向搜索将从 u
到 v
,而向后搜索会在相反的方向上做同样的事情。
因为两个搜索进程(通常)在源节点和目标节点之间的某个地方相遇,我们需要另一个终止条件,在双向Dijkstra算法中
g(top(OPEN_forward)) + g(top(OPEN_backward)) > l
其中 l
是源节点和目标节点之间迄今为止已知最短路径的长度。
您可能只在双向版本中看到的其他代码正在检查是否有可能缩短最短路径候选每时间,您可以改善任何节点的 g
值。 (节点 g
的 u
值是距离搜索开始的节点 u
即可。)