27

私が行ったほとんどの読書によると、双方向検索アルゴリズムは、「前方」と「後方」のフロンティアが最初に交差したときに終了すると言われています。ただし、 Artificial Intelligence: A Modern Approachのセクション 3.4.6 で、Russel と Norvig は次のように述べています。

双方向検索は、ゴール テストをチェックに置き換えて、2 つの検索のフロンティアが交差するかどうかを確認することで実装されます。もしそうなら、解決策が見つかりました。2 つの検索が両方とも幅優先であっても、最初に見つかった解が最適ではない可能性があることを理解することが重要です。ギャップを横切る近道がないことを確認するために、追加の検索が必要です。

このステートメントについてかなり長い間検討してきましたが、この動作の例を見つけることができません。双方向 BFS または A* 検索の前方フロンティアと後方フロンティアの間の最初の交点が最短経路ではないグラフの例を誰か提供できますか?

編集:明らかに、BFS は加重グラフで最短パスを見つけられません。この抜粋は、無向グラフの双方向 BFS を参照しているようです。または、加重グラフで双方向 A* を使用した反例を見てみたいと思います。

4

4 に答える 4

12

双方向検索の実装方法に関係していると思います。

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 を返します。

これは、ラッセルとノーヴィグが言及しているものだと思います。実装でこのシナリオが考慮されていない場合、最適ではないソリューションが得られる可能性があります。

最適なソリューションを見つけたと判断する前に、同じ「深さ」を持つフロンティア内のすべてのノードの展開を終了する必要があります。または、ノードではなくレイヤーごとに順方向および逆方向の BFS 検索を交互に行うこともできます (レイヤー 0 のすべてのノードを前方に展開し、レイヤー 0 のすべてのノードを後方に展開し、レイヤー 1 のすべてのノードを前方に展開するなど)。

于 2013-01-11T20:17:42.297 に答える
7

これがRusselとNorvigが念頭に置いていたものかどうかはわかりませんが、グラフに重みが付けられている場合(つまり、一部のエッジが他のエッジよりも長い場合)、最短パスには、BFSでより早く検出される別のパスよりも多くのステップが含まれる可能性があります。ステップ数が同じであっても、最良のものが最初に見つからない場合があります。6つのノードを持つグラフを考えてみましょう。

(A-> B)=(A-> C)= 0

(B-> D)= 2

(C-> E)= 1

(D-> F)=(E-> F)= 0

Aから1歩前進し、Fから1歩後退した後、前方フロンティアは{B、C}であり、後方フロンティアは{D、E}です。サーチャーはBを展開します。交差点!(A-> B-> D-> F)= 2.しかし、それでも少し遠くを検索して、(A-> C-> E-> F)の方が優れていることを発見する必要があります。

于 2010-11-23T09:30:48.863 に答える
6

Russell & Norvig 自身が「AIMA」の 2003 年版の 80 ページで述べているように、重み付けされていない (単位コスト) グラフでは、双方向 BFS が交差点に到達したときに最適なソリューションを見つけました。

双方向検索は、一方または両方の検索で各ノードをチェックしてから、それが他の検索ツリーのフリンジにあるかどうかを確認することによって実装されます [ ... ]どちらの検索も幅優先です[.]

(「ノードを拡張する」ことにより、R&N は後続ノードを生成することを意味します。強調が追加されました。)

于 2014-07-27T13:32:01.373 に答える