根据我所做的大部分阅读,当“向前”和“向后”边界首次相交时,称双向搜索算法终止。但是,在人工智能:现代方法的第3.4.6节中,Russel和Norvig说:
双向搜索是通过用支票替换目标测试来实现的 两个搜索的边界是否相交;如果他们这样做,就找到了解决方案。 重要的是要意识到找到的第一个解决方案可能不是最佳的,即使是 两次搜索都是广度优先的;需要一些额外的搜索来确保那里 并不是跨越差距的捷径。
我已经考虑过这段话很长一段时间了,但我找不到这种行为的例子。任何人都可以提供一个示例图,其中双向BFS或A *搜索的前向和后向边界之间的第一个交叉点不是最短路径吗?
编辑:显然,BFS无法在加权图表中找到最短路径。听起来这段摘录指的是无向图上的双向BFS。或者,我有兴趣在加权图上看到使用双向A *的反例。
答案 0 :(得分:7)
我认为这与双向搜索的实施方式有关。
BFS的伪代码如下:
until frontier.empty?
node <- frontier.pop()
add node to explored
for each child not in expored or frontier:
if child is goal then
return path
add child to frontier
想象一下实现这样的双向搜索:
until frontierForward.emtpy? or frontierBackward.empty?
node <- frontierForward.pop()
add node to exploredForward
for each child not in exporedForward or frontierForward:
if child in frontierBackward then
return pathForward + pathBackward
add child to frontierForward
Do something similar but now searching backwards
基本上,“前进”BFS和“后退”BFS的交替步骤。现在想象一下这样的图:
B-C-D
/ \
A E
\ /
F - G
BFS的第一次前进和后退将给我们这样一个状态:
1) expandedForward = A ; frontierForward = B, F
2) expandedBackward = E ; frontierBackward = D, G
现在算法选择下一个节点从前沿扩展并选择B.
3) expandedForward = A, B ; frontierForward = F, C
现在我们向后运行BFS并展开节点D.D的孩子C在前沿,所以我们返回路径A - B - C - D - E.
我认为这就是Russel和Norvig所指的。如果实现不考虑这种情况,它可能会给你一个不是最佳的解决方案。
在决定找到最佳解决方案之前,它应该完成扩展边界中具有相同“深度”的所有节点。或者可以按层而不是按节点交替前向和后向BFS搜索(向前展开第0层中的所有节点,向后展开第0层中的所有节点,向前展开第1层中的所有节点等)
答案 1 :(得分:6)
在未加权(单位成本)图表中,双向BFS在遇到交叉点时找到了最佳解决方案,如Russell&amp; Norvig本身在2003年版“AIMA”的第80页上声明:
双向搜索是通过让一个或两个搜索在扩展之前检查每个节点以查看它是否在另一个搜索树的边缘来实现的[...]算法完整且最优(如果两个搜索都是广度优先[。]
,则为统一步骤费用
(通过“扩展节点”,R&amp; N意味着生成后继者。强调增加。)
答案 2 :(得分:5)
我不知道这是否是Russel和Norvig的想法,但如果图表是加权的(即某些边缘比其他边缘长),最短路径可能比另一个可以在BFS中找到的。即使步数相同,也可能不会先找到最好的步骤;考虑一个包含六个节点的图表:
(A-> B)=(A-> C)= 0
(B-> D)= 2
(C-> E)= 1
(D-> F)=(E-> F)= 0
从A前进一步,从F后退一步后,前沿为{B,C},后向前沿为{D,E}。搜索者现在扩展B和嘿!路口! (A-> B-> D-> F)= 2.但它仍然应该进一步搜索(A-> C-> E-> F)更好。