本稿では,A*アルゴリズムによって最短経路を求める方法を,沢山の図を使って分かりやすく説明していきます.(厳密な説明ではないことにご注意ください)
早速,以下のような迷路でスタートとゴールを結ぶ最短経路を求めていきます.
この迷路では,一辺の長さが1の正方形が並べられており,各正方形の上を1マスずつ移動していきます.
ここでは一つの正方形をノードと呼ぶことにします.
移動できる方向は,基本的に縦横斜めの8方向ですが,黒塗りのノード(障害物)には移動できません.
それぞれのノードに対して,g, h, f という3つのパラメータを個別に割り当てていきます.
g はノードとスタートとの直線距離を表しており,h はノードとゴールとの直線距離を表しています.
f は g と h の和です.
全体の流れは以下のようになります.
- スタートから順に,各ノードの探索を始める.
- 一度通過したノードを封鎖していく.
- 上記 1, 2 をゴールに到達するまで繰り返す.
- 今までの探索結果を頼りに,ゴールからスタートへ逆走すると最短経路が求まる.
まずは,スタートの周辺を探索していきます.探索済みのノードには,g, h, f の値が割り当てられます.
そして,探索済みのノード(黄色)の中で,最も f の値が小さいノードに移動します.ここでは,f=6 が最小です.
現在のノードから,さらに周辺のノードを探索し,さっきまで自分が居たノードを封鎖します.
そして,探索済みのノード(黄色)の中で,最も f の値が小さいノードに移動します.
現在のノードから,さらに周辺のノードを探索し,さっきまで自分が居たノードを封鎖します.
そして,探索済みのノード(黄色)の中で,最も f の値が小さいノードに移動します.
現在のノードから,さらに周辺のノードを探索しようとしますが,ここでは周辺に探索できるノードが無いため,探索は一旦諦めます.さっきまで自分が居たノードを封鎖します.
そして,探索済みのノード(黄色)の中で,最も f の値が小さいノードに移動します.最も小さい f が複数あった場合は,どれか1つを適当に選びます.
現在のノードから,さらに周辺のノードを探索しようとしますが,ここでは周辺に探索できるノードが無いため,探索は一旦諦めます.さっきまで自分が居たノードを封鎖します.
そして,探索済みのノード(黄色)の中で,最も f の値が小さいノードに移動します.
現在のノードから,さらに周辺のノードを探索しようとしますが,ここでは周辺に探索できるノードが無いため,探索は一旦諦めます.さっきまで自分が居たノードを封鎖します.
そして,探索済みのノード(黄色)の中で,最も f の値が小さいノードに移動します.最も小さい f が複数あった場合は,どれか1つを適当に選びます.
前と同じ処理を繰り返します.
そうすると,スタートの右側にある6つのノードが封鎖されます.
現在のノードから,さらに周辺のノードを探索し,さっきまで自分が居たノードを封鎖します.
そして,探索済みのノード(黄色)の中で,最も f の値が小さいノードに移動します.
ここから先は,探索範囲が広がっていく過程をしばらく無言で並べていきます.
現在のノードから,さらに周辺のノードを探索した結果,ゴールを発見したのでゴールに移動し,さっきまで自分が居たノードを封鎖します.
最後に,ゴールからスタートに逆走することで最短経路が得られます.
逆走するための準備として,各ノードごとに親ノードの位置を記録しておく必要があります.