経路探索アルゴリズム?


24

最初にこの質問をスタックオーバーフローに投稿しましたが、そこにビデオゲームに興味がある人はいないと思います...

すべてのタイプのゲームで使用されるパス検索アルゴリズムにはどのようなものがありますか?(とにかく、キャラクターが移動するすべてのタイプの)ダイクストラはたくさん使われていますか?実際にどこかに行くための手順を追跡していないので、そうは思わないでしょう?私がそれを正しく理解しているなら、どのオブジェクトが最も近いかを決定するだけです。私は何もコーディングするつもりはありません。ただいくつかの研究を行っていますが、擬似コードまたは何かを貼り付けると、それは問題ありません(JavaとC ++を理解できます)。基本的に、一般的なパス検索の簡単な概要を探しています。

A *は2Dゲームで使用するアルゴリズムのようなものです。それは素晴らしいことですが、グリッドベースではない2Dゲームについてはどうでしょうか?Age of EmpiresやLink's Awakeningのようなもの。移動するための明確な正方形のスペースはありませんが、何をしますか?

3Dゲームは何をしますか?この話題のhttp://www.ai-blog.net/archives/000152.htmlを読んだことがありますが、これは主題に関する素晴らしい権威であると聞きましたが、メッシュが設定されると、実際にはどのように説明するのか、パス検索が完了しました。A *が使用するものである場合、3D環境でそのようなことはどのように行われますか?また、角を丸くするためにスプラインはどのように機能しますか?


2
この質問は、SEのQ&A形式にはあまりにもオープンエンドだと思います。よくある質問
ジョン・マクドナルド

1
言及したゲームは、マップを何らかの方法でA *のノードに分解する必要があります。その分解プロセスは正方形のグリッドを含む必要はなく、それを行う方法はたくさんあります。このyoutube.com/watch?v=nGC_kBCoHYcを確認してください。実際に舞台裏でやっています。
小川Ch

1
ここには多くの質問がありますので、答えを書くことはできませんが、ダイクストラはパスを返すので、ほとんどのパス検索アルゴリズムは多目的です。ワールド、2Dまたは3Dを接続されたグラフに変換し、その上でパス検索アルゴリズムを実行します。
グレゴリーエイヴリーウィアー


1
暴言させてください。この質問は4件のに比べて、SOの4 upvotesを得近い GDSEにここに投票。私はこのサイトのモデレーターが過度に攻撃的であると感じざるを得ません。確かに、よくある質問で指定されているガイドラインに対して質問がどのように反するのかを見ることができますが、引用することで、これらのガイドラインはを防止するために設定されていdiminishing the usefulness of our siteます。この質問はすでに3回お気に入りに登録されており、一部のユーザーにとって有用であることが証明されています。だから私は仕方がありませんが、それを閉じて投票し、最終的に削除される危険性があるという投票は、はるかに非生産的だと感じます。
デヴィッド

回答:


62

一度に多くの質問がありますので、具体的な答えを出すのは難しいですが、これらのトピックのいくつかを議論することは困難です。答えを2つに分け、できる限り最善の方法で対処するようにします。これらのリストのいずれも完全であると主張していませんが、それらは私が覚えている可能性のあるさまざまな方法の一部です。


パート1-経路探索アルゴリズム

手始めに、経路探索を実装する方法はたくさんありますが、それらのすべてが最短経路を返すわけではなく、効率的または信頼性さえありません。例えば:

  • 「先読み」せず、一度に1つのステップを踏まないプリミティブメソッド:

    • ランダムバックステッピング -目標の方向に一歩ずつ進みます。障害物に遭遇した場合は、ランダムな方向に少し後退してから再試行して、回避策を試みてください。まったく信頼できず、多くの状況で立ち往生します。

    • 障害物の追跡 -ランダムバックステッピングに似ていますが、ランダムに戻るのではなく、衝突が見つかったらオブジェクトの周りをトレースし始めます。衝突がなくなると、ゴールの方向に動き続けます。再び多くの状況で立ち往生することができます。

  • パス全体を一度に見つけるために先読みするメソッド:

    • 幅優先検索 -子の各レイヤーを一度に訪問することによる単純なグラフ探索。パスが見つかったら停止します。グラフが重み付けされていない場合(つまり、隣接する各ノード間の距離が常に同じである場合)、効率的ではありませんが、最短パスを見つけます。重み付きグラフの場合、最短パスを返さない場合がありますが、存在する場合は常に最短パスを見つけます。

    • 深さ優先検索 -グラフをトラバースする別の方法ですが、レイヤーごとに取得する代わりに、アルゴリズムは最初にグラフの深部を検索しようとします。この方法は、検索の深さが制限されていない場合、特にスタックオーバーフローを引き起こす可能性のある再帰的な実装を使用している場合に問題が発生する可能性があるため、通常はスタックを使用して繰り返し実装する方が安全です

    • Best First Search -Breadth First Searchに似ていますが、最も有望なネイバーを最初に選択するヒューリスティックを使用します。返されるパスは最短ではない場合がありますが、幅優先検索よりも実行が高速です。A *は、ベストファースト検索の一種です。

    • ダイクストラの方法 -開始から訪問するすべてのノードまでの総コストを追跡し、それを使用してグラフをトラバースする最適な順序を決定します。重み付きグラフで動作し、最短経路を返しますが、多くの検索が必要になる場合があります。

    • A * -ダイクストラに似ていますが、ヒューリスティックを使用して、各ノードが目標に近い可能性を推定し、最適な決定を下します。このヒューリスティックにより、A *は重み付きグラフで最短パスをよりタイムリーに見つけます。

  • 次に、A *(または一般的な経路探索の最適化)のバリエーションがあり、次のような特定の状況により速くまたはより適応させます(関連する回答cstheory.SEの包括的なリストを参照してください)。

    • LPA * -A *に似ていますが、グラフに小さな変更が加えられたときに最適なパスをより迅速に再計算できます
    • D * Lite -LPA *に基づき、同じことを行いますが、グラフの変更が行われている間に「開始点」が終了に向かって移動するユニットであると想定します
    • HPA *(階層) -さまざまな抽象化レベルで複数のレイヤーを使用して、検索を高速化します。たとえば、より高いレベルのレイヤーは単に部屋を接続し、より低いレベルのレイヤーは障害物の回避を行います。
    • IDA *(反復深化) - 反復深化を使用することにより、通常のA *と比較してメモリ使用量を削減します。
    • SMA *(Simplified Memory-Bounded) -使用可能なメモリのみを使用して検索を実行します。
    • ジャンプポイント検索 -それに言及するためのコメントでのエリックへのクレジット!均一コストのグリッドマップでのパス検索を高速化します(リンク)。

パート2-サーチスペース表現

そして最後に、この質問に対処するために:

A *は2Dゲームで使用するアルゴリズムのようなものです。それは素晴らしいことですが、グリッドベースではない2Dゲームについてはどうでしょうか?

ここで2つの大きな誤解!実際には:

  1. A *は、ゲームが2Dか3Dかを気にせず、どちらの場合にも等しく適切です。
  2. A *はどのグラフ表現の下で機能するため、世界がグリッドであるかどうかは関係ありません。

それでは、世界がグリッドである必要がない場合、他にどのような方法で表現できますか?以下は、経路探索のためにワールド空間を分割する方法の簡単な概要です。これらのほとんどは、2Dと3Dの両方で機能します。

  • 長方形グリッド -グリッド内の各セルがグラフ内の1つのノードであり、2つの遮るもののないノード間の接続がエッジである世界を正方形の規則的なグリッドに分割します。

    ここに画像の説明を入力してください

  • Quadtree-スペースを分割する別の方法ですが、通常のサイズのセルのグリッドに分割する代わりに、4つに分割し、これらをそれぞれ4つに再帰的に分割します。3番目の次元を追加すると、それがoctreeになります。

    ここに画像の説明を入力してください

  • 凸多角形 -歩行可能領域を相互接続された凸多角形のメッシュに分割します。各ポリゴンはノードになり、共有エッジはグラフのエッジになります。これらは、たとえば三角形であり、レベルアセットを作成するときにアーティストによって作成されたメッシュである場合もあります。多くの場合、ナビゲーションメッシュと呼ばれます。このリンクを参照してください。非常に人気のあるナビゲーションメッシュ構築ツールセット:Recastを次に示します。

    ここに画像の説明を入力してください

  • 可視性のポイント -最も一般的な方法は、障害物の各凸頂点のすぐ外側にノードを配置し、お互いを見ることができるノードの各ペアを接続することです。このリンクを確認してください。ただし、ノードは頂点である必要はなく、デザイナーがマップに手動で配置できます。その場合、システムは頻繁にウェイポイントグラフと呼ばれます

    ここに画像の説明を入力してください


1
2つのリンク:1)Mikko Mononenは、Killzone 3のパス検索作業を行っており、彼は非常に素晴らしいブログを持っています。中Amalurの王国:清算。2)ジャンプポイント検索は、グリッドベースのパス検索における最近の最大の開発の1つだと思います。
エリック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.