Skip to content
Go back

経路探索アルゴリズム

· Updated:

A* (エー・スター)

  • グラフの最短経路を見つけるための最良優先探索アルゴリズム
    • 始点からのコストをGG、終点からのコストをHHとし、その和FFを評価関数とする
    • コストGGは、より小さな値を見つけるたびに更新される
    • コストHHは、厳密に決められないので、ヒューリスティックな(推定の)関数を使う
    • 始点から隣接ノードへ徐々に手を伸ばし、FFが小さくなるように更新しながらH=0H=0のノードを見つけることで、始点へ最小コストで戻る逆順の経路を見つけることができる
  • 空間をグラフで表現することで、目的地までの経路探索に利用できる
    • 障害物に相当するノードを取り除いたり
    • ユークリッド距離(8方向)にしたりマンハッタン距離(4方向)にしたり
    • エッジに重みを加えて、歩きやすいエリアを設定したり

貪欲法

  1. 始点を訪問済みとし、その後、キューに入れる
  2. 最も良い評価値を持つノードをキューから取り出して現在地とする
    • 現在地が見つからなければ、探索は失敗となる
    • 現在地が終点であれば、探索は成功となる
  3. 訪問済みでなく、現在地から探索可能なノードごとに:
    1. 現在地を経由したときの評価値のほうがより良い場合、対象ノードの評価値を上書きする
    2. 対象のノードを訪問済みとし、その後、キューに入れる
  4. 2に戻る
  • どの道を通っても結果として同じことになる経路を剪定してA*を最適化する手法
    • 進行方向に対して後方のノードは、親からの経路のほうが最適なので、無視できる
    • 進行方向に対して斜め前のノードは、横に障害物がなければ親からの経路と同じものになるので、無視できる
    • 進行方向に対して前のノードは、現在地を経由するほうが最適なので、無視できない
  • 一様なコスト分布を持つ二次元の矩形グリッド上で可能
  • 無視できないノードのみを考えることで処理するノード数を削減できる
  • ジャンプ先を事前に計算しておくこともできる

アルゴリズム

  • A*における隣接ノードの代わりにjump point successorを使う
    • 上下左右では:
      • 進行方向に対して(左|右)に障害物があり、かつ、対応する(左|右)斜め前に障害物がないか調べる
      • そうであれば、そのノードをjump point successorとする
      • そうでなければ、一歩進んで同様の処理を繰り返す
    • 斜めでは:
      • 進行方向に対して(左|右)斜め前方向に、上下左右の場合と同様の条件のノードがあるか探す
      • それがあれば、その開始地点のノードをjump point successorとする
      • それがなければ、一歩前へ進んで同様の処理を繰り返す

Subgoal Graph

SUSPENDED

Goal Bounding

SUSPENDED

参考文献