「トラフィックAI」を構築する方法は?


21

私が現在取り組んでいるプロジェクトは、車が道路に沿って移動する、飛行機がエプロンの周りを移動するという意味で、多くの「トラフィック」を特徴としています

現在、使用可能なパスは事前に計算されているため、ノードは、それ自体がエッジで相互接続されている交差点に対して自動的に生成されます。キャラクター/エージェントがワールドにスポーンすると、ノードから開始し、単純なA *アルゴリズムによってターゲットノードへのパスを見つけます。エージェントはパスをたどり、最終的に宛先に到達します。今のところ問題ありません。

ここで、エージェントが衝突を回避し、複雑な交通状況を処理できるようにする必要があります。私はAIの分野に慣れていないので、ステアリング動作に関するいくつかの論文/記事を調べましたが、レベルが低すぎることがわかりました。私の問題は、実際の衝突回避(エージェントは厳密に定義されたパスに従うため、この場合はかなり単純です)ではなく、あるエージェントが行き止まりを去り、別のエージェントがまったく同じものを入力したいような状況です。または、2人のエージェントがボトルネックで会議を行い、一度に1人のエージェントしか通過できないが、両方がそれを通過する必要があり(前に見つかった最適なルートに従って)、もう一方を最初に通過させる方法を見つける必要があります。したがって、基本的に問題の主な側面は、デッドロックを回避するためにトラフィックの動きを予測することです。

説明するのは難しいが、私はあなたが私が意味するものを得ると思います。どこから探し始めるかについて、何かアドバイスはありますか?私を始めることができる論文、サンプルプロジェクト、または同様のものはありますか?

私はあなたの助けに感謝します!


共同拡散は、何かの助けになるかもしれません。同時に複数のエージェントのパス検索を解決する方法+エージェントが自身を回避する簡単な方法です。あなたの経験をどこかで共有してください、ありがとう。;)
user712092

回答:


12

この問題に対処する方法はたくさんありますが、ここで適切で包括的な答えを出すのに苦労します。しかし、ここにいくつかの高レベルの設計ポイントがあります。

  • ここでエージェントシミュレーションを構築しています。経路探索は、システムへの単なる入力の1つです。エージェントには目標があり、経路探索はその目標を達成するための手段にすぎません。実際には、エージェントの現実的な観点から考えると、エージェントには2つの目標があります。ドライバーの一番の目標は「クラッシュしない」であり、その次は「行きたいところに行く」です。
  • システムは、現実世界の類似点に基づいて構築する必要があります。ほとんどの道路に2本以上の車線があるのは、そのシステムで交通を整理する方がはるかに簡単であるためです。誰もあまり考える必要はありません。シングルレーンのシナリオでは、ドライバーはさまざまな問題を解決する必要があります。

    検出 -互いに回避しない限り、あなたと対向車がクラッシュすることを認識する

    反応 -速度を落とし、交渉段階に入ります。

    交渉 -ドライバーの1人が主導権を取り、もう1人が譲歩しなければなりません。これを決定する方法のルールはあいまいですが、基本的には、1人のドライバーが任意に(または他の方向に来る車の数に関する経験則に基づいて)優先順位を決定するものが必要です。例えば、Aは時間1で優先権を取り、BはAが優先権を握ると判断し、(道を外れて停止することで)譲歩します。AとBの両方が優先権を獲得しようとする場合、両方とも停止し、ランダムな時間待機(または相互に信号を送る)してから再試行します。最終的には一方が他方に譲ります。

    この実装の利点は、人為的なキューやその他の偽の構造を維持する必要がないことです。交渉は、現実世界の認識の観点から行われます。両方の当事者が交渉段階に入ると、重要な前進の動きは優先順位をとろうとする試みとして容易に検出されます。また、ユーザーに対して適切に反応する必要があります。ユーザーは、適切な運転規則を遵守していない可能性が高いでしょう。

  • 最悪を想定してください。完全なシステムであっても、奇妙な状況が発生する可能性があり、俳優は賢明に行動する必要があります。これは、プレーヤーが干渉(人工的にエリアを遮断するなど)できる場合にさらに起こりやすくなります。多くの場合、完全に停止することが唯一の理にかなった応答(gridlock!)になります。完全に停止することは、少なくとも現実世界ではもっともらしい。

    単純な現実世界のロジックで俳優のAIをより密接にモデリングすれば、説得力のあるAIを簡単に作成できます。現実の人々は、目標を達成できない場合でも、停止したり前後に動いたりしません。AIの目的地への唯一の道路がブロックされている場合、彼らはそれを認識し、応答を選択する必要があります(完全に停止し、あきらめて帰宅し、あきらめて他の場所で運転します)。

  • レイヤービヘイビアを使用して、必要なものを取得します。最初の目標はクラッシュしないことです。したがって、回避(ステアリング)ロジックは、常にドライバーのアクションを支配する必要があります。その上に、経路探索から得られる方向性ロジックを重ねます(「次のジャンクションで右になりたい」)。その時々のパスの再評価の上に、より高いレベルのロジックを重ねます(「前進することをお勧めしますが、進行できない場合は、Uターンを含む新しいパスを許可します」)。

  • 経路探索は記憶から得られますが、状況認識は知覚に基づいています。エージェントを完璧にしようとしないでください。彼らは自宅からオフィスへの道を知っているので、どの方向に進むべきかを知っています。しかし、彼らは2マイル離れた通りが塞がれていることを知りません。エージェントが完全なパスをプロットするようにしようとしないでください。完全なパスから始まったとしても、他の要因がパスをブロックする可能性があります。エージェントは、行く先のいくつかの道路のみを計画する必要があります。

  • 情報の質。振る舞いはシンプルでなければなりませんが、それを実現するには優れたクエリ機能が必要です。「対向車が私の車線を占有していますか?」、「対向車が何台ありますか?」、「後ろに車がありますか?」、「Uターンできますか?」などの環境の質問をする必要があります。 。


精巧な回答ありがとうございます。あなたのアドバイスは、私が通常の道路交通に行くときに本当に役立つはずです。しかし、おそらく最初の投稿で2つの重要な側面に注意するのを忘れました。1。プレイヤーは自分でトラフィックに参加しません。ビジネスシミュレーションのようなもので、ネットワークを構築します。2.単方向パスは、特に空港で発生しますが、空港では、エージェントは「自分自身」ではなく、行き先を指示する塔を持っています。タワーはトリッキーな状況を特定する必要がありますが、完全な知識も持っているので、それはあなたが説明した状況/行動の1つ上の層だと思います。
ルニコン

5

リリースされたゲームでいくつかの恐ろしい失敗を見たので、いくつかの提案があります。

1)正当な理由がない限り、2つのレーンを作成し、AIの目的のために、通常の流れの方向に優先順位を付けます-2方向の移動を許可しますが、何かが逆方向に来る場合は、常に道路の反対側にいる人それに屈する。

2)交通渋滞が発生した場合にそれを解くための何らかのロジック。交通渋滞の処理は、互いに衝突しようとしていたが、->-> <-<-パターンに直面したときに完全に失敗した車両にのみ適用される状況を見てきました。これを起こしやすいマップを1つ思い出します。これは、AIベースを攻撃しにくくするためのチョークポイントでしたが、遅かれ早かれ、攻撃グループの出頭中に2人のリソースハーベスターがやってくるということでした。接触している部隊は、ルートを見つけようとして回りまわるが、合法的な動きはなかった。後戻りできず、他のユニットが最初に移動する必要があることがわかりませんでした。(接触しているユニットが回転するのを見ることができますが、他に何もしません。)

これは、スタックしたユニットに隣接するユニットに邪魔にならないようにさせることで解決できると信じています。これには、問題が解決されるまでそれらを遠ざけるための何らかのロジックが必要になります。

多くの場合、単に代替パスを探すのは悪い答えです。私はその種のライブロック状況を見てきました-ユニットAはBが前方の道路をブロックしているので、別のルートを使用するために向きを変えることに注意します。これにより、方向転換するBの道路がブロックされます。道路のブロックが解除されるため、両方が再び方向転換します。各ターンは、前進と後退を交互に繰り返します。

戦争の霧のせいで、私は同じゲームを別のバージョンで見ました。チョークポイントに敵ユニットがありました。自動移動では、実際に敵ユニットをターゲットにしない限り、経路探索は戦わないでしょう。それは前進し、道路が塞がれているのを見るでしょう。その後、後退し、ブロッカーが見えなくなり、再び前進しました。人間が行くべき場所に到達していないことに気付くまで繰り返します。


2
良い答え-「スタック」メッセージをブロードキャストするという概念が好きです。
MrCranky

4

私は交通シミュレーションの経験はあまりありませんが、いくつかのことが頭に浮かびます。

第一に、そもそもボトルネックを防ぐために、車が反対方向に移動できるようにする2つのレーンがあります。同じ「道路」に。

第二に、衝突が発生する可能性がある場合、衝突を回避するステアリング動作を使用して、大量の積み上げを防止する必要があります。ステアリング動作は低レベルかもしれませんが、現実的な外観の緊急行動を作成するのに非常に役立ちます。

複数の車線を持ちたくない場合は、グラフにさらに情報を保存する必要があります。エージェントAは、(グラフのエッジとして表される)道路とエージェントBにある場合、例えば、Aとは反対方向に移動し、同じ道路上にあるそれら意志衝突/デッドロック/あなたはこの現象に対処するためにコード化されてきたものは何でも。

ただし、エージェントAが道路にいる場合、その道路の所有権を要求できます。道路を所有するということは、他のエージェントがそのエッジに沿って移動できないことを意味します(エッジコストを膨大な数に変更するだけで、パスを計算するときにA *が道路を選択しないようにできます)。次に、エージェントAがその道路から自由になると、所有権を放棄します。

正直なところ、それは私が特に好きではないハックなソリューションであり、私が見たほとんどの交通シミュレーション(すべてではないにしても?)はマルチレーンアプローチを使用しています。


(単純に2つの車線があるので)はい、2つのレーンを使用する必要がありますが、その方法を与えるとの契約(アスカーは説明の問題のほとんどがある)すべての問題を解決しないこと
バートバンHeukelom

4

ステアリングの動作に関するいくつかの記事を調べたと言いましたが、念のために次の記事を調べましたか?

http://www.red3d.com/cwr/steer/

そうでない場合は、たとえばボトルネック問題(キューイング)など、指定した問題の一部をカバーするため、いくつかの答えが得られる可能性があります。


0

あなたがする必要があるのは、経路探索アルゴリズムを実装することだと思います。

マップをできるだけ小さな部分(正方形など)に分割します。ただし、移動するトラフィックの有効な場所のみに分割します。次に、車両がどこにあり、どこに向かっているのかを判断し、最短または最も直接的な経路を見つけます。パスは、推定までの各ステップである正方形の配列になります。必要なのは、すべての車両の現在位置だけでなく、将来の数ステップの車両の将来の位置を計算することです。将来、2台の車両が同じ広場にいる場合は、一方または両方の速度を変更する必要があります。

A *(星印)は非常に単純なパス検索アルゴリズムであり、おそらくウィキペディアの疑似コードを選択した言語に簡単に翻訳でき、動作します:http : //en.wikipedia.org/wiki/A*_search_algorithm


4
最初の投稿で述べたように、私はすでにA *アルゴリズムを実装しており、適切なデータ構造も用意しています。また、どちらかのエージェントの速度を下げるだけでも、私にとっては「簡単」に聞こえます。
ルニコン

これはパス発見の問題ではなく、エージェントのシミュレーションの問題です。パス検出は、アクターが適用する必要があるインテリジェンスの非常に低いレベルにすぎません。
MrCranky

簡単すぎる?ハハ。まあそれは私が運転しているときに私がすることです!現在のパスとの衝突を予測できる場合は、速度を変更します。
justin.m.chase

そして信号機?そして、あなたの進路が他の車両によってブロックされている場合はどうしますか?進路が進むが、衝突を避けるために速度がゼロの場合の対処方法。他の車との衝突。その車の進路は(あなたを通り抜けて)進むと言い、その速度もゼロですか?
MrCranky

単一車線のシナリオでは、最初の車が衝突を検出して停止するときに他の車の速度を使用して将来の目的地を計算する場合、最初の車の速度が0になっているため、他の車も停止する必要はありません。長い単一車線の道路を下る車との衝突を見るために、十分先を見通すことができます。私の友人は、A *アルゴリズムにもSTOPノードを追加することを提案しています。単一の車の観点からすると、他の車を障害と見なすだけです。十分に長く行うと、停止するとパスのブロックが解除される場合があります。
justin.m.chase

0

Enemy Nationsを実装したとき、私の最後のフォールバックは、車両が2秒以上スタックした場合、その経路で前方にジャンプしたことでした。そのため、彼らがスタックしたときは、基本的に輸送されたユニットです。誰も文句を言うことはなかったので、私は数回、誰も見ていなかったし、見ていなかったと考えています。

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