2

私の状況を理解するために少し時間を取ってください。わからない場合はコメントで教えてください。

ウェイポイントのArrayListがあります。これらのウェイポイントは順不同です。ウェイポイントには次のプロパティがあります。
{int type, float z, float y, float x, float rotation}

これは3次元の世界に適用されますが、私のパスファインディングは高さを気にする必要がないため(したがって、世界を2次元の世界として扱う)、y値は無視されます。この質問では、回転は重要ではありません。

  • この2次元の世界では、xはx軸を表し、zはy軸を表します。
  • xが増加すると、世界のオブジェクトは東に移動します。xが減少すると、世界のオブジェクトは西に移動します。
  • zが大きくなると、世界のオブジェクトは北に移動します。zが減少すると、世界のオブジェクトは南に移動します。

したがって、これらの「新しい」ウェイポイントは次のように簡略化できますwaypoint = {float x, float y}

現在、これらのウェイポイントは、オブジェクトのX軸(x)とY軸(z)の位置を表しています。さらに、現在の場所:curLocation = {float x, float y}とターゲットの場所:がありtarLocation = {float x, float y}ます。

これが私が取得したいものです:次の厳しい条件下でからに
つながるウェイポイント(別名:パスまたはルート)のすべての組み合わせ:curLocationtarLocation

  1. 各ウェイポイント間の距離は、より大きくすることはできません(float) maxInbetweenDistance。これには、curLocation最初のウェイポイントからの最初の距離と、最後のウェイポイントからのまでの距離が含まれtarLocationます。そのようなウェイポイントの組み合わせが不可能な場合は、nullを返す必要があります。
  2. ターゲットウェイポイントにつながるウェイポイントから複数のウェイポイントが見つかった場合maxInbetweenDistanceは、最も近いウェイポイントを選択する必要があります(少し離れた別のウェイポイントが、より長い距離の新しいパスになり、これも返される場合はさらに良いでしょう) )。
  3. 返されるウェイポイントの組み合わせ(パス)の順序は、最短ルート(最小距離)から最長ルート(最大距離)の順にする必要があります

最後に、次の点を考慮してください。

  1. これは私がAI/パスファインディングを賢く行う必要がある唯一のことです。それが私が本格的なパスファインディングまたはAIフレームワークを使用したくない理由です。1つの関数で上記を処理できるはずだと思います。
  2. ウェイポイントの可能なすべての組み合わせを返すとオーバーヘッドが大きくなりすぎる場合は、組み合わせの最大数を指定できれば問題ありません(ただし、最も近いものから最も遠いものの順に並べます)。例えば。最も近い5つのパス。

どうすればこれを達成できますか?フィードバックをいただければ幸いです。

4

3 に答える 3

2

ウェイポイントに接続性がある場合は、Dijkstra の最短パス アルゴリズムを確認する必要があります。最初の数件の Google ヒットには、Java での実装もリストされています。(投稿から接続性がわかっているかどうかはわかりませんが、「graph-algorithm」タグが含まれているので、そうだと思います)。名前が示すように、この方法は 2 つのノード間の最短パスを提供します。

それらの制約の下で可能なすべてのパスの組み合わせが必要なため、制約は困難です。繰り返しになりますが、接続が存在すると仮定すると、ノード隣接マトリックスは maxInbetweenDistance ルールを適用できます。同様に、このマトリックスを使用して「次善の」ソリューションを取得できます。最適なパスがわかったら、そのパス (またはその要素) を使用不可としてマークし、ダイクストラのアルゴリズムを再実行できます。このプロセスを繰り返すことで、ますます次善のパスのセットを取得できます。

慣例として、ほとんどの計算幾何学問題では、Z は高さであり、水平面は XY 軸によって形成されます。

于 2011-03-04T20:02:01.440 に答える
1

実装する最も簡単な方法は、パスの ArrayList を作成することです。これは、すべての可能なパスを含むウェイポイントの ArrayList になり、再帰関数を使用して、各パスが有効かどうかを開始点と終了点で返します。値、最大距離、およびパスが有効でない場合はリストから削除します。次のステップは、残された各パスを通過し、それらを最短の合計距離から最短の順に並べることです。これは、必要なものを手に入れるための強引な方法であるため、可能な限り最も効率の悪い方法です。今夜家に帰ったら、Javaでこれを行うためのより効率的な方法をまだ持っていない人がいれば、再投稿します。

編集: ブルートフォース方式が多すぎる場合、ウェイポイントのリストを何らかの方法でソートする必要があります。おそらく、開始点からの距離に基づいて最初にソートするのが最善の方法です。

于 2011-03-04T19:33:36.167 に答える