web-dev-qa-db-ja.com

A *は最良の経路探索アルゴリズムですか?

一般に、A *はパスファインディング問題を解決するための最良のアルゴリズムであると言われています。

A *がnotである場合に解決策を見つけるのに最適なアルゴリズムはありますか?

A *はBFS、DFS、UCSなどと比較してどの程度優れていますか?

31
Zombie

A *は特別です。A*は、ノードの評価方法と使用するヒューリスティックをいじることによって、他の経路探索アルゴリズムに変形できるからです。これを行うと、Djikstra、best-first-search、breadth-first-search、depth-first-searchをシミュレートできます。

さらに、多くの場合、高速化が簡単です。たとえば、許容ヒューリスティックに定数cを掛けると、結果のノードシーケンスのコストが最適結果のc倍以下になることを保証できます。

たとえば、これを取ってください 素晴らしい紙 Ian Davis(スタートレックアルマダのために書かれた)。 A *はウェイポイントの階層セットで使用され、大まかなパスになります。次に、パスを平滑化するために、パス上のノードとその近くのノードを含む新しい生成されたグラフでA *を再度実行して、より妥当なパスを取得します。最後に、ラバーバンディングを実行して冗長ノードを削除します。

したがって、A *はすべての解決策ではありませんが、非常に用途の広いツールです。

8
sjdlgjsljg

非常に単純な代替案(ヒューリスティックスを使用しない)は Collaborative Diffusion です。 1つのターゲットまたはをターゲットにする必要がある場合は、うまく機能しますグループの任意のメンバー、無差別に、この場合、A *よりも高速になる可能性があります。ゲーム「You're Getting Warmer/Colder」を模倣しています。

共同拡散では、ターゲットにする「グループ」ごとに1つのヒートマップを作成します...特定のターゲットを追跡する場合は、そのターゲット専用のヒートマップを作成して、それを独自のグループとして扱います。 Collaborative Diffusionのドメインは、フットボール(エージェントの両方のチームがボールとゴールポストを追跡し、3つのインフルエンスマップのみにつながる)またはPacman(類似の複数のエージェントがPacを追跡する)のようなゲーム、または体を表す1つのヒートマップを組み合わせた軍のゲーム(その軍の各エージェントから決定された各軍の合計)。これにより、1つの軍が「他の軍内の特定の部隊」ではなく「他の軍」に接近できるようになります。この一般性により、パフォーマンスが向上する場合があります。

ウォーキングは、目的地(最もホットなポイント)に到達するまでの山登り(現在のセルから暖かいセルへの移動)で構成されます。このアプローチは、移動する障害物、つまり他のエージェントを暗黙的に扱います。

これは、マップに多くの移動する単位がかなり密集しており、各更新で検索スペース全体で発生する必要がある広範な拡散を正当化する場合に最適です。十分に調整されたA *アプローチは、他の1つのユニットのみをターゲットとする1つのユニットしかない大規模なスパースマップで桁違いに安価になる可能性があることは明らかです。シーカーとターゲットの間のマップタイルの数。一方、コラボレーティブディフュージョンでは、同じことをするためだけにマップ全体に拡散するので、コストが大幅に高くなります。

4
Engineer

質問は古いようですが、おそらくこの実用的な解決策は誰かに役立つでしょう。最近私は pythonで書かれた非常に素晴らしいオープンソースコードを見つけました

コードには次のパスファインディングアルゴリズムが含まれています。

  • A *
  • ダイクストラ
  • ベストファースト
  • 双方向A *
  • 幅優先検索(BFS)
  • 反復深化A *(IDA *)

行列のサイズと値を変更すると、異なる経路探索アルゴリズムの違いを感じることができます。 Wikipedia で言及されているように、「A *は完全であり、存在する場合は常に解決策を見つけます」

0
zviad