AIが互いに異なるパスを取るようにする


16

AIがマップの端にスポーンし、中央に向かって走るトップダウン2Dゲームがあります。

A *とノードメッシュを使用してパス検索を実行しています。

現在、AIはマップの端のポイントでスポーンし、すべて同じパスをたどります。これは中心への最短ルートです。

今、私は彼らをもっと驚くほど面白く、お互いに異なる道を歩んでほしいと思っています。

私はすぐにこれを行うための2つのアイデアを考えることができますが、人々が頻繁に使用する他の方法またはより良い方法があるかどうかを知りたいですか?

  1. 1人の敵がスポーンして中心へのパスを生成したら、そのパス上のすべてのノードのコストを一時的に増やし、その後時間をかけてゆっくりと減らします。その後、後で出現する敵AIは、より広い道を歩むことを余儀なくされます。

  2. 上記のアプローチは、AIがますます幅広い道を歩むことにつながり、それでも非常に予測可能です。それで、地図の周りにいくつかの中間目標ノードも導入すると思いました。AIがスポーンすると、中間ゴールの1つをランダムに選択し、最初にそこに向かってからマップの中心に向かいます。これを上記のコスト増加のアプローチと組み合わせると、かなり良いように見えるでしょうか?

AIがとる道を変え、説得力があり驚きに見えるようにするために、人々がどのアプローチが最も効果的であると感じましたか?

回答:


7

2番目のオプションは、より基本的なアプローチを示しています。つまり、敵がさまざまな方向からプレイヤーに近づくようにすることです。問題は、プレーヤーを「回避」するためにどこまで行かなければならないのかということです。これに対する理想は、

  • プレイヤーの位置を密接に囲む(つまり、追従する)ポイントを動的に生成します。
  • ネバーマインドがこれらの周囲のポイントへのパスをランダム化するという観点から、程度の差はあれ、提案していることです。

このようにして、プレーヤーに収束するときに現実的なパスの変化を得るためだけに、AIが不必要に長く迂回しないようにすることができます。

協調拡散は、アルゴリズムの一部として暗黙的に必要なことを行います。しかし、実装するのは簡単ではありません。


共同拡散は、ある程度の重み付けをした単なる塗りつぶしです。実装は簡単で、おそらくA *より簡単です。それはあなたの世界の異なった見方を必要とするだけです-自明ではない概念的なシフトかもしれませんが、実装上の問題はありません。

AIエンティティを管理するという点で非標準的な観点であるため、実装するのはまだ簡単ではありません:)
エンジニア

ニック、ありがとう。マップの中心でプレイヤーを囲むいくつかのウェイポイントを設定することが主な方法になると思います。この段階では、それらが動的に生成されるのか、それとも私の特定の状況のレベルごとに手作業で作成されるのかはわかりません。再度、感謝します!
TerryB

12

最初のアイデアとして、パス検索時に各ノードの重みに小さなランダム値を追加してみてください。このように、すべてのエージェントはわずかに異なる環境でパスを探します。これがあなたのケースでうまくいくかどうかはわかりませんが、試してみるのは本当に簡単です。


敵は最終的に鶏のように走り、きめの細かい環境ではパスはそれほど変わりません。それは他のソリューションへの良い追加ですが、それ自体のソリューションではありません
コヨーテ

@Coyoteこれはnav-mesh構造、およびノー​​ドの重み、速度、ランダムコンポーネント間の関係に大きく依存します。だからこそ、明確な答えとしてではなく、試してみるべき提案として答えを組み立てました。
ネヴァーマインド

確かに:)私は通常エントロピーのファンです。しかし、最終結果はめったに素晴らしいものではありません。
コヨーテ

実際、ニック・ウィギルの答えは私のものよりもはるかに優れていると思います。しかし、どういうわけか、それに値する賛成を得ていません。
ネヴァーマインド

P:我々はそれが投票ダウンしようとすることができます...それはある...しかし、あなたは最初と簡単です
コヨーテ

3

Nevermindの答えが好きですが、コメントで説明されている制限を考えると、これは私が試したいことです:

  1. センターへの単一ユニットのアルゴリズムは、走行距離の合計を記録します。
  2. 後続の各ユニットに、これよりもランダムで少量の距離を割り当てます。
  3. 各ユニットのA *を実行している間、あなたがどれだけ近くにいるか、どの程度「旅行」したいかに基づいて、重量を追加します。これはおそらく次のようになり(distanceToGoal) + Max(0, desiredDistance - distanceTravelled))ます。

これにより、ユニットはさらに進むことを試みますが、これはおそらく異なるパスであり、異なるパスを取る可能性があります。

各ユニットの開始時の色相に追加することもできますが、ランダム範囲はおそらくかなり大きくする必要があります。


2

Nick Wiggillが指摘したように、最も簡単なアプローチは、目標を囲む円を取得することです。

  • この円に近いポイントをウェイポイントとしてランダムに割り当てます。
  • 円内のすべてのパスを初期パスから削除します(またはこれらのポイントの値を劇的に増やします)
  • その後、そのウェイポイントから目的へのパスを取得します。

重要な部分は、おそらく最初のウェイポイントに到達するために敵が円を横断することになるため、元のウェイポイントの円内のすべてのパスを削除することです。

それから、初期値に近い円にセカンダリウェイポイントを追加するなど、複数の値で遊んでバリアントを取得できます。


マップがそれをサポートしている場合、この円の周りの「興味深い」場所(戸口、カバー、木、岩、建物、何らかの戦術的な利点を持つ任意のノード)を見つけ、敵が利用可能であり、出てくる場合にのみ、それらの場所に敵を向けます彼らがする必要がある場合はオープン。これは、単に円の端にあるランダムなスポットを打つよりもずっとスマートに見えます。
DampeS8N

Coyoteに感謝します。ええ、おそらくNicksのソリューションを使用します。DampeS8Nが提案するように、ウェイポイントとして重要な重要な場所がいくつかあります。AIが「円を渡る」という問題を回避するために、円内のノードのコストを大幅に引き上げるので、A *が
適切にルーティング

2

ここでの問題は、基本的に、A *がターゲットへの最短ルートを見つけるためのアルゴリズムであることです。それが「良い」パスの主要な基準である場合、すべてのアクターが同じ決定を下すことは当然です。

する必要があるのは、パスの品質基準を変更することです。そのため、「最短が最良」だけが要因ではありません。これにはランダム性の要素が重要ですが、パス検索インテリジェンスを損なうほどではありません(つまり、アクターはターゲットへの愚かな迂回パスを取ります)。

A *パスファインディングは、アクターが開始する前にルート全体について完全な知識を持っていることを通常想定しているため、本質的に単純です。それは常に非現実的に見えるでしょう。ソリューションは、選択された中間目標がそれから一歩離れていることを示唆しました-AIはターゲットに近づくことを試みていますが、一度に小さなセクションでナビゲートしようとしますあなたが見ることができるように、そしてあなたがより多くの道を横断するにつれて、あなたはさらに先を見ることができます。

おそらくもっとシンプルな見方をお勧めします。経路探索をしているとき、これまでに発見した単一の最良経路を維持するだけではありません。代わりに、最適な5または10パスのセットを収集します。しきい値を使用して、明らかな外れ値を破棄します。たとえば、最適なパスが20uを通過してターゲットに到達した場合、次に最適なパスは21uを通過し、次のパスは50uを通過します。最適なパスよりも20%大きいしきい値を設定し、50uパスは馬鹿げて長いので破棄します。これでいくつかのパスを選択でき、そのパスのセットからランダムに選択することにより、アクターはさまざまな決定を下します。

ただし、標準のA *検索ではこの種の情報を取得できないため、アルゴリズムを変更するか、他の方法を使用して可能なパスのセットを収集する必要があると思います。


1

繰り返し発生する敵(または敵の種類)が少数いる場合は、動きに影響する個性を与えようとすることがあります。大きなものである必要はなく、時々現れるものだけです。これの良い例は、パックマンの幽霊です。A *をいくつかの中間目標に分割します。たぶん、1人の敵は本当に愚かで、簡単に迷子になり、3番目のノードごとにランダムな方向に向かっています(直接後方を除く)。クリエイティブに。

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