web-dev-qa-db-ja.com

ダイクストラとスターの違いと利点

私はこれを読みます: http://en.wikipedia.org/wiki/A*_search_algorithm

A *はdijkstraを使用するよりも高速で、best-first-searchを使用して処理を高速化します。

アルゴリズムをミリ秒単位で実行する必要がある場合、いつA *が最も顕著な選択肢になりますか。

私が理解していることから、必ずしも最良の結果を返すとは限りません。

迅速な結果が必要な場合、パスを事前に計算する方が良いですか?それらを保存するには、メガバイトのスペースが必要になる場合があります。

44
peppydip

A *はdijkstraを使用するよりも高速であり、best-first-searchを使用して処理を高速化します。

A *は基本的に、情報に基づいたダイクストラのバリエーションです。
A *は、f(v) [f(v) = h(v) + g(v)]の値に応じて、次に探索する頂点を貪欲に選択するため、「ベストファーストサーチ」と見なされます。ここで、hはヒューリスティックであり、gはこれまでのコストです。

非情報的なヒューリスティック関数を使用する場合:h(v) = 0 for v :: A *が「これまでのコスト」(g(v))のみ、ダイクストラのアルゴリズムと同じです。したがって、h(v) = 0の場合、A *はデフォルトでダイクストラのアルゴリズムになります。

アルゴリズムをミリ秒単位で実行する必要がある場合、いつA *が最も顕著な選択肢になりますか。

まったくそうではなく、それは多くのことに依存しています。降下ヒューリスティック関数を使用している場合-私の個人的な経験から、貪欲ベスト(ヒューリスティック関数のみに従って選択する)は通常、A *よりも大幅に高速です(ただし、最適ではありません)。

私が理解していることから、必ずしも最良の結果を返すとは限りません。

許容ヒューリスティック関数 を使用する場合、A *は完全(パスが存在する場合はパスを検出)であり、最適(常に最短パスを検出)です。あなたの機能が許容できない場合-すべての賭けはオフです。

迅速な結果が必要な場合、パスを事前に計算する方が良いですか?それらを保存するには、メガバイトのスペースが必要になる場合があります。

これは、いくつかの問題、たとえば 15-puzzle problem で行われる一般的な最適化ですが、より高度です。ポイントAからポイントBへのパスはマクロと呼ばれます。一部のパスは非常に便利であり、覚えておく必要があります。これらのマクロを記憶して物事を高速化するために、機械学習コンポーネントがアルゴリズムに追加されます。

ここでのポイントAからポイントBへのパスは、通常、状態グラフ上ではなく、問題自体の中にあることに注意してください(たとえば、正方形を一番下の行から上の行に移動する方法など)。

速度を上げるには:
ヒューリスティックがあり、速度が遅すぎて、最適ではない場合でも、より迅速なソリューションが必要な場合- A * Epsilon は、通常、A *よりも高速です。パスの最適性の限界(最適化にどれだけ近いか)。

59
amit

ダイクストラは、A *の特殊なケースです(ヒューリスティックがゼロの場合)。

検索:

2つのコスト関数があります。

g(n): same as Dijkstra. The real cost to reach a node n.
h(n): approximate cost from node n to goal node. It is a heuristic function. This heuristic function should never overestimate the cost. That means, the real cost to reach goal node from node n should be greater than or equal h(n). It is called admissible heuristic.

各ノードの総コストは、f(n)= g(n)+ h(n)によって計算されます

ダイクストラ:

ソースから各ノードへの実際のコスト値であるコスト関数が1つあります。f(n)= g(n)実際のコストのみを考慮して、ソースから他のすべてのノードへの最短パスを見つけます。

11

A *Dijkstraに似ていますが、唯一の違いは、A *は、想定されるノードに優先順位を与えるヒューリスティック関数を使用して、より良いパスを検索しようとすることですダイクストラはすべての可能なパスを探索するだけです。

その最適性は、使用されるヒューリスティック関数に依存するため、これにより、最適ではない結果を返すことができ、同時に特定のレイアウトのヒューリスティックが向上し、結果(および速度)も向上します。

探索するノードがはるかに少なく、いずれの場合もゲインが良いため、ノードごとにより多くのメモリとより多くの操作を必要とする場合でも、ダイクストラよりも高速であることを意味します。

リアルタイムの結果が必要で、グラフが非常に大きい場合、パスの事前計算が唯一の方法である可能性がありますが、通常はルートのパス検索の頻度を減らします(頻繁に計算することを想定しています)。

6
Jack

これらのアルゴリズムは、ノードと呼ばれる複数のポイント間で効率的に方向付けられたパスをプロットするプロセスであるパスファインディングおよびグラフトラバーサルで使用できます。

a* is f =g + h.gの式は実際のコストを意味し、hはヒューリスティックコストを意味します。 Dijktrasの式はf = gです。ヒューリスティックコストはありません。 a*を使用していて、ヒューリスティックコストが0の場合、Dijktras algorithemと等しくなります。

4
Charith mohotti

簡単な答え:A *はヒューリスティックを使用して検索を最適化します。つまり、1つのノードからターゲットまでのコストをある程度推定できる関数を定義できます。これは、たとえば、特定のグラフノードからターゲットまでの距離を推測できる地理的表現(マップ)上のパスを検索する場合に特に便利です。したがって、通常、ゲームなどでパスを見つけるためにA *が使用されます。より一般的なケースでは、ジクストラが使用されます。

いいえ、A *は常に最適なパスを提供するとは限りません。ヒューリスティックが「地理的な」距離である場合、次の例は最適でないパスを与える可能性があります。

[airport] - [road] - [start] -> [road] -> [road] -> [road] -> [road] -> [target] - [airport]
        |----------------------------------------------------------------|
3