経路探索

はじめに


NPCの移動処理などに使う探索ルーチンを勉強。

テストアプリの画面
障害物の向こうのキャラを目指して歩けるようにします。

サンプルコードダウンロード:
Search.zip
releaseフォルダの中に実行ファイルがあります。
使い方が書いてませんが、ポチポチ押していればなんとなくわかるかなーという期待をこめて。
いろいろ試してみていただければ。探索中の様子は見ていてなかなかおもしろいです。

解説 


今回は開始地点から現在位置、最終地点から現在位置の歩数を元にスコアを割り出し、そのスコアが最小となる経路を進んでいくことで最短ルートを割り出そうという方法です。

グリッドを付けて考えましょう。
わかりやすいようにこの小さなマップで検証します。
画面左のヒヨコが右のニワトリ目指して進んでいきます。

まずは4方向
まず、上下左右、動ける場所を特定します。今回は障害物が無いので4方向共有効です。

スコアを計算
次にスコアを算出します。
@の場合だと、ヒヨコから1歩、ニワトリから5歩(障害物は考慮しない)なので、スコアは6となります。
また、後から開始位置への経路を導き出せるように開始位置への方向も記録しておきます。
これを@〜Cまで繰り返します。

次の1歩
4方向算出したので次へ進みます。
次の1歩はスコアが小さいところへ進みます。右側が4で最小ですので、右へ進みます。
進んだ後は最初と同じように進める場所を特定します。今回は上と下の2方向です。
そして、一度処理した場所は印をつけておきます(この図では黒字を印としています)。

上下に移動できました。
最初と同じようにスコアを算出します。
そして次の1歩へ。

↑にだけ進めそうです。
同じスコアの場合はどれを進むのが一番効率がいいのかよくわかりませんのでとりあえず順番に進みます。

上に進みました。
今回最高の8が出ました。他の6の場所からも進めてみます。

その他スコアが少ない順に経路を探します。
この5種類です。

それぞれ移動してスコアを求めます。
すべて8になったようです。
次は8の場所から順番に調べていきます。

次々進みましょう。
今度は4箇所見つかりました。
スコアを算出します。

進んだらスコアを計算。
左側の2つはスコアが10になりました。右側が8ということでそちらへ進みます。

繰り返していくとこのように。
後は同じように進める方向を探す→スコアを求める→スコアの小さい場所へ進む…
を繰り返していきます。
何度か繰り返しているうちにニワトリへ到着することができました。

開始位置へたどっていけば最短経路のできあがり。
最後に最短ルートを求めるということで、ニワトリからヒヨコまで、記録していた向きを逆にしながらたどっていきます。
そしてできあがったのが図のルートです。

一度探索した場所を覚えておくというだけでも、いつかはたどり着けますね(道があれば)。
後は最終地点が頻繁に移動する場合にどう対処するかが問題になります。毎回この探索をしていると調べ続けてしまって全然進まないという状態に…
ですので、障害物にぶつかるまでは最終地点の方向へ無条件に進ませてしまって、ぶつかってから検索するようにするというのが良いのではないかなと思います。