web-dev-qa-db-ja.com

反復深化と深さ優先探索

反復深化について読み続けていますが、depth-first search

深さ優先の検索はますます深くなることを理解しました。

反復的な深化では、レベルの値を設定します。そのレベルに解決策がない場合は、その値を増やし、最初からやり直します(ルート)。

これは深さ優先検索と同じではないでしょうか?

つまり、解決策が見つかるまで、徐々に深くなっていきます。これは同じものだと思います!私が同じブランチに行くのは、最初からやり直すと以前と同じブランチに行くからです。

35
bb2

深さ優先検索では、グラフのあるノードから開始し、グラフの奥深くまで継続的に探索しながら、まだ到達していない(または解決策が見つかるまで)新しいノードを見つけることができます。 DFSが動きを失ったときはいつでも、最新のポイントに戻って別の選択をすることができ、そこから探索します。グラフが非常に大きく、ソリューションが1つしかない場合、これは深刻な問題になる可能性があります。1つのDFSパスに沿ってグラフ全体を探索し、各ノードを見た後にソリューションを見つけるだけになる可能性があるためです。さらに悪いことに、グラフが無限の場合(たとえば、グラフがすべての数字で構成されている場合など)、検索が終了しない可能性があります。さらに、探しているノードが見つかると、最適なパスが得られない可能性があります(開始ノードのすぐ隣にある場合でも、ソリューション全体をグラフ全体でループしていた可能性があります!)

この問題の潜在的な解決策の1つは、DFSがとる1つのパスの深さを制限することです。たとえば、DFS検索を実行しますが、長さが5を超えるパスを取得した場合は検索を停止します。これにより、開始ノードから5を超える距離のノードは探索されなくなります。またはグラフが極端に密集していない限り、グラフ全体を検索しません。ただし、これは、グラフ全体を必ずしも探索する必要がないため、探しているノードが見つからない可能性があることを意味します。

反復的な深化の背後にある考え方は、この2番目のアプローチを使用することですが、各レベルで深さを増やし続けることです。言い換えると、問題のノードが見つかるまで、長さ1のすべてのパス、次に長さ2のすべてのパス、次に長さ3のすべてのパスを使用して探索することができます。つまり、各パスの長さは各ステップである程度の長さに制限されているため、無限の行き止まりのパスに沿って探索することはありません。また、深さdでノードが見つからなかったが深さd + 1で見つかった場合、長さdのパスはあり得ないため、宛先ノードへの最短パスを見つけることを意味します(または、だから、長さd + 1のパスが実際に最適です。

これがDFSと異なる理由は、終了することなくグラフの周囲を極端に長く回り道をたどる場合には決して実行されないからです。パスの長さは常に上限があるため、不要なブランチを探索することはありません。

これがBFSと異なる理由は、BFSでは、すべてのフリンジノードを一度にメモリに保持する必要があるためです。これはメモリO(bd)、bは分岐係数です。これを、O(d)反復深化によるメモリ使用量と比較します(現在のパス内の各dノードの状態を保持するため)。もちろん、BFSは同じパスを複数回探索しません。 、反復深化は深さ制限を増加させるため、任意のパスを数回探索する可能性がありますが、漸近的には2つは同じランタイムを持ちます。BFSはO(bで終了しますd)すべてのO(bd)距離dのノード。反復深化ではO(bd)レベルごとの時間、合計はO(bd)全体的に、ただし定数係数は高くなります。

要するに:

  • DFSは最適なパスを見つけることを保証されていません。反復的な深化です。
  • DFSは、ターゲットノードを見つける前にグラフ全体を探索できます。反復深化は、開始ノードと終了ノード間の距離がグラフで最大の場合にのみこれを行います。
  • BFSと反復深化は両方ともO(bd)、しかし、反復的な深化には、より高い一定の要因があります。
  • BFSはO(bd)メモリ、反復深化はO(d)のみを使用します。

お役に立てれば!

78
templatetypedef

wikipedia にこれに関するまともなページがあります。

あなたが見逃したと思う基本的な考え方は、反復的な深化は主にヒューリスティックであるということです。解決策がルートの近くで見つかる可能性がある場合、反復深化は比較的高速になりますが、深さ優先の直接検索は「間違った」決定を下し、実りのない深い枝に多くの時間を費やすことができます。

(これは、検索ツリーが無限になる可能性がある場合に特に重要です。この場合、BFSまたは反復深化中にDFSが永久にスタックする可能性があるため、同等ではありません答えが存在する場合はいつか見つけてください)

2
hugomg

既にここにあるものに追加するだけですが、ここにデンバー大学のムービングAIラボの違いを示すビデオがあります。

http://movingai.com/dfid.html

その例では、目標が浅く(ソリューションの深さ3、ツリーの深さ)、ソリューションが右側にある場合に反復的な深化の勝利を確認できますが、ソリューションが最後の行にある場合はDFSが勝利します。

チェスプログラミングについての本を読んで、次は quiescence search について考えていました。AIプログラミングの検索戦略についてもっと知りたいなら、それをチェックしてください。

1
Brett Rudder