A*

A*（A-star、エースター）探索アルゴリズム（エースターたんさくアルゴリズム）は、グラフ探索アルゴリズムの一つ。
最良優先探索を拡張したZ*に、さらにf値として「現時点までの距離」g と「ゴールまでの推定値」h の和を採用したもの。h は ヒューリスティック関数と呼ばれる。
概要.
A* アルゴリズムは、「グラフ上でスタートからゴールまでの道を見つける」というグラフ探索問題において、 ヒューリスティック関数 "h(n)" という探索の道標となる関数を用いて探索を行うアルゴリズムである。h は各頂点 n からゴールまでの距離のある妥当な推定値を返す関数で、解くグラフ探索問題の種類に応じてさまざまな h を設計することが出来る。 例えば、カーナビなどで用いられる単純な二次元の地図での探索では、h としてユークリッド距離 formula_1 を使うことができ、この値は道に沿った実際の距離のおおまかな予測になっている。しかし、高次元空間でのグラフ探索を効率的に行うためには、より高度に設計された関数を用いる必要がある。例えば、15パズルにおいてはマンハッタン距離やパターンデータベース、STRIPSプランニングにおいてはFFヒューリスティック、Merge-and-Shrink、Landmark-Cut などがある。
A* アルゴリズムは、ダイクストラ法を推定値付きの場合に一般化したもので、h が恒等的に 0 である場合はもとのダイクストラ法に一致する。
A* の探索効率は h の正確さに左右される。
もしも h がまったくでたらめな値を返すならば、探索はゴールとはあさっての方向に進んでしまい、現実的な時間内（一時間、一週間、一年）では解を発見できない場合がある。しかし、いくらおかしな方向に探索が進んだとしても、いつかは必ず解を発見できる保証がある（完全性）。
一方、h が常に正しい値 "h*" を返す場合、計算機は「迷うこと無く=分岐をすること無く」グラフ上の最短経路を発見することができる。そのような h のことを、パーフェクト・ヒューリスティクスとよぶ。
現実に用いられる有用な h は、これらの中間の位置にある。
歴史.
A* アルゴリズムは1968年に Peter E. Hart、Nils J. Nilsson、Bertram Raphael の三人が発表した論文の中で最初に記述された。A* というこの一風変わった名前は、この論文でスタートからゴールまでの最短経路を確実に見つけるアルゴリズムを許容的（）と呼び、論文の数式中に 許容的なアルゴリズムの集合を A と表し、そのAの中でも評価回数が最適になる物を A* と表記していたためである。
A*の考え方.
スタートノードから、あるノード "n" を通って、ゴールノードまでたどり着くときの最短経路を考える。このときこの最短経路のコストを "f* (n)" とおくと、
と置くことが出来る。ここで "g* (n)" はスタートノードから "n" までの最小コスト、"h* (n)" は "n" からゴールノードまでの最小コストである。もし "g* (n)" の値と "h* (n)"の値を知っていれば、全体の最短経路 "f* (n)" は容易に求まる。しかしながら実際には "g* (n)" と "h* (n)" をあらかじめ与えることは出来ない。そこで "f* (n)" を次のような推定値 "f (n)" に置き換えることを考える。
ここで "g(n)" はスタートノードから "n" までの最小コストの推定値、"h(n)" は "n" からゴールノードまでの最小コストの推定値である。この場合 "g" に関しては探索の過程で更新を加えることにより "g*" に近づけてゆくことができるが、"h*" は、実際にゴールに辿り着くまでは誰にもわからない。そこで、"h(n)" には人間が（ある程度妥当性を持つように）設計した推定値を与えることにする。このアルゴリズムを A*探索アルゴリズムといい、"h (n)" をヒューリスティック関数という。
アルゴリズムの流れ.
A* のアルゴリズムの実装を以下に示す。この OPENリスト実装は後に述べるように遅いことを記しておく。
以上の流れを見れば、アルゴリズムが手続き的で、並列化が非常に難しいことがわかる。しかし、近年では HDA*、PBFS などの並列手法が開発され、特に HDA* は768コア以上の大規模並列計算環境にもスケールすることが実証されている。
実際に使われているOPEN/CLOSEリストの実装.
OPEN/CLOSEリストに登録されているノードの数が多い場合、ノードの展開ごとに子ノード m をOPENから CLOSE へ移動（あるいは逆）するのは非常に高価な操作である。
たとえば、OPEN/CLOSEリストが2分探索木（赤黒木など）で実装されている場合、まずノードの探すのに formula_27 かかり（ノードのIDで検索）、また削除にも formula_27 かかる。配列の場合には削除により大きなコストがかかる。
しかし、データ構造を工夫することで、より効率よい実装を行うことが出来る。ノードを OPEN/CLOSEリスト間で行ったり来たりさせる代わりに、以下のように実装する:
性質.
A* の性質は h の性質によって大きく左右される。
このとき、A*の返す経路は最適、つまり最短経路である。
このアルゴリズムはCPUの使用率、メモリの使用率など、計算負荷は高いが、問題に応じた適切なヒューリスティック関数を用いることにより、問題に対しての最適化が可能である。
部分問題に分割する場合.
分割統治法のように、部分問題に分割したうえで全体問題を解いた方が効率的な問題もある。A* 同様の通常の状態遷移はどれかがゴールに到達すれば良いので OR と呼び、部分問題に分割する場合は全ての部分問題が解けないといけないので AND と呼ぶと、探索木が AND/OR 木になる。AND で状態を分割する際、ゴールも分割する必要がある。
同じ状態が2度出現した場合に1つのノードにまとめると AND/OR グラフになる。閉路のない AND/OR グラフに対する A* アルゴリズムに対応する物が1968年に開発され、1980年に AO*アルゴリズム と命名された。閉路のある AND/OR グラフに対する A* アルゴリズムに対応する A0アルゴリズム は1976年に開発された。AND ノードのコストを「辺のコスト＋部分問題のコストの最大値」や「辺のコスト＋部分問題のコストの総和」などの単調非減少関数で定義すると、ヒューリスティック関数が許容的であれば、A* 同様、最適解が求まる。なお、閉路のない AND/OR グラフは文脈自由文法（タイプ-2 文法）、閉路のある AND/OR グラフは制限のない文法（タイプ-0 文法）に1対1対応することが証明されている。