AStarを調整して到達不能な宛先に最も近い場所を見つける


11

私はJavaでAStarを実装しましたが、選択した目的地に到達できる障害物があるエリアでも問題なく動作します。

ただし、目的地に到達できない場合、計算された「パス」は、最も近い場所(到達できない場所)への経路ではなく、ランダムパスになります。

AStarを調整して、到達不可能な目的地に最も近い場所へのパスを見つける実行可能な方法はありますか?

回答:


20

最下位EstimatedDistanceToEnd(つまり、最下位h(x))のノードを追跡します。バックトラックするエンドノードに到達できない場合は、そのノードからバックトラックします。


シンプル。大好きです!
ジョンマクドナルド

私はちょうどあなたの答えを読んだとき、私の頭をたたいて、「ドー」に行きました。ありがとう!
Shivan Dragon

1

これは実際にはA *の質問ではありません。A *は、ポイントAからポイントBへのパスを見つけることに関するすべてです。それを拡張することはできますが、結果は簡単に乱雑で予測不可能になる可能性があります。代わりに必要なのは、最も近い到達可能な宛先を選択するアルゴリズムです。

これを行う1つの方法を次に示します。A*が有効なパスを返す場合(パス内の開始ノードと終了ノードが入力ノードと一致する場合)、パスを返します。さもないと...

  • 最初のノードから検索を開始します
  • リンクされたすべてのノードをトラバースします(訪問したノードにフラグを付けて、無限再帰を回避することを忘れないでください)。
  • 目的地までの距離を比較して最も近いノードを見つける

フラッドフィルのようなものがen.wikipedia.org/wiki/Flood_fillに適しているように見えますが、開始ノードから最短距離のノードまでA *する必要があることに注意してください。また、これには常にすべての接続ノードの検査が含まれるため、非常に遅くなる可能性があることにも注意してください。
ロイT.

はい、遅くなる可能性があります。しかし、遅いのはおそらく、ノードがメモリ全体に散らばっているからです。簡単に修正できます。また、ある程度の精度を犠牲にすることでスピードアップすることもできます-遠すぎるリンクや間違った方向を指すリンクをスキップするだけです。
snake5 2012

1
@Roy:A *、BFS、および同様のすべてのパスファインディングアルゴリズムは、接続されているすべてのノードを検査して、最後までのパスないことを確認する必要があるため、フラッドフィルとまったく同じくらい遅くなります。ただし、この問題を軽減する方法はいくつかあります。こちらをご覧ください
BlueRaja-Danny Pflughoeft 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.