グラフ検索とツリー検索の違いは何ですか?


回答:


176

既存の回答から判断すると、この概念については多くの混乱があるようです。

問題は常にグラフです

ツリー検索とグラフ検索の違いは、問題のグラフがツリーであるか一般的なグラフであるかに関係しません。一般的なグラフを扱っていると常に想定されています。違いは、グラフ状またはツリー状のグラフを検索するために使用されるトラバーサルパターンにあります

ツリー状の問題を処理している場合、両方のアルゴリズムのバリエーションは同等の結果を導きます。したがって、より単純なツリー検索バリアントを選択できます。

グラフ検索とツリー検索の違い

基本的なグラフ検索アルゴリズムは次のようになります。開始ノードstart、有向エッジ、successorsおよびgoalループ条件で使用される仕様。open現在検討中のオープンリストであるノードをメモリに保持します。次の疑似コードは、すべての側面で正しくないことに注意してください(2)。

ツリー検索

open <- []
next <- start

while next is not goal {
    add all successors of next to open
    next <- select one node from open
    remove next from open
}

return next

の実装方法に応じてselect from open、深さ優先検索(DFS)(最新の要素を選択)、幅優先検索(BFS)(最も古い要素を選択)、均一コスト検索(パスコストが最も低い要素を選択)など、さまざまな種類の検索アルゴリズムを取得します。 )、最も低いコストにヒューリスティック値を加えたノードを選択することによる、人気のあるAスター検索など。

上記のアルゴリズムは、実際にはツリー検索と呼ばれています。開始状態をルートとする複数の有向パスがある場合、根本的な問題のグラフの状態を複数回訪問します。有向ループ上にある場合、状態を何度も訪問することも可能です。ただし、各訪問は、検索アルゴリズムによって生成されたツリーの異なるノードに対応しています。後で説明するように、この明らかな非効率性が必要になる場合があります。

グラフ検索

見てきたように、ツリー検索は州を複数回訪れることができます。そのため、この状態の後に見つかった「サブツリー」を数回探索します。グラフ検索は、閉じたリストですべての訪問済み状態を追跡することにより、これを修正します。新しく見つかった後継nextがすでにわかっている場合は、開いているリストに挿入されません。

open <- []
closed <- []
next <- start

while next is not goal {
    add next to closed
    add all successors of next to open, which are not in closed 
    remove next from open
    next <- select from open
}

return next

比較

すべての訪問状態を追跡するため、グラフ検索にはより多くのメモリが必要です。これは、オープンリストが小さいことで補われる場合があり、検索効率が向上します。

最適なソリューション

実装のいくつかの方法は、select最適なソリューションを返すことを保証できます-つまり、最短パスまたは最小コストのパス(コストがエッジに接続されているグラフの場合)。これは基本的に、コストが増加する順にノードが展開される場合、またはコストがゼロ以外の正の定数である場合に当てはまります。この種の選択を実装する一般的なアルゴリズムは、均一コスト検索、またはステップコストが同一の場合はBFSまたはIDDFSです。IDDFSは、BFSの積極的なメモリ消費を回避し、ステップサイズが一定である場合、通常、無知の検索(別名ブルートフォース)に推奨されます。

A *

また、(非常に人気のある)A * ツリー検索アルゴリズムは、許容ヒューリスティックと共に使用すると最適なソリューションを提供します。ただし、A * グラフ検索アルゴリズムは、一貫性のある(または「単調な」)ヒューリスティック(許容よりも強い条件で使用した場合にのみ、この保証を行います。

(2)疑似コードの欠陥

簡単にするために、提示されたコードは以下を行いません:

  • 失敗した検索を処理します。つまり、解決策が見つかる場合にのみ機能します

1
いい答えだね!木の形の問題の意味を詳しく説明できますか?また、完全な全探索ではなく、アルゴリズムが移動したパスを格納して目標に到達することをどのように提案しますか?
Brian

1
@ブライアンのツリー型の問題は、検索しているグラフがツリーであることを意味します。2番目の質問については、これは問題によって異なります。1つの可能性は、可能であれば、ノードへのパスを展開された各ノードと一緒に格納することです。
ziggystar 2013

5
「単一の状態」は、ノードではなくツリー検索によって複数回訪れることができると言うのがより正式です。検索ツリー内のすべてのノードは、状態空間グラフに沿った単一のパスに対応し、ツリー検索によって最大で1回アクセスされるためです。(これは、深さの制限を増やしてツリーをトラバースする反復深化検索には当てはまりませんが、その場合、すべての反復ですべてのノードが一度だけアクセスされます)
Nader Ghanbari

1
@NaderhadjiGhanbari トラバーサルグラフとは対照的に、基になる問題のグラフの頂点に適しているかどうstatenodeは、コンテキストに依存します。しかし、問題のグラフの頂点とトラバーサルグラフに使用すると、回答の明確さを確実に向上させることができます。すぐ書き直してみます。ありがとうございました。statenode
ziggystar 2013年

TL; DR:グラフ検索は閉じたデータ構造を使用していますが、ツリー検索は使用していません。
しんぞう2017

7

ツリーはグラフの特殊なケースであるため、一般的なグラフで機能するものはすべてツリーで機能します。ツリーは、ノードの各ペア間に正確に1つのパスがあるグラフです。これは、以前の回答で述べたように、サイクルが含まれていないことを意味しますが、サイクルのない有向グラフ(DAG、有向非巡回グラフ)は必ずしもツリーではありません。

ただし、グラフにツリーやDAGなどの制限があることがわかっている場合は、通常、制限のないグラフよりも効率的な検索アルゴリズムを見つけることができます。たとえば、ツリー上でA *またはその非ヒューリスティックな「ダイクストラのアルゴリズム」を使用することはおそらくあまり意味がありません(とにかく選択するパスが1つだけあり、DFSまたはBFSで見つけることができます)またはDAG(トポロジーソートで取得した順序で頂点を検討することで最適なパスを見つけることができます)

無向対指向については、無向グラフからエッジ(リンク、遷移)がある場合に向かう一つのルールに従う、すなわちケース」の特別な場合であるUVはエッジからもあるVU

更新:グラフ自体の構造ではなく、検索のトラバーサルパターンが重要な場合、これは答えではないことに注意してください。たとえば、@ ziggystarの回答を参照してください。


うーん、質問のコンテキストは完全には明確ではありませんが、あなたの答えを見てもう一度見直すと、@ ziggystar、A *とAIの言及があなたが正しいかもしれないことを示していると私は感じています、そして私の答え文脈外。「木を探す」を「木を探す」と解釈しました。「ツリー状のトラバーサルパターンを使用して一般的なグラフを検索する」ことは、あなたの答えが意味することではありません。
njlarsson 2013年

@njlarsson私はあなたの言い換えを私の答えに含めました。明確にするのに役立ちます。
ziggystar 2013年

回答にこのメモを追加しました。私の答えは、レイハヌールラーマンが何を求めていたのかについての文脈から外れていても、Googleなどを介してここで道を見つける多くの人々にとって正しい答えだと思います。
njlarsson 2013年

多くの学生が検索アルゴリズムの学習に苦労しているのを見てきましたが、あなたの答えはそれらを誤解させるだけです。
Nader Ghanbari、2013年

1
答えは検索アルゴリズムについてもですが、投稿者が求めたものではないことは事実です。回答の「更新」を参照してください–私は2014年3月に質問を誤解していることに気付きました。回答を削除しない理由は、検索でここに来た人にとっても役立つ可能性があるためです。
njlarsson 2017年

3

グラフとツリーの唯一の違いはサイクルです。グラフにはサイクルを含めることができますが、ツリーには含めることができません。したがって、ツリーに検索アルゴリズムを実装する場合は、サイクルの存在を考慮する必要はありませんが、任意のグラフを操作する場合は、それらを考慮する必要があります。サイクルを処理しない場合、アルゴリズムは最終的に無限ループまたは無限再帰に陥る可能性があります。

もう1つ考えなければならない点は、処理するグラフの方向特性です。ほとんどの場合、各エッジで親子関係を表すツリーを扱います。DAG(有向非循環グラフ)も同様の特性を示します。ただし、双方向のグラフは異なります。双方向グラフの各エッジは、2つの近傍を表します。したがって、これらの2種類のグラフでは、アルゴリズムによるアプローチが少し異なるはずです。


3
これに追加するには、本当にツリーがある場合、A *で重複検出を行う必要はありません。ただし、最終的なパスを抽出する方法がまだ必要であるため、まだ閉じたリストがある可能性があります。
ネイサンS.

通常の用語では、ツリーは任意の2つの頂点間に最大1つのパスを持つ有向グラフです。つまり、グラフとツリーには、有向とパスの一意性という2つの違いがあります。DAGで動作するアルゴリズムはサイクルをチェックする必要がなく、ツリーで動作するアルゴリズムは重複をチェックする必要がありません。
thiton

1
用語はさまざまですが、木は必ずしも指示されているとは限りません。以下のために根ざした一つのノードがルートに指定されている場合、ツリー、すなわち、そこに暗黙の方向ですが、木々が根付いする必要はありません。また、一般的なグラフは有向または無向のいずれかです。あなただけの需要場合はさらに、最大で 2つの頂点間に1つのパス、あなたも含ま森林を。ツリーは通常、接続されたグラフとして定義されます。つまり、正確に 1つのパスが必要です。
njlarsson

この答えは、グラフ理論におけるツリーとグラフの違いについてさらに詳しく説明しますが、実際には、さまざまなタイプの検索アルゴリズムでは違います。
mlibby 2017年

1

グラフ対ツリー

  • グラフには周期があります
  • ツリーにはサイクルがありません「たとえば、頭の中にあるツリーを想像してみてください。ブランチにはルートへの直接の接続はありませんが、ブランチには他のブランチへの接続があります。

ただし、AIグラフ検索とツリー検索の場合

グラフ検索には、アルゴリズムが新しいノードを探索し、それを「visited」とマークするたびに「使用されるアルゴリズムに関係なく」という優れた特性があります。アルゴリズムは通常、現在のノードから到達可能な他のすべてのノードを探索します。

たとえば、3つの頂点ABとCを含む次のグラフを考え、次のエッジを考えます。

AB、BC、CA、CからAへのサイクルがあります。

そして、Aから始まるDFSを実行すると、Aは新しい状態Bを生成し、Bは新しい状態Cを生成しますが、Cが探索されると、アルゴリズムは新しい状態Aを生成しようとしますが、Aはすでにアクセスされているため、無視されます。涼しい!

しかし、木はどうですか?よく木アルゴリズムは訪問済みノードを訪問済みとしてマークしませんが、ツリーにはサイクルがありません。無限ループに入るにはどうすればよいですか?

3つの頂点を持つこのツリーを考え、次のエッジを考えます

A-B-CはAをルートとし、下向き。そして、DFSアルゴリズムを使用しているとしましょう

Aは新しい状態Bを生成し、Bは2つの状態A&Cを生成します。これは、ツリーに「探索されたノードを訪問済みとしてマークする」ことがないため、DFSアルゴリズムがAを再度探索し、新しい状態Bを生成するためです。私たちは無限ループに入っています。

しかし、何か気づいたことがありますか?私たちは無向エッジに取り組んでいます。つまり、ABとBAの間に関係があります。もちろん、これはサイクルではありません。サイクルは、頂点が> = 3でなければならず、最初と最後のノードを除いてすべての頂点が異なることを意味するためです。

ST A-> B-> A-> B-> Aサイクルプロパティに違反しているため、サイクルではありません> =3。しかし、実際にはA-> B-> C-> Aはサイクル> = 3つの異なるノードチェックされています、最初と最後のノードは同じCheckedです。

ここでも、ツリーのエッジA-> B-> C-> B-> Aを検討します。もちろん、サイクルではありません。2つのBがあり、すべてのノードが異なるわけではないためです。

最後に、ツリー検索アルゴリズムを実装して、同じノードを2回探索するのを防ぐことができます。しかし、それは結果をもたらします。


この答えは、問題がツリーまたはグラフである状況と、検索アルゴリズム自体が検索中にツリーまたはグラフを使用するかどうかを混同しているように見えるため、混乱を招きます。
mlibby 2017年

1

簡単に言えば、ツリーには循環が含まれていません。したがって、検索を行うときは、無限ループに陥らないように、グラフの循環を避ける必要があります。

もう1つの側面は、ツリーには通常、トポロジーソートの一種またはバイナリサーチツリーのようなプロパティがあり、グラフに比べて検索を非常に高速かつ簡単にすることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.