🗺️ A* パスファインディング
Watch A* find the shortest path on a grid with f(n)=g(n)+h(n). Paint walls, drag start and goal, switch heuristics, and compare A*, Dijkstra and Greedy search.
A* パスファインディングについて
A*(「エースター」と発音)は、ダイクストラ法の保証された最適なこれまでの経路コスト(g)と、残り距離のヒューリスティック推定(h)を組み合わせて2点間の最短経路を求める最良優先グラフ探索アルゴリズムです。各ノードに優先度スコア f = g + h を与えます。1968年にHart、Nilsson、Raphaelによって開発され、ビデオゲームのキャラクターナビゲーションやロボットの動作計画からGoogleマップの経路計算まで、あらゆるものの基盤となっています。ヒューリスティックが許容的(真のコストを決して過大評価しない)である場合、A*は最適経路を見つけることが保証されます。
このシミュレーションでは、壁や重み付き地形(コスト×5)を描き、スタートとゴールのノードをドラッグし、ヒューリスティック(マンハッタン、ユークリッド、チェビシェフ)を選択し、斜め移動を切り替え、ノードが1ステップずつ展開される様子を観察しながら、A*、ダイクストラ(h = 0)、貪欲最良優先探索(g = 0)をグリッド上で選択できます。ライブ統計には展開されたノード数、経路長、総コストが表示されます。
よくある質問
f = g + h とはどういう意味ですか?
A*では、オープンセット内のすべてのノードが f(n) = g(n) + h(n) でスコア付けされます。ここで g(n) はスタートからノードnまでの見つかった中で最も安価な経路の正確なコストで、h(n) はnからゴールまでのコストのヒューリスティック推定です。アルゴリズムは常にfが最小のノードを展開するため、hが許容的であれば、ゴールが最初に展開されたときの経路は最適です。
許容的なヒューリスティックとは何ですか?
ヒューリスティックhは、ゴールに到達するための真のコストを決して過大評価しない場合に許容的であるといえます — 形式的にはすべてのnについて h(n) ≤ h*(n) です。マンハッタン距離(水平・垂直方向の移動の合計)は4方向グリッドで許容的です。ユークリッド距離はどのグリッドでも許容的です。許容的でないヒューリスティックはA*を高速化できますが、最適ではない経路を返すことがあります。
A*はダイクストラのアルゴリズムとどう違いますか?
ダイクストラのアルゴリズムはh = 0とするため、スタートからの正確なコストの順にノードを展開し、全方向に均等に広がっていきます。A*はヒューリスティックを加えることで探索をゴールへと導き、展開するノード数を大幅に減らせます。障害物のない開けたグリッドでは、マンハッタン距離を使うA*はダイクストラに比べてノード展開数を50〜90%削減できます。
なぜ貪欲最良優先探索は速いのに最適ではないのですか?
貪欲最良優先探索はg = 0としてhのみでノードを順位付けし、常にゴールに最も近く見えるノードへ突き進みます。開けた環境では非常に高速ですが、実際の経路コストを無視するため、コストの高い地形や障害物を回り込むことでより長い経路に誘導されることがあります。最悪の場合、最適解より著しく悪い経路を見つけてしまいます。
マンハッタン距離・ユークリッド距離・チェビシェフ距離はいつ使い分けるべきですか?
移動が4方向(上下左右)に制限されている場合はマンハッタン距離を使用してください。これは最小移動回数を正確に数えます。斜め移動が許可され、その移動コストが√2に等しい場合はユークリッド距離が適しています。チェビシェフ距離(|Δx|と|Δy|の大きい方)は、多くの戦略ゲームでよくあるように、全8方向のコストが同じ場合に適した選択です。
重み付きセルとは何で、パスファインディングにどう影響しますか?
重み付きセルは、泥地・浅瀬・悪路など通過しにくい地形を表します。このシミュレーションでは重み付きセルへの進入コストが1ではなく5になるため、A*はしばしば複数の重み付きセルを通り抜けるより、その周囲を迂回する経路を選びます。ダイクストラとA*はどちらも重みを正しく扱いますが、貪欲最良優先探索はコストを無視するため、コストの高い地形をそのまま通り抜けることがあります。
A*の時間計算量はどれくらいですか?
最悪の場合、A*の時間・空間計算量はO(b^d)です。ここでbは分岐係数、dは最適解の深さです。三角不等式を満たす一貫性のあるヒューリスティックを使う場合、各ノードは最大1回しか展開されないため、V個の頂点を持つ有限グラフではO(V log V)となり、これは二分ヒープを使うダイクストラ法と同じ漸近的な計算量です。
迷路生成は探索にどう影響しますか?
迷路生成器は、グリッドを通る通路を削り出すランダム化アルゴリズムを使って完全な迷路を作成し、任意の2つのセル間にちょうど1つの経路しか存在しないことを保証します。迷路は探索アルゴリズムにとって特に厳しい条件です。狭い通路によってA*のヒューリスティックの優位性が失われ、有効な経路が1つしかないため、すべてのアルゴリズムがほぼ同じ数のノードを探索する必要があるからです。
グリッド上の色は何を表していますか?
緑はスタートノード、赤はゴールを示します。青色のセルは現在のフロンティア(オープンセット)を形成し、濃い青は訪問済み(クローズド)のノードを示し、黄色は展開中のノードを強調表示します。重み付きセルは茶色で表示されます。経路が見つかると、スタートからゴールまでライムグリーンでトレースされ、統計パネルで正確なコストを確認できます。
A*は3Dやグリッド以外のグラフでも使えますか?
はい — A*は、辺のコストが非負であり、許容的なヒューリスティックを与えられるあらゆるグラフで機能します。実世界の応用には、3Dロボットアームの動作計画(コンフィギュレーション空間グラフ)、ネットワークルーティング(遅延をコストとする)、自然言語解析(ビタビ的な格子)などがあります。ここでのグリッドは、この一般的なアルゴリズムの最も視覚的にわかりやすい表現に過ぎません。
「展開されたノード数」というカウンターの意味は何ですか?
展開されたノード数は、アルゴリズムがフロンティアからノードを取り出し、その隣接ノードを処理した回数を数えたもので、A*の効率性を測る主要な指標です。この数値が低いほど、ヒューリスティックが探索をうまく導いていることを意味します。30×30のグリッド(900セル)では、優れたヒューリスティックを使うと100ノード未満の展開で最適経路を見つけられることが多いのに対し、ダイクストラは到達可能なすべてのセルを展開することがあります。
このシミュレーションについて
このシミュレーターは、重み付きグリッド上で最短経路を見つけるA*探索アルゴリズムを可視化します。各フロンティアノードは f(n) = g(n) + h(n) というスコアを持ちます。gはスタートから移動した正確な距離、hはゴールまでの残り距離のヒューリスティック推定であり、アルゴリズムは常にfが最小のノードを最初に展開します。アルゴリズムのドロップダウンをダイクストラに切り替えるとhがゼロになり、貪欲最良優先探索ではgが完全に取り除かれるため、同じ迷路が3通りの方法でノードごとに解かれる様子を観察できます。
🔬 これが示すもの
色分けされたグリッドは探索をリアルタイムで追跡します。青色のセルはオープンフロンティアにあり、濃い青色のセルは完全に展開済み(クローズド)、黄色はその瞬間に処理されているノードを示します。ゴールに到達すると、勝者ルートがライムグリーンでトレースされ、サイドバーには展開されたノード数と総経路コストが表示されます。
🎮 使い方
ドロップダウンからアルゴリズムとヒューリスティックを選び、ペインツールのボタンを使って壁や×5コストの重み地形を追加するか、スタート移動/ゴール移動マーカーをボード上でドラッグします。斜め移動を許可すると4方向・8方向移動が切り替わり、g/h/f値を表示すると各セルに生の値がオーバーレイ表示されます。自動実行、ステップ、迷路生成、壁クリア、リセットで再生とボードのレイアウトを制御できます。
💡 豆知識
A*は1968年にPeter Hart、Nils Nilsson、Bertram Raphaelによって発表されました。半世紀以上前のアルゴリズムですが、許容的なヒューリスティックが与えられれば必要以上のノードを探索しないため、今なお多くのビデオゲーム、ロボット工学、経路計画のデフォルトの選択肢となっています。
よくある質問
マンハッタン距離からユークリッド距離やチェビシェフ距離に切り替えると何が起きますか?
各ヒューリスティックはh(n)がゴールまでの距離をどう推定するかを変え、探索のフロンティアの形を変えます。マンハッタン距離(水平・垂直移動の合計)は4方向移動に対して正確です。ユークリッド距離(直線の斜辺)は斜め移動に適しています。チェビシェフ距離(水平・垂直差の大きい方)は、斜め移動が直交移動と同じコストであるボードに適しています。真の距離を過小評価するヒューリスティックを選ぶとA*は最適なままですがより多くのノードを展開する可能性があり、過大評価すると探索は速くなりますがより長い経路になることがあります。
なぜWeightタイルを描くと、単に遅くなるのではなく経路自体が変わるのですか?
Weightタイルは進入コストが1ではなく5になるため、それを横切る経路のg(n)を引き上げます。A*とダイクストラは常に総コストを最小化するため、重み付きセルの集団を迂回する経路の方が全体として安くなる場合、喜んでより長い経路を選びます。gを完全に無視する貪欲最良優先探索だけが、コストの高い地形をそのまま通り抜けられる唯一のモードです。
フロンティアの色分けは実際には何を追跡しているのですか?
青色のセルはオープンセット(発見済みだがまだ展開されていない)にあり、fをキーとする二分最小ヒープに格納され、同点の場合はhの値が低い方が優先されます。濃い青色のセルはクローズド、つまりその隣接ノードはすでに調べられ、gスコアが確定していることを意味します。黄色は現在のステップでヒープから取り出された1つのノードを示します。
なぜ迷路生成は貪欲最良優先探索の性能をここまで悪化させるのですか?
迷路生成器は、ランダム化された再帰的バックトラッカーを使って、任意の2セル間にちょうど1つの経路しかない完全な迷路を作るため、ヒューリスティックが利用できる近道が存在しません。貪欲最良優先探索は、直線的に見てゴールに最も近いオープンセルへ突き進み続けるため、しばしば行き止まりの通路へ突入しますが、A*とダイクストラは計画的に後退し、残されたもう一方の選択肢を試します。
斜め移動のコストは正しく処理されていますか?
はい — 「斜め移動を許可」がオンのとき、斜めのステップは1ではなく√2のコストとなり、実際のユークリッド距離と一致します。またシミュレーターは、隣接する2つの壁の角を斜めに突き抜けるような斜め移動をブロックします。このモードではヒューリスティックもオクタイル距離の式に切り替わり、8方向移動に対して許容的であり続けます。
A*がf = g + hを使ってグリッド上で最短経路を見つける様子を観察できます。壁を描き、スタート/ゴールをドラッグし、ヒューリスティックを切り替えて、A* vs ダイクストラ vs 貪欲探索を比較し、ヒューリスティックが展開ノード数をどう変えるかを確認できます。
3D · Three.js / WebGL renderer · 60 FPS target · runs fully client-side, no install