web-dev-qa-db-ja.com

幅優先探索と反復深化の違い

私はBFSとDFSを理解していますが、私の一生の間、反復深化とBFSの違いを理解することはできません。どうやら反復深化はDFSと同じメモリ使用量を持っているようですが、BFSのように拡張し続けるため、これがどのように可能であるかがわかりません。誰かが明確にすることができればそれは素晴らしいでしょう。

必要に応じて作業するツリー:

    A
   / \
  B   C
 /   / \
D   E   F
23
theraven

私が理解していることから、反復深化は深さ1までDFSを実行し、次に深さ2までDFSを実行します...深さnまで、というように、レベルがなくなるまで続きます。

例えば、私は木が読まれるだろうと思います

read                   visited               depth

A                      A                     1

ABC                    ABAC                  2

ABDCEF                 ABDBACECF             3

レベルごとに深さ制限を設定して個別のDFSを実行し、メモリを破棄することはほぼ間違いないと思います。

19

アルゴリズムの私の理解から、IDDFS(反復深化深さ優先検索)は、複数回実行される単純な深さ優先検索であり、各反復で検索されるノードのレベルを深めます。したがって、最大深度反復は完全な深さ優先探索であるため、メモリ要件は深さ優先探索と同じです。

したがって、指定したツリーの例では、最初の反復はノードAにアクセスし、2番目の反復はノードA、B、およびCにアクセスし、3番目の反復はツリーのすべてのノードにアクセスします。

このように実装される理由は、検索に時間の制約がある場合、アルゴリズムが、木。

これは、幅優先探索とは異なります。各反復で、幅優先探索ではなく、深さ優先探索の場合と同じようにノードにアクセスするためです。通常、IDDFSアルゴリズムは、各反復で見つかった「最高スコア」ノードを格納する可能性があります。

19
Steven Oxley

メモリ使用量は、任意の時点で保存するノードの最大数です。訪問したノードの数ではありません。

iDFSは、展開しているブランチ内のノードのみを格納する必要があります。Cを展開している場合はAとCのみを格納します(例: BFSは、検索している深度のすべてのノードを保存する必要があります。効果を確認するには、分岐係数が2ではなく8のツリーを使用します。深さ3まで検索するには、BFSは大規模な64ノードを格納する必要があります。 IDFSに必要なのは3つだけです。

4
Aruna Herath

反復深化検索の各反復では、制限があり、DFSアプローチを使用してグラフを走査しますが、各反復の各ステップで、ルートから深さdまでのパス内のノードのみを追跡する必要があります。 。それがメモリの節約です。

たとえば、下の画像の最後の行を見てください。 BFSを使用した場合、深さ2までのすべてのノードを追跡する必要がありました。ただし、DFSを使用しているため、一部のノードがすでにアクセスされているため、すべてのノードをメモリに保持する必要はありません。それらが必要であるか、まだ訪問していないので、後で追加します。ルートへのパス(灰色のパス)を保持するだけです。

enter image description here

写真はPeterNorvigとStuartRusselによるArtificialIntelligenceの本からのものです

3
Iman Mirzadeh