タイルマップにマルチエージェントA *アルゴリズムを実装しています。エージェントはX軸とY軸でのみ移動します。パスを計算するときに他の場所がどこにあるかをチェックすることで、それらの間の衝突を回避します。
エージェントが異なる方向から同じタイルを渡す必要がある場合を除いて、問題なく機能します。このような状況では、最適な解決策は、一方のエージェントが他方のエージェントの通過を待つことです。
また、北の回廊がない場合、経路探索は失敗します。
そのようなアルゴリズムをどのように実装できますか?
タイルマップにマルチエージェントA *アルゴリズムを実装しています。エージェントはX軸とY軸でのみ移動します。パスを計算するときに他の場所がどこにあるかをチェックすることで、それらの間の衝突を回避します。
エージェントが異なる方向から同じタイルを渡す必要がある場合を除いて、問題なく機能します。このような状況では、最適な解決策は、一方のエージェントが他方のエージェントの通過を待つことです。
また、北の回廊がない場合、経路探索は失敗します。
そのようなアルゴリズムをどのように実装できますか?
回答:
経路探索を失敗させることから始めることができます。失敗した場合、将来のランダムな時間を選択して、パスファインディングを再試行します。 いくつかの低レベルのネットワークプロトコルはそのように機能し、非常にうまく機能します。一度に1つずつパスを作成し、エージェントが通過するすべてのタイルを使用済みとしてマークする必要があります。さらにパスが失敗した場合、再起動するランダムタイマーは、新しいパス検索を分散し、ループエラーを解消するのに役立ちます。
問題の2番目の部分は、2つのパスを返すことで処理できます。ブロックから失敗した場合でも、最初のパスは通常の戻りです。2番目のパスは、すべてのエージェントを完全に無視するパスです。その後、これら2つのパスから得られた知識を使用して、待機するか長い道のりが良いかどうかを判断できます。その決定のヒューリスティックには多少の作業が必要になりますが、何も試みないよりはましです。
このような単一幅の廊下でエージェントが多くブロックされている非常に悪いケースでは、エージェントがすぐにパスし、実際のパスが開くのを待つことができる安全な場所を追加する必要があります(したがって、エージェントは待って廊下を塞ぐだけです)。
問題を解決するのではなく、レモンを取ってレモネードを作る方法を紹介します。
何年も前に、私の友人が非常に有名なFPSに取り組んでおり、それはまさにあなたが説明する問題を抱えていました:制約された領域には、特定の所望の位置を持つ多くのAIキャラクターがいて、経路探索アルゴリズムは常にそれらをぶつけていましたお互いに。特に、プレイヤーは、たとえば、手ren弾を敵でいっぱいの小さな部屋に投げると、エリア内のAIキャラクターはそれぞれ出口に向かって走ろうとしますが、お互いにぶつかり、一時停止し、向きを変え、他の人をhitったり、振り向いたりなど。これは非常に非現実的です。
計算予算が限られているため、正常に実行できるより良い経路探索アルゴリズムを構築しようとしましたが失敗しました。そのため、パスファインディングの問題を解決する代わりに、私の友人はAIに非常に安価なチェックを追加しました:AIが短時間に2回別のAIにぶつかった場合、出口を見つけるのをやめて、代わりにカバーします。そのため、PCが手ade弾をロブし、出口に向かって敵の群れが走っているのが見えます。互いにぶつかり、向きを変えると、外に出られないことに気付いたように見えるので、爆発する直前に頭をかがめて頭を覆います。これは、リアルに見えると同時に、プレーヤーにとって非常に満足のいくものです。
衝突生成アルゴリズムの欠点を変えて、それを利点に変えることができる同様の方法はありますか?
私は通常、他のローカライズされたシナリオのために、A *パスを他の形式のパス検索で強化するのが最良の方法です。特に、複数のエージェントが同時に移動して動的なブロッカーを作成する世界では、ユニット回避がその1つです。
一般的に、これにはエッジ追跡手法が有効です。パスをたどって元のパス計算の一部ではないブロッカーに遭遇した場合、基本的に方向(時計回りまたは反時計回り)を選択し、その方向に沿ってブロッカーを移動してトラバースを試みます。できない場合は、ブロッカーが解決するのを待ちます(ただし、デッドロックが発生する可能性があります)。
ユニットが協力してパスする機能を実装することもできます。つまり、ユニットは別のユニットにわずかに移動するように要求することができるため、ブロッキングユニットを「押し越す」ことができます。ただし、これはタイルベースのゲームではうまく機能しません。タイルベースの動きに制限されていますが、例のようにシングル幅の廊下でデッドロックする可能性があるためです。その場合、ユニットがお互いに「場所を切り替える」ように依頼することができます。これにより、ほとんどの場合解決になります。ただし、これによりユニットが互いに飛び跳ねる場合があります。
「ユニット回避」は、ゲームで経路探索を議論する際にかなり一般的なトピックです。そこには多くのヒットがあります。特にあなたがチェックアウトすることがあり経路探索「流れ場」で、この質問を最高司令官2のRTSで使用される通常この問題が発生し多くの興味深いあらゆる方法でそれを解決します。
ターンベース/ティックベースの移動システムがある場合、3Dグラフを作成して、各遷移がエージェントを将来のマップの外観に移動させることができます。次に、各エージェントに、将来その時点でオンになるタイルを要求し、アクセス不可としてマークさせます。各エージェントには、グラフを遷移する3番目の方法として、次のティックに「待機」する追加オプションがあります。これはシステム上で難しくなりますが、ランダムに待機するよりも良い結果が得られるはずです。2人のエージェントがbtと通信できるようにすると、そのうちの1人が「あなたに合格したい」というメッセージを送信します。最短パスがそのエージェントを通過する場合、
A *のようなアルゴリズムを使用する場合、コストヒューリスティックでの作業の自由度が最も高くなります。
この特定のケースでは、ヒューリスティックを調整して、エージェントを別のエージェントに近づける動きのコストを上げることができます。問題は、両方とも上のルートをとろうとすることになる可能性があり、振動することになります正確なタイミングに応じて、パスが互いに閉じるときにパス間を行き来します。
別の可能性は、エージェントが意図したルートを追跡し、他のエージェントが意図したパスに沿ってコストを上方調整することです。これにより、エージェントは限られた範囲で互いに効果的に調整できます。ここでの主な問題は、すべてのルートがブロックされている場合、どのエージェントが最後に移動してもパス検索が失敗し続ける可能性があることです。
パスが1つしかない場合、パスの検出は失敗するか、デッドロックになるまでお互いに進みます。
どちらも十分でない場合は、コストを計算するときに時間の追跡を開始する必要があります。2番目のエージェントのコストは、1番目のエージェントがクリアするのにかかる時間に通常のトラバーサルコストを加えたものである必要があります。そうすれば、エージェントは他のパスを取るのと待機するタイミングを正しく決定できます。
タイミングを合わせるのは非常に手間がかかる可能性があるため、ほとんどの人は物事が十分になるまでレベルレイアウトとコスト値を微調整します。
通常、パス追跡中にこのような問題を解決するためにステアリング動作を使用するように勧めます。そして、あなたはまだグループ化行動のインスピレーションを得るためにそれらに多くをかけるかもしれません。しかし、残念なことに、単純なタイルベースの移動には直接適用できません。
ほとんどの状況で衝突回避がすでに機能しているので、この特定の状況に焦点を当てましょう。エージェントが移動しようとするたびにパスファインディングをやり直すか、移動中に移動する他の人にどのように反応するかを見ることができないと思います。第二に、これらのエージェントはお互いに友好的だと思います。
あるエージェントが他のエージェントを待っていることを提案します。正確にそれを行うことをお勧めします。エージェントに他のパスにアクセスする方法を提供し、他のパスの一部ではない自分のパスの最初のタイルを検索してそこに行きます。この手法の問題は次のとおりです。
他のエージェントの周りに別の受け入れ可能な方法があるかどうかをどのように決定しますか?彼の周りを回るのに十分なスペースがあるなら、あなたは他のエージェントを待ちたくありません。他のエージェントを考慮した場合のパス検索の失敗は、修正したい状況の明確な兆候ですが、ここで取り上げた例ではパス検索の失敗はありません。しかし、わずかな計算で、代替パスA *が他のエージェントを小さな円で迂回させるか、北の廊下のようなまったく異なるパスを使用するかを決定できます。
エージェントが1回のラウンド/操作中にどれだけ移動できるかはわかりませんが、それが十分でない場合、またはすべてのエージェントが並行して移動している場合、両方のエージェントはパスの反対側で待機することにします。これは、他のエージェントにパスを解放することを通知することで修正できます。