領土巡回計画


14

エージェントが土地のために戦っているゲーム/シミュレーションを開発しています。私は次の図に示すような状況にあります。

緑と赤のタイル張りの領域で、同様の色の「生き物」

これらのクリーチャーは歩き回っており、自由な場合は踏む土地を占有します。これをさらに面白くするために、エージェントが実際に土地を歩き回り、侵入者からパトロールするように「巡回」行動を導入したいと思います。

技術的な面では、各正方形はx,y位置として、またその辺の長さを表す寸法として表されます。また、誰が広場を占有しているかに関する情報も含まれています。すべての正方形はに保存されますArrayList

パトロール動作を導入するにはどうすればよいですか?私が望んでいるのは、各エージェントがエリアの特定の部分をパトロールすることです(彼らはパトロールするエリアを自分たちの間で分割します)。私が見つけた主な問題は次のとおりです。

  • 写真に見られるように、土地の面積は非常にランダムです。各方向の境界がどこにあるかを理解するのはかなり困難です。
  • エージェントはどのように地域をパトロールする必要がありますか?
  • 敵チームは中央から領土を奪う可能性があるため、土地のエリアはばらばらになる可能性があります。

私は、各方向に最も遠い正方形を取り、それらをエリアの境界として扱い、それらの境界に基づいて領域を分割するというアイデアを思いつきましたが、これには多くの無関係な土地が含まれる場合があります。

この問題にどのように取り組むべきですか?


1
おそらく、アイデアのためのいくつかの画像処理技術を見ることができますか?チームに属するすべてのタイルにパトロールエージェントが割り当てられるまで、同時に実行されるさまざまな領域成長アルゴリズムが各エージェントから発せられます。
ケツァルコアトル

@ケツァルコアトル:良いアイデア、実装は簡単ですが、これは非常に不平等なパトロール地域につながります。上の画像の緑のエージェントを検討してください。右上のエージェントには、カバーする〜15個の正方形があり、中央に1つだけあります。
Junuxx

これは多かれ少なかれ、チームに属する次の最も近いブロックを現在のブロックから選ぶことに似ています。
トーマス

1
確かに、それは不完全です。おそらく、地域の種子が成長するときにエージェントを使用するのではなく、最初にランダムにシードを植えることができます(エージェントごとに1つ)。領域の成長が終了したら、おそらく、バランスのステップを実行して、各領域をタイルをノードとするクラスクラスターのように扱うことができます。KNearestNeighbourまたはKMeanまたは類似のものは、何らかの形の収束まで反復できます。その結果、領域はほぼバランスが取れていると見なされ、各エージェントは最も近いシード(ユークリッド距離?)に割り当てられます。(私はおそらくこれを複雑にしすぎていると思う、もっと簡単な方法が必要だ...)
ケツァルコアトル

1
おそらく、各エージェントは、磁石のような他のすべてのエージェントを撃退することから始めることができます。これにより、エージェントは地域のさまざまなコーナーに移動します。エージェントが休息したら、ケツァルコアトルが示唆したように土地を分割します。領域はほぼ均一である必要があります。
tyjkenn

回答:


9

魅力的な質問。対処しなければならない最初の問題の1つは、パトロール動作を「最適な」パトロールにするか、「リアルな」パトロールにするかです。私はこれらの言葉を作り上げていますが、私が言いたいのは:

最適:エージェントは、システム全体のカバレッジエリアを完全に分散する方法で動き回ります。

リアル:エージェントは動き回り、可能な限り均等に分散しようとしますが、エージェントはそれぞれの観点からローカルのデータにしかアクセスできません。

2つ目のアプローチに焦点を当てます。これは、クレイグレイノルズの自律型キャラクターステアリング動作のさまざまなステアリングパターンの重み付けブレンドを使用して解決できると思います。ステアリング動作の基本的な考え方は、単純な力を組み合わせて、環境の周りで即興的なナビゲーションを生成することです。あなたの場合、次のステアリング動作を組み合わせたいと思うと思います。

  • 回避(領域外)-エージェントは領域内に留まり、領域外への移動を避けようとします。ただし、一部のリアリズムでは、領土の「外に出る」ことの影響は、ここで100%である必要はありません。エリアの外に出るための「角を切る」ことは、おそらくより現実的な動きになります。

  • さまよえる -エージェントは動き回り、探索し続けようとします。そうでなければ、エージェントは互いから最適な分離点を見つけようと試み、「置かれたまま」になります。

  • 分離(他のエージェント)-エージェントは他のエージェントとの距離を保とうとします(したがって、彼らは最大の地面を覆い、塊にならないようにします)。

  • シーク(侵入者)-エージェントは、検出した侵入者に接近しようとします。

相対的な重み付けを動的に試してみたいと思うでしょう。たとえば、エージェントが侵入者を検出した場合、分離の重み付けは低下するはずです。(言い換えれば、彼らは狩りをしているときだけ広げる必要があり、誰かを見つけたときではありません。)上記の4つのパターンの重みをいじってみれば、あなたは自分のものにかなり近い何かを持っていると思います再探しています。

説明されている動作パターンに従う「boid」の実装方法については、オンラインでかなりの数のリソースがあります。オープンソース実装opensteerをお勧めします。


2

1つの方法は、各セルについて、「ガード」が最後に訪れたときを記録し、ガードが最も長く訪問されていない隣接セルに継続的に移動することです。

もちろん、これはテリトリーが接続されていることを前提としています。

これは完璧なソリューションではありませんが、コーディングが容易で、状況の変化に適応し、効率的です。しばらく前に書いたrts aiで、このアルゴリズムをスカウティングおよびハラスメント攻撃に使用することに成功しました。

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