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

时间:2017-02-03 01:08:23

标签: algorithm search dijkstra bidirectional

根据我的理解,停止标准对于双向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

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

1 个答案:

答案 0 :(得分:2)

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