停止双向Dijkstra(或统一成本搜索)算法的标准

据我所知,双向Dijkstra搜索(具有单个启动和终端状态)的停止标准如下

从变量mu = infinity开始
从开始和终端状态开始搜索(t)
当两者相交时(我们当前正在从前向搜索中查看的节点是反向搜索,反之亦然)在节点w处,然后重新计算mu为

mu = distance(s,w) + distance(w,t)

然后检查前两个节点(下一个要检查的节点)是否具有组合距离> = mu,如果是,则终止

if distance(s, top_forward_node) + distance(top_reverse_node, t) >= mu, stop

但如果我在一个简单的三角形上尝试这个,它就会失败.假设我有一个三角形(a,b,c),ab = 10,bc = 6,ac = 7.开始状态= a,终端状态= b.显然,最短距离是ab = 10.但是前向传递从a开始并且看着b(10)和c(7),反向传递从b开始并且看a(10)和c(6).由于c是具有最低成本的节点,因此正向传递查看c,但由于它不在已经查看的反向节点中,因此它存储它并移动到反向传递.反向传递查看c并看到它位于前向传递所查看的节点中,并将mu值从无穷大更新为7 6.要查看的下一个节点是b和a,每个路径的成本为10 ,但是如果我只是添加两个(10 10),我得到的值为20,即> = 7 6,所以我的算法错误地终止了acb的路径.我哪里错了?

forward pass explored nodes = [a(0)]
reverse pass explored nodes = [b(0)]
forward pass frontier nodes = [c(7), b(10)]
reverse pass frontier nodes = [c(6), a(10)]

从前向传递边界节点探索c(7).它是在反向传递探索节点吗?不,请继续

forward pass explored nodes = [a(0), c(7)]
forward pass frontier nodes = [b(10)]

从反向传递边界节点探索c(6).它是在前向探测节点吗?是.重新计算亩

mu = distance(a,c) + distance(c,b) = 6 + 7 = 13
reverse pass explored nodes = [b(0), c(6)]
reverse pass frontier nodes = [a(10)]

检查终止

top_node(forward pass frontier nodes) + top_node(reverse pass frontier nodes) >= mu
10 + 10 > 13?

是.返回路径a-c-b

参考:http://www.cs.princeton.edu/courses/archive/spr06/cos423/Handouts/EPP%20shortest%20path%20algorithms.pdf上的幻灯片10

这个答案对我没有帮助:Termination Criteria for Bidirectional Search

最佳答案 我弄清楚我哪里出错了.在检查我是否与相反的搜索相交时,我应该检查边界和探索节点,而不仅仅是探索节点.这样做会得到正确的结果.

点赞