私は多くのアプリケーションでA*(およびダイクストラのアルゴリズム)を使用しましたが、パスの長さは関係ありませんが、ターン数が最も少ないパスを見つけるのに行き詰まっています。対角線なしで、上下左右のグリッドを使用しています。
A *はを定義し、コストを追加して拡張しようとしました。これは、次のようなケースになるまで完全に機能します。Cost = DistanceFromStart + Heuristic(
Manhattan
)
numTurns
| 0 0 0 0 0 * 0 0
| 0 0 1' 2' + 0 0 E
| 0 0 S 1 2 * 0 0
| 0 0 0 0 0 * 0 0
| 0 0 0 0 0 * 0 0
(*
=壁、0
=空、S
=開始、E
=終了)
S->1->2->+
パスはと同じコストを与えることがわかりますs->1'->2'->+
。どちらもこれまでのところ1ターン、同じ距離S
、同じマンハッタンです。しかし、から、+
私たちがプライム'
ルートをとった場合、私たちは曲がる必要はありません。しかし、1 2
ルートをとった場合、右に曲がる必要があります(+1
コスト)。したがって、最初にに到着したとしても1 2
、それは最小ターンのパスではありません。
同じ正方形の複数を一度に優先キューに入れて、両方がチャンス(ヒープ内で値が最小の場合)と他の「ハッキー」な解決策を得るようにするなどの調整を試みましたが、そうでないケースを取得し続けます。カバーされています。これを行う直感的な方法はありますか?
ありがとう!