(Translated by https://www.hiragana.jp/)
A* - Wikipedia

A*(A-star、エースター)探索たんさくアルゴリズム(エースターたんさくアルゴリズム)は、グラフ探索たんさくアルゴリズムひとつ。 最良さいりょう優先ゆうせん探索たんさく拡張かくちょうしたZ*に、さらにfとして「現時点げんじてんまでの距離きょり」g と「ゴールまでの推定すいてい」h の採用さいようしたもの[1]。h は ヒューリスティック関数かんすうばれる。

A*探索たんさくアルゴリズム

概要がいよう

編集へんしゅう

A* アルゴリズムは、「グラフじょうでスタートからゴールまでのみちつける」というグラフ探索たんさく問題もんだいにおいて、 ヒューリスティック関数かんすう h(n) という探索たんさく道標どうひょうとなる関数かんすうもちいて探索たんさくおこなうアルゴリズムである。h はかく頂点ちょうてん n からゴールまでの距離きょりのある妥当だとう推定すいていかえ関数かんすうで、くグラフ探索たんさく問題もんだい種類しゅるいおうじてさまざまな h を設計せっけいすることが出来できる。 たとえば、カーナビなどでもちいられる単純たんじゅん次元じげん地図ちずでの探索たんさくでは、h としてユークリッド距離きょり  使つかうことができ、このみち沿った実際じっさい距離きょりのおおまかな予測よそくになっている。しかし、高次こうじもと空間くうかんでのグラフ探索たんさく効率こうりつてきおこなうためには、より高度こうど設計せっけいされた関数かんすうもちいる必要ひつようがある。たとえば、15パズルにおいてはマンハッタン距離きょりパターンデータベースSTRIPSプランニングにおいてはFFヒューリスティック[2]Merge-and-Shrink[2]Landmark-Cut[3] などがある。

A* アルゴリズムは、ダイクストラほう推定すいていきの場合ばあい一般いっぱんしたもので、h が恒等こうとうてきに 0 である場合ばあいはもとのダイクストラほう一致いっちする。

A* の探索たんさく効率こうりつは h の正確せいかくさに左右さゆうされる。 もしも h がまったくでたらめなかえすならば、探索たんさくはゴールとはあさっての方向ほうこうすすんでしまい、現実げんじつてき時間じかんない一時いちじあいだいち週間しゅうかんいちねん)ではかい発見はっけんできない場合ばあいがある。しかし、いくらおかしな方向ほうこう探索たんさくすすんだとしても、いつかはかならかい発見はっけんできる保証ほしょうがある(完全かんぜんせい)。 一方いっぽう、h がつねただしい h*かえ場合ばあい計算けいさんは「まようことく=分岐ぶんきをすることく」グラフじょう最短さいたん経路けいろ発見はっけんすることができる。そのような h のことを、パーフェクト・ヒューリスティクスとよぶ[4]現実げんじつもちいられる有用ゆうような h は、これらの中間ちゅうかん位置いちにある。

A* アルゴリズムは1968ねんPeter E. HartNils J. NilssonBertram Raphaelさんにん発表はっぴょうした論文ろんぶん[5]なか最初さいしょ記述きじゅつされた。A* というこの一風いっぷうわった名前なまえは、この論文ろんぶんでスタートからゴールまでの最短さいたん経路けいろ確実かくじつつけるアルゴリズムを許容きょようてきえい: admissible)とび、論文ろんぶん数式すうしきちゅう許容きょようてきなアルゴリズムの集合しゅうごうAあらわし、そのAなかでも評価ひょうか回数かいすう最適さいてきになるものA*表記ひょうきしていたためである[6]

A*のかんがかた

編集へんしゅう

スタートノードから、あるノード nとおって、ゴールノードまでたどりくときの最短さいたん経路けいろかんがえる。このときこの最短さいたん経路けいろのコストを f* (n) とおくと、

f* (n)= g* (n) + h* (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リスト実装じっそうのちべるようにおそいことをしるしておく。

  1. スタートノード( )を作成さくせいする。また計算けいさんちゅうのノードを格納かくのうしておくための優先ゆうせんきキュー OPENリストと、計算けいさんみのノードを格納かくのうしておくCLOSEリスト用意よういする。(名前なまえは「リスト」だが、これらの実際じっさいのデータ構造こうぞうかならずしも連結れんけつリストである必要ひつようはない。)
  2. ゴールはかならずしもひとつである必要ひつようはないので、ゴール条件じょうけんたすノード集合しゅうごう ぶことにする。
  3. スタートノードを Openリストに追加ついかする、このとき   =   であり   =   となる。また Closeリストはそらにする。
  4. Openリストがそらなら探索たんさく失敗しっぱいとする(スタートからゴールにたどりくような経路けいろ存在そんざいしなかったことになる)。
  5. Openリストに格納かくのうされているノードのうち最小さいしょう つノード   を1つす。おな つノードが複数ふくすうある場合ばあい、タイブレーク手法しゅほうによりどれかのノードを選択せんたくする。
  6.   であるなら探索たんさく終了しゅうりょうする。それ以外いがい場合ばあい  を Close リストにうつす。
  7.  隣接りんせつしているすべてのノード(ここでは隣接りんせつノードを   とおく)にたいして以下いか操作そうさおこな
    1.  計算けいさんする、ここで   はノード n から m へ移動いどうするときのコストである。また   もとめることができる。
    2. m の状態じょうたいおうじて以下いか操作そうさおこな
      • m が Openリストにも Closeリストにもふくまれていない場合ばあい   とし m を Openリストに追加ついかする。このとき m のおやを n として記録きろくする。
      • m が Openリストにある場合ばあい  であるなら、m を Open から削除さくじょし、 え、ふたたび Open に挿入そうにゅうする(Open がまさしくソートされていることを保証ほしょうするため)。また、記録きろくしてある m のおやを n にえる。
      • m が Closeリストにある場合ばあい  であるなら   として m を Openリストに移動いどうする。また記録きろくしてある m のおやを n にえる。
  8. 3 以降いこうかえす。
  9. 探索たんさく終了しゅうりょう発見はっけんされたゴール   からおや順次じゅんじたどっていくと S から ゴール   までの最短さいたん経路けいろられる。

以上いじょうながれをれば、アルゴリズムが手続てつづてきで、並列へいれつ非常ひじょうむずかしいことがわかる。しかし、近年きんねんでは HDA*[7]PBFS などの並列へいれつ手法しゅほう開発かいはつされ、とくに HDA* は768コア以上いじょうだい規模きぼ並列へいれつ計算けいさん環境かんきょうにもスケールすることが実証じっしょうされている。

実際じっさい使つかわれているOPEN/CLOSEリストの実装じっそう

編集へんしゅう

OPEN/CLOSEリストに登録とうろくされているノードのかずおお場合ばあい、ノードの展開てんかいごとにノード m をOPENから CLOSE へ移動いどう(あるいはぎゃく)するのは非常ひじょう高価こうか操作そうさである。 たとえば、OPEN/CLOSEリストが2ふん探索たんさくあか黒木くろきなど)で実装じっそうされている場合ばあい、まずノードのさがすのに   かかり(ノードのIDで検索けんさく)、また削除さくじょにも   かかる。配列はいれつ場合ばあいには削除さくじょによりおおきなコストがかかる。

しかし、データ構造こうぞう工夫くふうすることで、より効率こうりつよい実装じっそうおこなうことが出来できる。ノードを OPEN/CLOSEリストあいだおこなったりたりさせるわりに、以下いかのように実装じっそうする[8]:

  1. それぞれのノードに、ノードの状態じょうたいとして OPEN, CLOSE の2種類しゅるいのタグをもたせる。すべてのノードははじめOPENである。
  2. ノードに一意いちい整数せいすう ID をもたせる。
  3. また、ID からノードを  参照さんしょうできるハッシュテーブル用意よういする。
  4. OPEN にノードを追加ついかするさいには、m が Openリストにふくまれているかは検証けんしょうせず、重複じゅうふくゆるして追加ついかする。かつ、このときノードではなく ID のみを追加ついかする。
    1. ID は整数せいすう1つぶんなので、重複じゅうふくのオーバーヘッドを最小さいしょう出来できる。
  5. OPEN からノードを pop するさい、pop したノードの状態じょうたいが OPEN であれば展開てんかいおこなうが、CLOSE であればたんにスキップする。
    1. このことにより、重複じゅうふくがあってもおなじノードを無駄むだ展開てんかいしないようにできる。
    2. このことにより、OPENリストは、fによる優先ゆうせんきキューした先入さきい先出さきだし/先入さきいのキューを用意よういすることで実装じっそうできる。
    3. ノードの検索けんさくがおこなわれず、かつ削除さくじょ先頭せんとうあるいは末尾まつびにしかおこらないので、効率こうりつてき実装じっそう可能かのうである。
  6. CLOSEリストは使用しようしない。
  7. fによる優先ゆうせんきキューは、あたりのコストが1である場合ばあいにはたんにfごとの可変かへん配列はいれつにしたほうが高速こうそく操作そうさ可能かのうである。
    1. あたりのコストに大幅おおはばなばらつきがある場合ばあいには、ヒープとして実装じっそうしたほうがよい。

性質せいしつ

編集へんしゅう

A* の性質せいしつは h の性質せいしつによっておおきく左右さゆうされる。

  • A* はダイクストラの一般いっぱんであり、ダイクストラと同様どうよう、グラフにまけのコストのあたりがあれば完全かんぜんせいうしなう。その場合ばあいにはベルマン–フォードほうもちいる。
  • h(n) はつね非負ひふでなくてはならない。
  • あるヒューリスティクス h(n) が すべてのノード n について しんのゴール距離きょり h*(n) を上回うわまわらない場合ばあい、h は Admissible/許容きょようてきであるとう。
 

このとき、A*のかえ経路けいろ最適さいてき、つまり最短さいたん経路けいろである。

  • あるヒューリスティクス h(n) について、すべてのノード n と、それに隣接りんせつしているノード m について   である場合ばあい、その h はconsistent/無矛盾むむじゅんであるという。
  • consistent な h は、つねに admissible である[9]
  • ある2つのヒューリスティック関数かんすう h1, h2 について、 とき、 h2 は h1 を支配しはいする (dominate) とよぶ。このとき、とく両者りょうしゃ許容きょようてき場合ばあい、h2 をもちいた探索たんさくはより効率こうりつてきだろうとかんがえられている。しかし、いくつかのコーナーケースではこのことはりたない[10]

このアルゴリズムはCPU使用しようりつメモリ使用しようりつなど、計算けいさん負荷ふかたかいが、問題もんだいおうじた適切てきせつなヒューリスティック関数かんすうもちいることにより、問題もんだいたいしての最適さいてき可能かのうである。

部分ぶぶん問題もんだい分割ぶんかつする場合ばあい

編集へんしゅう

分割ぶんかつ統治とうちほうのように、部分ぶぶん問題もんだい分割ぶんかつしたうえで全体ぜんたい問題もんだいいたほう効率こうりつてき問題もんだいもある。A* 同様どうよう通常つうじょう状態じょうたい遷移せんいはどれかがゴールに到達とうたつすればいので OR とび、部分ぶぶん問題もんだい分割ぶんかつする場合ばあいすべての部分ぶぶん問題もんだいけないといけないので AND とぶと、探索たんさくが AND/OR になる。AND で状態じょうたい分割ぶんかつするさい、ゴールも分割ぶんかつする必要ひつようがある。

おな状態じょうたいが2出現しゅつげんした場合ばあいに1つのノードにまとめると AND/OR グラフになる。閉路へいろのない AND/OR グラフにたいする A* アルゴリズムに対応たいおうするもの1968ねん開発かいはつされ[11]1980ねんAO*アルゴリズム命名めいめいされた[6]閉路へいろのある AND/OR グラフにたいする A* アルゴリズムに対応たいおうする A0アルゴリズム1976ねん開発かいはつされた[12]。AND ノードのコストを「あたりのコスト+部分ぶぶん問題もんだいのコストの最大さいだい」や「あたりのコスト+部分ぶぶん問題もんだいのコストの総和そうわ」などの単調たんちょう減少げんしょう関数かんすう定義ていぎすると[13]、ヒューリスティック関数かんすう許容きょようてきであれば、A* 同様どうよう最適さいてきかいもとまる。なお、閉路へいろのない AND/OR グラフは文脈ぶんみゃく自由じゆう文法ぶんぽう(タイプ-2 文法ぶんぽう[14]閉路へいろのある AND/OR グラフは制限せいげんのない文法ぶんぽう(タイプ-0 文法ぶんぽう)に1たい1対応たいおうすることが証明しょうめいされている。

関連かんれん項目こうもく

編集へんしゅう

参照さんしょう

編集へんしゅう
  1. ^ Pearl, Judea (1984) (English). "Heuristics intelligent search strategies for computer problem solving". Addison-Wesley. ISBN 0201055945 
  2. ^ a b Hoffmann, Jörg, and Bernhard Nebel. "The FF planning system: Fast plan generation through heuristic search." Journal of Artificial Intelligence Research (2001): 253-302.
  3. ^ Helmert, Malte, and Carmel Domshlak. "Landmarks, critical paths and abstractions: what's the difference anyway?." ICAPS. 2009.
  4. ^ How Good is Almost Perfect?. M Helmert, G Röger - AAAI, 2008
  5. ^ Peter E. Hart; Nils J. Nilsson; Bertram Raphael (July 1968). “A Formal Basis for the Heuristic Determination of Minimal Cost Paths”. IEEE Transactions on Systems Science and Cybernetics 4 (2): 100-107. doi:10.1109/TSSC.1968.300136. ISSN 0536-1567. http://ai.stanford.edu/~nilsson/OnlinePubs-Nils/PublishedPapers/astar.pdf. 
  6. ^ a b Nils J. Nilsson ちょ白井しらい良明よしあき, 辻井つじい潤一じゅんいち, 佐藤さとう泰介たいすけ やく人工じんこう知能ちのう原理げんり日本にっぽんコンピュータ協会きょうかい、1983ねん1がつ15にち原著げんちょ1980ねん)。ISBN 4-88917-026-X 
  7. ^ Kishimoto, Akihiro, Alex S. Fukunaga, and Adi Botea. "Scalable, Parallel Best-First Search for Optimal Sequential Planning." ICAPS. 2009.
  8. ^ Burns, E. A., Hatem, M., Leighton, M. J., & Ruml, W. (2012, July). Implementing fast heuristic search code. In Fifth Annual Symposium on Combinatorial Search. https://www.aaai.org/ocs/index.php/SOCS/SOCS12/paper/view/5404/5173
  9. ^ Russel, Norvig, Artificial intelligence: a modern approach
  10. ^ Robert C. Holte. Common Misconceptions Concerning Heuristic Search, SoCS 2010
  11. ^ Nils J. Nilsson (August 1968). “Searching problem-solving and game-playing trees for minimal cost solutions”. Information Processing 68 : proceedings of IFIP Congress 1968 (Amsterdam : North-Holland) 2: 1556-1562. 
  12. ^ Giorgio Levi; Franco Sirovich (January 1976). “Generalized and/or graphs”. Artificial Intelligence 7 (3): 243-259. doi:10.1016/0004-3702(76)90006-0. http://www.sciencedirect.com/science/article/pii/0004370276900060. 
  13. ^ Vipin Kumar; Dana S. Nau; Laveen N. Kanal (August 1985). A General Paradigm for AND/OR Graph and Game Tree Search. http://www.cs.utexas.edu/ftp/AI-Lab/tech-reports/UT-AI-TR-85-9.pdf. 
  14. ^ Patrick A. V. Hall (July 1973). “Equivalence between AND/OR graphs and context-free grammars”. Communications of the ACM 16 (7): 444-445. doi:10.1145/362280.362302. http://dl.acm.org/citation.cfm?id=362302.