489マスと150マス
同じ地図で同じ最短経路を見つけるのに、489マスを調べる方法と、150マスで済む方法がある。
横32マス、縦18マスの地図で、左のSから右のGへ向かう最短経路を探させ、ゴールにたどり着くまでに調べたマスを比べた。489は出発点から近い順に調べるダイクストラ法、150はゴールまでの見込みを足して順番を決めるA*(エースター)の結果で、見つけた経路の長さはどちらも28.14だった。縦横の1歩を1、斜めの1歩をとし、このページのシミュレーションと同じプログラムで筆者が数えた。
UnityやGodotのナビゲーション機能で動く敵が壁を回り込んで追ってくるのも、この計算のおかげだ。地図を点と線のグラフに直し、その上をAで探すのである。Aの見込みがゴールまでの本当の距離を超えない限り、調べるマスを3分の1ほどに減らしても、最短経路は取りこぼさない。
地図の真ん中には「コ」の字の壁があり、口をSのほうへ向けている。ゴールへまっすぐ進むと、袋の奥で行き止まる形だ。見込みだけで順番を決める貪欲法は、袋の中を調べたあと、口の手前で下へ折れて回り込む。調べたのは86マスで済むが、道は29.90と、最短より6.2%長い。
では、見込みを足しても最短の保証が壊れないのはなぜか。そして、見込みはどこまで信じてよいのか。
マス目、多角形、角の点
道を探す前に、地図をグラフに直さなければならない。一筆書きの定理で土地を点、橋を線とみなしたように、立てる場所を点に、1歩で移れる組を線にして、線ごとに歩く長さを持たせる。点の置き方は、大きく分けて3通り。
いちばん素直なのはマス目だ。マスの中心を点にし、隣り合うマスへ動く1歩を線にする。GodotのAStarGrid2Dはこの形で、マス目の範囲と大きさを決めるだけでA*を使え、斜めに進めるかどうかも選べる。
3Dのゲームの地図では、歩ける床を凸多角形に分ける。Unityの文書によれば、床をこの形で持つのは、凸多角形の中ならどの2点を結んでも障害物にぶつからないからだ。隣り合う多角形の組も覚えておき、多角形を点としてA*で探す。見つかるのは多角形の列で、文書での呼び名は廊下(corridor)。キャラクターはこの廊下の中を、次に見える角へ向かって進んでいく。
3つ目は、障害物の角のそばに点を置き、見通せる点どうしを結ぶやり方である。スタンフォード研究所(SRI)のニルス・ニルソンが1969年の国際会議で報告した移動ロボットは、部屋の地図で障害物の角に向き合う位置に点を取ってグラフを作り、その上で最短経路を探した。
どの形でも、その先の計算は同じだ。出発点から近い点を順に確定させていく方法は、1959年にエドガー・ダイクストラが3ページの論文で示した。論文は、出発点Pから各点への最短経路を「長さの短い順に」組み立て、ゴールのQに着いたら止める、と書く。ダイクストラ法の手順と、並べ替えの手間をめぐる2025年の研究は、最短経路の「並べ替えの壁」に詳しい。
ただ、近い順に調べると、ゴールと反対の向きにも同じだけ手を伸ばすことになる。冒頭の地図では、壁でないマス554のうち489マスを調べた。出発点を中心にした円が、ゴールに届くまで膨らみ続けるからだ。
直線距離を足して順番を決める
A*が新しく足すのは、まだ歩いていない残りの道のりに立てる見込み、ヒューリスティックと呼ばれる値である。点について、出発点からそこまでに見つかった経路の長さを、そこからゴールまでの見込みをとし、和の小さい点から調べる。をいつも0にすれば、ダイクストラ法そのものだ。
見込みには、地図の性質から分かる下限を使う。1968年の論文でA*を示したピーター・ハート、ニルソン、バートラム・ラファエルの3人は、町と道路の例を挙げた。2つの町を結ぶ道路は、町どうしの直線距離より短くはなれない。座標の差がとなら、直線距離は三平方の定理でになる。
マス目では、動き方しだいで下限が違ってくる。たとえば斜めにも進めて、斜めの1歩がなら、壁のないときの最短経路は、差の小さいほうの数だけ斜めに進み、残りをまっすぐ進む道になる。
8方向に動くときの距離で、オクタイル距離と呼ばれる式だ。AStarGrid2Dの文書は、見込みの候補に、直線距離、マンハッタン距離(縦横の差の和)、オクタイル距離、チェビシェフ距離(縦横の差の大きいほう)の4つを式つきで載せている。マンハッタン距離に添えてあるのは、斜めを使わない移動向け、という注意だ。
見込みが本当の距離より大きいと、何が起きるのか。極端な形が、を見ずにだけで順番を決める貪欲法で、のを限りなく大きくしたものにあたる。ゴールに近そうな点へまっすぐ向かうので調べる数は少ないが、冒頭の袋のように壁の手前で行き止まる地図では、道が長くなる。
最初に取り出したゴールが最短になる理由
まず記号を決める。出発点から点までの本当の最短距離を、からゴールまでの本当の最短距離を、からまでの最短距離をと書く。のほうは、探している途中でまで見つかった経路のうち、いちばん短いものの長さだ。線の長さは正、見込みはどこでも本当の残り以下()、ゴールではとする。調べ終えた点にもっと短い経路が見つかったら、その点は候補に戻す。1968年の論文が示した手順も、この形だった。
-
最短経路を1本とり、とする。ゴールをまだ取り出していないとき、上でになっている調べ終えた点のうち、いちばん先にある点をとする。を調べたとき、上で次に来る点にはを通る長さ、つまり本当の最短距離が書き込まれた。が調べ終えた点ならの決め方に反するので、は候補に残っている。
-
は最短経路上にあるので、までの最短距離とから先の最短距離を足すと、全体の最短距離になる。
-
見込みが本当の残りを超えないことを使う。
-
遠回りでゴールに着いた経路が候補にあっても、なのではその経路の長さそのもので、より大きい。先に取り出されるのはのほうである。
-
したがって、ゴールが取り出されるのは、記録された長さがまで下がったときだけである。マス目のように点の数が有限なら、手順はいつか止まる。
証明を書き直す前、筆者は、見込みが探索を速くするのだから証明でも見込みが主役だろうと思っていた。
ところが手順1は、見込みに何も頼っていない。見込みが効くのは手順3の1行だけで、そこでが要る。1968年の論文は、こうして必ず最短経路を見つける探し方を許容的(admissible)と呼び、定理1として示した。
同じ不等式の鎖を使えば、見込みを倍したとき()に道がどこまで伸びるかも抑えられる。
-
で順番を決めると、手順3は次の形になる。
-
ゴールを取り出すときは候補の中でが最小なので、見つかる経路は最短の倍を超えない。
三角不等式があれば調べ直さない
1968年の論文には、もう1つの条件が出てくる。どの線についても、見込みが三角形の辺のような関係を満たすことだ。線の長さをと書く。
-
一貫性(consistency)の条件。1歩進んだ先の見込みに1歩の長さを足すと、元の点の見込み以上になる。
-
線の長さを、見込みの差で付け替える。条件1から、付け替えた長さは負にならない。
-
からまでの経路でを足すと、途中のは打ち消し合い、両端だけが残る。どの経路でも差は同じなので、で最短の経路はでも最短である。
-
Aが比べるは、で測ったからの長さに定数を足したものになる。つまりAは、付け替えた地図で動かすダイクストラ法そのものだ。
-
長さが負でない地図でダイクストラ法を使えば、取り出した点の長さはその時点で確定する。だからA*でも、調べ終えた点を候補に戻す必要がない。
直線距離は、この条件をいつも満たす。からへの道は直線より短くなれず、直線距離どうしには三角不等式が成り立つからで、論文も町と道路の例で同じ計算をしていた。オクタイル距離も同じで、1歩の長さ1かが、その1歩ぶんのオクタイル距離に等しい。
条件を破る例として、論文は、奇数番目の町には直線距離を、偶数番目の町には1を見込みに使う規則を挙げた。出発点の見込みが8なのに、そこから6だけ離れた偶数番目の町では見込みが1になり、で条件が崩れる。論文によれば、偶奇や乱数のように地図と関係なく点ごとに変わる値で見込みを作ると、条件は破れやすい。
1972年12月、3人は学会ACMの人工知能部会が出す会報に訂正を載せた。カリフォルニア州立大学フラトン校のロン・コールマンが、A*が調べる点は最も少ないという定理について、その証明が実は一貫性を使っていないと指摘したのである。それでも訂正は、調べ終えた点でとなる性質には一貫性が要り、この性質があれば調べ終えた点を候補に戻す処理を省けるとして、一貫性は「実用上の意味を持ちうる」と結んだ。
話はここで終わらなかった。1985年、リナ・デクターとジューディア・パールは、見込みが本当の距離を超えないことしか仮定しないなら、Aは調べる点が最も少ない手順ではなく、最も少ない手順はそもそも存在しないことを示した。見込みが一貫性も満たす場合に限って比べれば、Aはやはり最も少ない点で済む。
壁を描いて3つを比べる
網点が調べたマス、まばらな点が候補に入ったマス、塗りつぶしが壁で、斜めへは角の両側のマスが空いているときだけ進める。初めの地図で筆者が重みを2にすると、Aの調べるマスは150から102に減り、経路はまだ最短の28.14のままだった。3にすると94マスまで減ったが、経路は28.73と2.1%長い。Sを袋の左上の角のそばへ動かすと、貪欲法は袋に入り込んで下から回り、道は最短の18.49より5割以上長い28.49になる。同じ場所でAは、なら18マスで済むのに、では62マスを調べた。
部屋を走る台車と1968年の論文
ニルソンが1969年の論文で報告したロボットは、左右の車輪をステッピングモーターで回す台車で、動かせる「頭」にテレビカメラと光学式の距離計を載せていた。SRIがシェーキー(Shakey)と呼んで紹介しているロボットで、動かしていたのはSDS-940という計算機である。部屋の地図は4×4のマスを入れ子にしたもので、障害物で一部が埋まったマスだけをさらに4×4に分け、いちばん小さいマスは約30 cm(12インチ)だった。
道を決めるプログラムPLは、この地図で障害物の角に向き合う位置に点を置いた。論文の図では、出発点RからF、Iを通ってゴールGへ向かう道を最短と判断していて、使ったのは「ハートらが開発した最適なグラフ探索の手順」だと書かれている。まだ見ていない床を通る区間は、長さを係数倍して数えた。なら見ていない床を空いているとみなし、1より大きくすると、見て空いていると分かった床を通る道を選びやすくなる。SRIも2021年の記事で、A*を「シェーキーのために設計された」道案内の計算法と紹介している。
Aを示した論文の原稿が学会誌に届いたのは1967年11月24日で、掲載は1968年7月である。3人は冒頭で、道探しの研究を2つの流れに分けた。どんなグラフでも必ず最短経路を見つける数学の手順は、計算が実際にできるかより「最後に解に届くこと」に関心が向いている。一方、問題の知識で速く探す経験則の手順は、最短経路をいつも見つけるとは保証できない。Aは、その2つをつなぐ形で示された。
道路と公共交通の経路探索をまとめたバストらの2015年の総説は、A*を、優先順位を変えたダイクストラ法として説明する。ところが意外にも、1968年の論文が挙げた参考文献7件に、ダイクストラが1959年に書いた論文は入っていない。の場合について論文は、ミンティが私信で伝え、ポラックとウィーベンソンが総説で紹介した手順と「本質的に同じ」だと書いている。
論文の終わりには、見込みをどう選ぶかの損得も出てくる。平方根の計算さえ惜しいなら、でもよい。直線距離を超えないので、許容的なままだ。さらにを使うと許容的ではなくなるが、道路は直線よりかなり長いのがふつうなので、たいていは最短経路が得られ、調べる点も減ることが多いという。
2年後、IBMのアイラ・ポールは、とに重みをつけた評価を調べた。
ポールによれば、は辺の数で測ったムーアの迷路の解き方、はハートらの手順に近く、はドランとミッキーが1966年に発表したプログラム「グラフ・トラバーサー」の探し方にあたる。15パズルで試すと、を大きくするほど解の手数は長くなり、枝分かれは減った。両辺をで割れば、シミュレーションの重みになる。
UnityとGodotとDetourの見込み
ゲームエンジンの文書とソースを読むと、を守るための注意書きが、あちこちに見つかる。
Godotの文書によれば、AStar3Dの見込みを自分で書くときは距離の下限を返すべきで、そうすれば返る経路は最もコストの小さい経路になる。AStarGrid2Dは初めの設定で、斜めの移動を許し、見込みには直線距離を使う。見込みをマンハッタン距離に替えるなら、斜めを禁じるのが文書の想定である。斜めを許したまま替えると、図の例のように見込みが本当の距離を超え、最短でない経路が返りうる。
ナビゲーションメッシュの道探しでも、Godotの既定はA*だ。見つかった多角形の廊下には漏斗法(funnel algorithm)をかけて、廊下の中で最も短い道に直す。ただし、マス目のように多角形を並べた床では廊下がぎざぎざになり、斜めの移動に余計な角が出ることがあると、文書は注意を促している。
Unityの文書も、多角形をたどる道探しにAを使うと明記している。文書は仕事を2つに分けていて、Aが受け持つのは場面全体を見て目的地までの廊下を決めるほうだ。ほかのキャラクターとぶつからないよう速度を選び直す計算(RVO)は、もう一方の、進む向きと衝突だけを見る局所的な処理にあたる。
Recast Navigationは、READMEによれば多くのゲームとエンジンでナビゲーションを担うオープンソースのライブラリだ。道を探す部分Detourのソースを読むと、見込みはゴールまでの直線距離に定数H_SCALE = 0.999を掛けた値で、線の長さは2点の距離に床の種類ごとのコストを掛けて求めていた。コメントには、A*が正しく働くにはコストを移動の距離に比例させるべきで、「1.0より小さいコストの係数を入れると、道探しで問題が起きやすい」とある。コストが0.5の床なら、直線距離は本当の残りの2倍まで見込みすぎるのだ。筆者が読んだ範囲では、0.999を掛ける理由はソースに書かれていない。結果として、見込みは直線距離よりわずかに小さく保たれる。ゴールに届かないときに返すのは、候補に入れた点のうち見込みが最も小さい点、つまりゴールに直線で最も近い点までの経路。届かない相手を追うときも、行けるところまでは近づける。
道路の案内や乗り換え案内では、見込みづくりがもっと難しい。先に挙げたバストらの総説によれば、所要時間で測る道路網では、直線距離を最高速度で割った値が下限になるが、弱すぎて速くなる幅は小さいか、ほとんどない。分母を小さくして見込みを強めれば速くなるが、正しさは保証されなくなる。そこで、あらかじめ選んだ目印の点(ランドマーク)までの距離を全部の点について計算しておき、三角不等式で下限を作るALTという方法がある。
鉄道やバスで厄介なのは、同じ区間でも通れる時刻が決まっていること。同じ総説によれば、駅での出発と到着の出来事を点にした時間展開グラフを作ればダイクストラ法がそのまま使え、目的の駅に当たる点を最初に取り出したところが最も早い到着になる。グラフを作らずに、乗り換えの回数ごとに路線を順に調べるRAPTORという方法も、総説は紹介している。
自分のゲームで道探しを組むなら、次の順に進めるとよい。
- キャラクターの動き方を決める。縦横だけならマンハッタン距離を見込みにする。斜めの1歩をと数えるならオクタイル距離か直線距離、1と数えるならチェビシェフ距離を使う。
- 床の種類でコストを変えるなら、いちばん安いコストを見込みに掛けて、下限を保つ。
- 壁をでたらめに置いた地図を何百枚も作り、ダイクストラ法とA*の経路の長さが一致するかを比べる。
- 調べる数を減らしたいときは重みを少しずつ上げ、調べる数と経路の伸びを両方測る。伸びは倍を超えないが、調べる数が減るとは限らない。
冒頭の地図で489マスが150マスに減ったのは、出発点の後ろや、地図の上下の端、壁の向こうに広がる床を調べずに済んだからだ。見込みが本当の距離を超えない限り、その節約は経路の長さにひびかない。1969年の台車から今のゲームエンジンまで、最短の約束を支えているのはという1行の不等式である。
参考文献
- P. E. Hart, N. J. Nilsson, B. Raphael, "A Formal Basis for the Heuristic Determination of Minimum Cost Paths", IEEE Transactions on Systems Science and Cybernetics 4(2) (1968), 100-107. DOI 10.1109/TSSC.1968.300136(書誌はCrossref。本文はサウスカロライナ大学の講義のページにある写しで確認)
- P. E. Hart, N. J. Nilsson, B. Raphael, "Correction to 'A Formal Basis for the Heuristic Determination of Minimum Cost Paths'", SIGART Newsletter 37 (December 1972), 28-29. DOI 10.1145/1056777.1056779(本文は同じ講義のページにある写しで確認)
- E. W. Dijkstra, "A note on two problems in connexion with graphs", Numerische Mathematik 1 (1959), 269-271. DOI 10.1007/BF01386390(本文はCWIの機関リポジトリで確認)
- N. J. Nilsson, "A Mobile Automaton: An Application of Artificial Intelligence Techniques", Proceedings of the First International Joint Conference on Artificial Intelligence (1969), 509-520(IJCAIの公開の論文集)
- I. Pohl, "Heuristic search viewed as path finding in a graph", Artificial Intelligence 1(3-4) (1970), 193-204. DOI 10.1016/0004-3702(70)90007-X(書誌はCrossref。本文はサウスカロライナ大学の講義のページにある写しで確認)
- SRI International, "75 Years of Innovation: Shakey the Robot"(2021年4月3日)
- Unity Technologies, AI Navigation 2.0 manual, "Inner Workings of the Navigation System"
- Godot Engine 4.7 documentation, AStar3D、AStarGrid2D、NavigationPathQueryParameters2D
- Recast Navigation, README.mdとDetour/Source/DetourNavMeshQuery.cpp(GitHubのmainブランチ、2026年10月31日に参照)
- H. Bast, D. Delling, A. Goldberg, M. Müller-Hannemann, T. Pajor, P. Sanders, D. Wagner, R. F. Werneck, "Route Planning in Transportation Networks", arXiv:1504.05140 (2015)
- R. Dechter, J. Pearl, "Generalized best-first search strategies and the optimality of A*", Journal of the ACM 32(3) (1985), 505-536. DOI 10.1145/3828.3830(書誌と抄録はCrossref)