A *グラフ検索時間の複雑さ


9

時間の複雑さとA *に関する混乱。

A * Wikiによると 、時間の複雑さは解の深さで指数関数的です(最短経路):

A *の時間の複雑さはヒューリスティックに依存します。無制限の探索空間の最悪の場合、展開されたノードの数は、解の深さ(最短経路)dで指数関数になります。O(bd)、 どこ b 分岐因数(州ごとの平均の後継者数)です。

この受け入れられた回答へのコメントは、グラフのサイズの観点から複雑さを与える方が理にかなっていることを指摘しているため、O((|V|+|E|)log|V|)

明らかに、ヒューリスティックがすべてのノードに0の値を割り当てる場合、A *はダイクストラのアルゴリズムになり、均一コストのヒューリスティックは本質的にヒューリスティックを無効にします。

ヒューリスティックを O(1) (そして一貫性のある)、最悪のケースは本質的にA *を複雑度のあるダイクストラのアルゴリズムに劣化させていることは理にかなっています

O(|E|+|V|log|V|)

最小優先度のキューの実装(フィボナッチヒープ)。

私が間違っている?

私がこれまで見てきた本などは、ソリューションの深さに関して複雑さを与えます

回答:


11

これらは基本的に、2つの異なるパースペクティブ、または実行時間を表示する2つの異なる方法です。どちらも有効です(どちらも正しくありません)が、O(bd) AIで通常発生する設定では、間違いなくより便利です。

アルゴリズムコミュニティとCS理論コミュニティでは、グラフの頂点とエッジの数の関数として実行時間を数える傾向があります。どうして?その意味では、最悪の場合の実行時間が最も理にかなっています。また、そのコミュニティで通常検討されている問題では、最悪の場合はグラフ全体を調べる必要があるため、通常はこれよりも上手くいくことは望めません。O(|V|+|E|)

AIコミュニティでは、実行時間を異なる方法でカウントする傾向があります。彼らはしばしば特定の種類のグラフを考慮します:分岐因子を持つツリーb。また、そこで発生する状況では、グラフはしばしば無限または非常に大きくなります。通常、すべてのグラフを調べないように努力します。これは、多くの場合、アルゴリズムの主要な目標の1つです。したがって、|V| そして |E| 意味がありません: |V| は無限である可能性があり、いずれの場合でも、すべてのグラフを調べるつもりはないので、問題となるのは、実際にアクセスする頂点の数であり、他の場所に存在する可能性がある数ではなく、気にしない数です。

したがって、AIコミュニティでよく発生する状況では、ツリーの分岐係数の観点から実行時間を測定する方が意味がある場合がありますb)およびゴールノードの深さ(d)。通常、ゴールノードが見つかると、アルゴリズムは停止します。このようなツリーで、すべての頂点を詳細に調べるとd ゴールノードを見つける前に、 O(bd)停止する前の頂点。したがって、必要に応じて、これをグラフのサブセットにアクセスすると考えることができます。|V|=O(bd) (今どこ V 訪問する頂点のみが含まれます) |E|=O(bd)E 私たちが見るエッジのみが含まれます)、そしてあなたは考えることができます O(bd)-timeアルゴリズムは、実行時間が O(|V|+|E|)...これは少し乱用ですが |V|,|E|表記。とにかく、うまくいけば、あなたはその理由を見ることができますO(bd) より情報的です O(|V|+|E|) この文脈で。


1

組み合わせ検索コミュニティでは、暗黙的に、つまり状態のセットとそれらの間の遷移として、明示的にではなく、具体的に頂点とエッジのセットとして検索スペースを定義することが一般的です。暗黙の探索空間では、状態を頂点として、遷移をエッジとして表すことができますが、多くの場合、実際の状態のセットには有限の境界がない場合があるため、エッジと頂点の数を必ずしも有限カーディナリティで定義することはできません(実際または理論的に)。したがって、多くのアプリケーションでは、分岐係数の観点からパフォーマンスを定義する方が理にかなっていますb、頂点とエッジのカーディナリティとは対照的に。

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