経路探索アルゴリズム・ビジュアライザー

異なる探索アルゴリズムが同じグリッド上でフロンティアごとに競い合う様子を見てみよう

インタラクティブシミュレーションを読み込んでいます...

レッスン

理論 — 経路探索アルゴリズム・ビジュアライザー

ドロップダウンにある4つのアルゴリズムのうち、3つは本質的に同じアルゴリズムです。これらはすべて、探索待ちのマスを1つの式 f(n) = g(n) + h(n)(ここまでのコスト + 残りの推定コスト)で順位付けしており、2つの項のどちらを残すかだけが異なります。h を除外すればダイクストラ法になり、g を無視すれば貪欲最良優先探索になります。4つ目の幅優先探索(BFS)は、すべてのステップのコストが等しい場合にダイクストラ法が帰着する姿です。

各記号の意味

g(n)
スタートからマス n までの、これまでに発見された最安経路のコストです。縦横の移動コストは 1、斜めの移動コストは √2 となります。これは移動を1回と数えるのではなく、距離(長さ)として測定するためです。
h(n)
ゴールまでに予想される残りコストの推定値です。ダイクストラ法と幅優先探索では単に使われていないだけでなく、ゼロになっています。これこそが、これらのアルゴリズムが項を1つ欠いた同じ式であることを示しています。
f(n)
順位付けのキーです。f の値が最も小さいマスが次に探索されます。グリッドの上部には、現在のマスの具体的な数値が代入されて表示されるため、アルゴリズムが今行った選択を視覚的に確認できます。
frontier
琥珀色のマスで、発見済みですが未探索のものです。展開したノード数はこの集合から抜け出たマスの数をカウントするため、解の質ではなく処理量の指標となります。

公式の導き方

  1. アルゴリズムを選ぶ前に、「最短」が何を意味するかを定義しておきましょう。経路のコストは各ステップの長さの合計です。縦横の移動は 1、斜めの移動は √2 となります。マスの数を数えるのではなく、距離を加算します。
  2. 次に、4つすべてのアルゴリズムで共通のメインループを行います。フロンティアからマスを1つ取り出して訪問済みにし、通行可能な隣接する各マスに対して更新された g の値とともにフロンティアへ追加します。このループ処理の中には、ヒューリスティック、ゴールの方向、あるいは選択したアルゴリズムに関する言及が一切含まれていないことに注目してください。
  3. したがって、残された唯一の決定事項はどのマスを取り出すかであり、それはたった1つの式で表されます。g + h で順位付けすればA*探索になります。h = 0 に設定すると、ここまでのコストのみで順位付けされます。これがダイクストラ法であり、ゴールの場所を知らないため同心円状に外側へ広がっていきます。逆に g を無視すると推定値のみで順位付けされます。これが貪欲最良優先探索であり、まっすぐゴールに向かって突き進み、たどり着いたルートをそのまま採用します。
  4. 幅優先探索(BFS)は順位付けを一切行わず、先入れ先出しで処理します。斜め移動を許可をオフにすると、すべてのステップのコストがちょうど 1 になるため、マスが追加された順番こそが g の値が増加する順番となります。したがって、幅優先探索はダイクストラ法とまったく同じ順序で探索を行います。グリッドを再生成せずに確認できます。2つのアルゴリズムを切り替えても、展開したノード数はまったく変化しません。斜め移動をオンにすると、斜め移動のコストが 1 ではなく √2 になるため、追加順序とコストの上昇順が一致しなくなり、この理屈は成り立たなくなります。

表示の読み方

優先度スコアはグリッドの上部に表示され、現在のマスの gh の値が代入されているため、直前の選択を生み出した順位付けを読み取ることができます。その下には、展開したノード数経路の長さという2つのカウントが表示されます。琥珀色はフロンティア、インディゴは探索済みを表します。アルゴリズムを変更しても、新しいグリッドが生成されるわけではありません。それこそが比較に価値をもたらす理由です。同じ4方向移動の配置において、ダイクストラ法の展開したノード数がA*探索より小さくなることはなく、貪欲最良優先探索のノード数はどちらのほんの一部に過ぎません。

前提
ステップのコストが負にならないこと、および探索の実行中にグリッドが変化しないことを前提としています。スタートは常に左上のマス、ゴールは右下のマスです。マスの処理完了(クローズ)は確定的なものであり、ループ内で再検討されることはありません。すべてのステップが非負の値を加算するため、後からより安く到達できるルートが現れることはなく、これによって安全性が保証されています。
成り立たない場合
展開したノード数は最も劇的に変化する数値ですが、これは解の質を示す指標ではありません。貪欲最良優先探索を選んでみてください。同じグリッド上でA*探索が探索する量のほんの一部しか探索しませんが、多くの配置でより長い経路の長さを返します。グリッドを何度か新規生成して、2つのカウントが反対方向に動く様子を観察してみてください。調べたマスが少ないというのは、アルゴリズムがどれだけ効率よく働いたかについての主張であり、得られた解の良さについての主張では決してありません。

ヒューリスティックが重要な理由 🖖

f(n)=g(n)+h(n)という式により、A*はこれまでの費用が安く、かつゴールに近いと思われるノードを優先する。hが残りのコストを決して過大評価しない限り、A*は最短経路の保証を維持する。より強い許容的なhを使うほど、不要なセルの探索が減る。アルゴリズムのドロップダウンを切り替えて、ヒューリスティックを外した場合(ダイクストラ法)、これまでのコストを外した場合(貪欲法)、スコアリングを完全になくした場合(BFS)に何が起こるか確認してみよう。

1つのループ、4つの個性 🖖

四つのアルゴリズムは、まったく同じ処理を繰り返します。待ちリストから最も有望なセルを取り出し(琥珀色のフロンティア)、訪問済みとして印を付け(藍色)、移動できる隣接セルをリストに加えます。違うのは、どのセルを最も有望とみなすかだけです。比較の決め手は展開ノード数ですが、その値は直感どおりには動きません。障害物のない格子では、A* はすべてのセルを展開します。マンハッタン距離を使うと、隅へ向かう単調経路はどれも同じ f 値になり、優先順位を付けられないからです。障害物を置くと、展開数はかえって減ります。

斜め移動が保証を壊すことがある 🖖

「斜め移動を許可」をマンハッタン・ヒューリスティックと組み合わせると、A* は最短でない経路をこっそり返すことがあります。ここでは斜めの一歩のコストはわずか √2 ≈ 1.41 ですが、マンハッタン距離はそれを 2 として計上します。つまりヒューリスティックが過大評価となり、許容的でなくなり、最適性の保証が失われます。直線距離を決して超えないユークリッド距離に切り替えれば、最短経路が戻ってきます。

学習の道すじ

秒ではなく仕事量を数える

参考文献 (3)

例題

  • 開けたグリッド - 20×20 の格子の1割をふさいでも、A* は大半を展開します。単調経路はすべて f = 38 となり、同点を解消できません。
  • 迷路状 - 障害物が増えると、A* は遅くなるどころか速くなります。障害物密度 0.28 では、開けた格子を高コストにしていた同点が崩れ、探索は通行可能なセルの半数ほどで収束します。
  • 弱いヒューリスティック - 障害物のない 4 近傍格子ではマンハッタン距離が正確で、ユークリッド距離は常にそれを下回ります。したがって、二つの許容的ヒューリスティックのうち弱いのはユークリッド距離です。経路は同じでも、展開するセルは約三分の一増えます。
  • ダイクストラの探索 - 「不適切なヒューリスティック」と同じ障害物密度 0.22 の 24×24 格子で、ヒューリスティックだけを取り除きます。目標の方向が分からないダイクストラ法は、A* よりも約五割多くセルを展開します。
  • 貪欲法の罠 - 貪欲法は h だけで評価するため、目標へ一直線に進み、展開数は A* の半分未満です。ただし、たいていはより長い経路を返します。少ない探索量と引き換えに最短性を失うのです。
  • bfs + 斜め移動 - 幅優先探索には目標の情報がないため、通行可能なセルをほぼすべて訪れます。斜め移動も一歩と数えるので、最小化しているのは距離ではなく歩数です。