世界を動かす技術を、日本語で。

A*アルゴリズム入門 (2014)

概要

  • グラフ探索アルゴリズム は、地図上で最短経路を見つける手法
  • A* は最短経路探索の代表的なアルゴリズム
  • Breadth First SearchDijkstra’s Algorithm など他の手法との違い
  • 入力 はノードとエッジからなるグラフ、 出力 は経路情報
  • コストやヒューリスティック を活用した応用例も多数

グラフ探索アルゴリズムの概要

  • グラフ探索アルゴリズム は、地図やネットワークをグラフとして表現し、最短経路や到達可能範囲を計算する手法
  • A* アルゴリズムは、最短経路探索に特化した代表的な手法
  • 他にも Breadth First Search(幅優先探索)Dijkstra’s AlgorithmGreedy Best First Search などのバリエーション
  • 応用例として、距離マップ、フローフィールド、マップ解析、ガベージコレクション、フローネットワーク、マップ自動生成など
  • グラフ設計やノード・エッジの抽象化により、様々な問題へ応用可能

グラフの表現と入出力

  • 入力:ノード(地点)とエッジ(接続)からなるグラフ構造
  • A* や他の探索アルゴリズムは、グラフ以外の情報(室内・屋外、部屋・ドアなど)を認識しない
  • 出力:A* が見つけた経路(ノード列またはエッジ列)
  • エッジの意味(直線移動、ドア開閉、水泳など)はアルゴリズム外で解釈が必要
  • グラフ設計の工夫により、問題に適した経路探索が可能

幅優先探索(Breadth First Search)

  • フロンティア(探索範囲) を拡張しながら全体を探索する手法
  • グリッド上では「フラッドフィル」とも呼ばれる
  • キュー を用いて未訪問ノードを管理
  • 探索履歴(came_from) を記録することで、経路の復元が可能
  • 体言止め例:
    • 塔防ゲーム距離マップマップ生成 など多用途

    • 経路復元 はゴールからスタートまで矢印を逆辿り

    • 部屋やドア をノード・エッジとして抽象化

早期終了(Early Exit)

  • ゴールノード に到達した時点で探索を打ち切る手法
  • キューからノードを取り出す際 にゴール判定を行うことで汎用性を確保
  • 体言止め例:
    • 経路探索の高速化

    • 早期終了条件の実装

移動コスト対応(Dijkstra’s Algorithm)

  • 移動コスト が異なる場合の最短経路探索
  • 優先度付きキュー を利用し、コストが小さいノードから探索
  • cost_so_far で各ノードまでの累積コストを管理
  • 体言止め例:
    • 地形ごとのコスト差

    • 敵・味方との距離によるコスト調整

    • PythonのheapqやC++のstd::priority_queueで実装

ヒューリスティック探索(Greedy Best First Search)

  • ヒューリスティック関数 (例:マンハッタン距離)でゴールへの近さを評価
  • 優先度付きキュー でゴールに近いノードから探索
  • コストを考慮しないため、最短経路にならない場合もある
  • 体言止め例:
    • 障害物が少ない場合の高速探索

    • 複雑な地形では非最適経路

A*アルゴリズム

  • Dijkstra’s AlgorithmGreedy Best First Search の長所を組み合わせた手法
  • 実際の移動コストヒューリスティック値 の合計で優先度を決定
  • 最短経路の発見と探索効率の両立
  • 体言止め例:
    • 最短経路保証

    • 無駄な探索範囲の削減

    • 幅広い応用分野


まとめ

  • グラフ探索アルゴリズム は、ゲームや地図、AIなど多分野で活用
  • A* は最短経路探索の定番手法
  • グラフ設計コスト・ヒューリスティック の工夫による応用範囲拡大
  • 実装や用途に応じたアルゴリズム選択 が重要

Hackerたちの意見

Red Blob Gamesはゲーム開発に興味があるならめっちゃいいブログだよ。説明がしっかりしてるし、ほとんどの投稿には擬似コードか実装があるし、大きめの投稿には直感を養うための素晴らしいアニメーションもあるんだ。

Advent of Codeのチャレンジの一つに六角グリッドのパズルがあったのを覚えてる。Red Blob Gamesの六角グリッドガイドがめっちゃ良かったから、そのサイトは一時的にアクセスが集中してダウンしちゃったんだ。後で文明クローンを作る時にも使ったけど、素晴らしいリソースだよ。 https://www.redblobgames.com/grids/hexagons/

同じこと言いに来た!Red Blob Gamesは、ゲーム開発に興味がある人には本当に宝の山だよね。

Red Blob Gamesは「amitp」でもあるんだ。彼は初期のGoogle社員の一人だよ。#7かそのくらい。

これが昔「AI」って呼ばれてたのは面白いね。今は「AI」がDLの一部であるgenAIを指すようになったから、人工知能の傘下の分野を何て呼ぶかまだ考えてるところなんだ。

「AI」の定義は長い間、基本的に「どうにかこうにか動いてるけど、実際に理解してる人は少数」って感じで、常に変わるものだよね。未来のある時点では、今使ってるLLMはもうAIとは呼ばれなくなるかもしれない。

大学院で「ゲームAI」のコースを受けたことがあって、そこでいろんな経路探索のアプローチや意思決定の方法をMLやAIから離れた有用な枠組みにまとめてたんだ。

これが昔「AI」って呼ばれてたのは面白いね。過去にゲームで「AI」と呼ばれていたものは豊富で多様で、コンピュータ制御の敵がプレイヤーを「見て」攻撃したり、近づいたり、離れたりするところまで遡ることができるんだ。NPCを制御するコードは、たとえそのコードが単純なルールを適用しているだけでも「ゲームのAI」と呼ばれていたよ。「AI」はゲームの中では他の分野での「AI」と比べてずっと意味が薄かったけど、今や「AI」があらゆる文脈で使われるようになってきたから、もうすぐそうではなくなるだろうね。

初期のAIは、単に古典的なデータ構造やアルゴリズムを使ったものが多かったよね。パーセプトロンは何十年も前からあるけど。

「人工知能」って、ずっとマーケティング用語であって、技術的なものじゃないんだよね。ジョン・マッカーシーがDARPAの助成金申請の時にこのフレーズを作ったんだけど、審査員にカッコよく聞こえると思って選んだらしいよ。

これが昔「AI」と呼ばれていたのは面白いね。大学のAIラボでA*について学んだのを覚えてる。今ではこれらのことが当たり前に思えるし、ちょっと trivial に感じるね。歳を取るってこういうことなんだな。

記事は明確に一つの場所でこう言ってるわけじゃないけど、競技プログラミングをやってた頃にAを「実用的で覚えやすい」観点から考えてたのは、全部同じアルゴリズムだけど、優先度キューの優先順位が違うってことだね。幅優先探索:優先順位はエッジの発見順(つまり、優先度キューなしの普通のキュー) ダイクストラ:優先順位はこれまでの距離 + 次のエッジの距離 A:優先順位はこれまでの距離 + 次のエッジの距離 + 目標ノードまでの距離の推定。これで推定が過小評価か過大評価かを覚えるのにも役立つよ。ダイクストラが推定を「0」にしてるから、明らかに「許容可能なヒューリスティック」の基準は過小評価でなきゃいけないんだ。

それに深さ優先探索はただのスタックだよ!

みんなループしてるだけじゃないの???

幅優先探索はキュー、深さ優先探索はスタック、A*は優先キューだね。

ちょっと単純すぎる質問かもしれないけど、これってどう発音するの?エースター?アスタリスク?

エイ・スター。

パスファインディングのビジュアライゼーション、A*を強調してるよ: https://youtube.com/shorts/L8t0tt1Vrsw

Aが大好きなんだ。最初に完全に理解した複雑なアルゴリズムだったから。大学のデータ構造とアルゴリズムの授業(2000年代初頭)で、研究するアルゴリズムを選んでコーディングして論文を書くって課題があって、Aを選んだんだ。この記事の著者が作ったのと似たグリッドを何時間もかけて手描きして、計算も手動でやってたよ[0]。今でもそのノートどこかに残ってる、もう20年以上前のものだけど、頑張って作ったから誇りに思ってるんだ。とにかく、この記事と懐かしい思い出をありがとう。[0] https://imgur.com/a/zRYaodL(Imgurのリンクごめんね)

面白いことに、これを見てノスタルジーを感じたよ。昔、学校のプロジェクトでこのチュートリアルを使ってA*を学んだんだ。

誰かガーミンのバカたちにこれを送って!彼らのナビゲーターは、山や水をまっすぐ横切って到達不可能な目的地に行けって言うから。まるで「わからない」って言わないAIみたいだよ。

A*のベストな入門はルーマニア旅行だと思う :) AI: A Modern Approach。

ブカレストに行くときはいつもA*を使ってるよ。