特定のポイントを他の特定のポイントから遮断する壁を生成しようとしています。添付画像は私が求めているものを示しています:
- 青が赤から分離されました。
- 赤と黄色から分離された青。
- タイルの障害物で青が赤から分離されています。
- 複数の青が複数の赤から分離されています。
これを行う方法はありますか?
特定のポイントを他の特定のポイントから遮断する壁を生成しようとしています。添付画像は私が求めているものを示しています:
これを行う方法はありますか?
回答:
一般的な概念と、その概念を使用した3つのソリューションを紹介します。
コンセプトはインフルエンスマップです。マップ内の場所ごとに、各カラーポイントまでの距離を表す数値を保存します。このようにして、各位置について、青、赤、緑などからの距離を問い合わせることができます。結果をインフルエンスマップと呼びます。
ゲームにおけるインフルエンスマップの動機、作成、および使用の詳細については、「インフルエンスマッピングのメカニズム:表現、アルゴリズム、およびパラメーター」を参照してください。
私はこの壁が何のためにあるのかわかりません、私の頭の正教会は私たちが戦略ゲームについて話していることであり、AIが壁をどこに配置するかを決定しています。それを行うには、ここに提示されている以外にも多くのアプローチがあります。シンプルなアプローチは、カラーポイントから一定の距離に壁を配置し、それらが重なったときに領域を結合することです。もちろん、障害物の上にそれらを構築しないでください。この方法の利点は、壁があまりにも大きくないことを保証することです。それらを守るために軍隊を送るのは遠く離れており、計算上非常に安価です。もっと複雑なものが欲しいと思います。
解決策1:
青をラップする方法を見つけるには、各ポイントについて、青と他の物との距離の差を見つけます。補遺:差が正である領域は、青の影響のドメインです。すべてのカラーポイントの影響領域を取得すると、ボロノイ図を作成できます。それらについて言及してくれたSirisianに感謝します。
青に近い点の場合、差は正になり、別の色の点に近い点の場合、差は負になると主張できます。距離が連続関数であるとすると、中間値の定理により、差の中央の少なくとも1つの点が差がゼロに近づくと主張できます。解決策は、差がゼロに近づくすべてのタイル間の距離を最小化する壁をトレースすることです。
その解決策が障害を考慮に入れるかどうかは、距離関数に依存します。可能なパスを考慮せずにマンハッタンまたはユークリッド距離のみを使用する場合、結果の壁はマップ内の既存の障害物を利用しません。
注:このソリューションは、フラットシナリオでは青と残りの部分の面積を等しくします。
解決策2:
抽象的には、青と他の影響範囲の間にチョークポイントを見つけ、そこに壁を配置できます。これを行うと、影響が平衡していない場所に壁が配置されます(壁の端が一方の側に近くなります)が、壁の長さは最小になります。
チョークポイントを見つけるための便利なアプローチは、シナリオを凸型ノードに分割し、シナリオを表すネットワークを作成することです。青色が直接あるノードの周りに壁を配置すると想定し、次にネットワークを進め(常に青色からの距離を増やします)、これまでに進めたものの周囲に壁を配置した場合は、壁の長さを考慮します。あなたの解決策は、最小の長さの位置です(そして壁の場所はチョークポイントです)。
実際には、シナリオに影響がある可能性があるため、アルゴリズムはそれよりも少し複雑です。各分岐を1度だけ検討し、その分岐のために壁に最適な位置を選択する必要があります。
ソリューション3:
最初の解決策は、壁が長すぎることにつながる可能性があるという問題があります。2番目のソリューションには、壁が青から離れすぎている可能性があるという問題があります。
カラーポイントまでの距離の表現として、ピクセル、タイル、またはネットワークの操作、インフルエンスマップの概念が有効かつ有用であることに注意してください。したがって、凸ノードのネットワークを介してソリューション1を適用することが可能です。
私の3番目の解決策は、上記のアプローチを組み合わせることです。ネットワークを介して作業している場合は、壁の長さと影響力の差、およびその他の必要なメトリックを、最適化できる単一の指標メトリック「コスト」と見なすことができます。