【问题标题】:Termination Criteria for Bidirectional Search双向搜索的终止条件
【发布时间】:2011-05-14 07:06:54
【问题描述】:

根据我所做的大部分阅读,双向搜索算法据说在“前向”和“后向”边界首次相交时终止。然而,在人工智能:现代方法的第 3.4.6 节中,Russel 和 Norvig 指出:

双向搜索是通过将目标测试替换为检查来实现的 两次搜索的边界是否相交;如果他们这样做了,那么已经找到了解决方案。 重要的是要认识到找到的第一个解决方案可能不是最优的,即使 两次搜索都是广度优先的;需要进行一些额外的搜索以确保存在 不是跨越鸿沟的捷径。

我已经考虑了这个说法很长一段时间,但我找不到这种行为的例子。谁能提供一个示例图,其中双向 BFS 或 A* 搜索的前向和后向边界之间的第一个交点不是最短路径?

编辑:显然 BFS 不会在加权图中找到最短路径。听起来这段摘录是指无向图上的双向 BFS。或者,我有兴趣在加权图上查看使用双向 A* 的反例。

【问题讨论】:

  • 这个答案stackoverflow.com/a/35782623/2966723 详细说明了如何做到这一点(通过算法逐步了解这种行为的示例)。短版:它会做一些额外的工作来跟踪即将到来的候选最短路径。当两者最终相交时,可以确定候选最短路径是最优的,但它可能不是算法相交的路径。

标签: algorithm search graph breadth-first-search bidirectional


【解决方案1】:

我认为这与双向搜索的实现方式有关。

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 层中的所有节点等)

【讨论】:

    【解决方案2】:

    我不知道这是否是 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) 更好。

    【讨论】:

    • 这绝对是正确的,因为 BFS 会找到最短长度而不是最低成本的路径,但它并不是 BFS 的双向实现所独有的。对于加权图,我有兴趣找到双向 A* 的反例。无论如何,为深思熟虑的评论 +1。
    • @Michael Koval:我认为我给出的加权图适用于双向 A*(为了安全起见,我们可以将 A->{} 和 {}->F 权重增加到 1) . WLOG 我们可以假设搜索会扩展 A 和 F,然后是 B。
    • 你是对的......很抱歉错过了这一点。似乎双向 A* 在交叉节点扩展时终止,而不是在边界相遇时终止。感谢您的补充说明!但是,我仍然很好奇,什么时候这可能发生在带有 BFS 的未加权图中。
    【解决方案3】:

    在未加权(单位成本)图中,双向 BFS 在到达交叉点时找到了最佳解决方案,正如 Russell 和 Norvig 自己在 2003 年版“AIMA”的第 80 页上所说:

    双向搜索是通过一个或两个搜索在每个节点展开之前检查每个节点来实现的,以查看它是否在另一个搜索树的边缘 [...] 该算法是完整且最优的(对于统一的步骤成本),如果两个搜索都是广度优先的[.]

    (通过“扩展一个节点”,R&N是指生成后继者。强调。)

    【讨论】:

      【解决方案4】:

      一个简单的三角形将满足您的条件,边为 6,6,10,最佳路径通过长度为 10 的段。在双向中,算法向前搜索较短的路径,然后反向也将采用较短的路径,他们会相遇,找到一条完整的路径

      但显然 6 + 6 的 2 段比长度为 10 的段差。

      【讨论】:

        猜你喜欢
        • 2019-06-23
        • 1970-01-01
        • 1970-01-01
        • 2016-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-22
        相关资源
        最近更新 更多