Russel & Norvig の本は、これらのアルゴリズムに関する優れたリファレンスです。しかし、IDA* が A* よりもかなり難しいという点には同意しません。スライディング ブロック パズルを解くために AI を書かなければならないプロジェクトのために、これを行いました。これは、番号付きのタイルの N x N グリッドを持ち、単一の空きスペースを使用して、タイルが移動するまでタイルをスライドさせるというおなじみの問題です。昇順で。
想起:
F(n) = g(n) + h(n).
TotalCost = PathCost + Heuristic.
g(n) = パス コスト、初期状態から現在の状態までの距離
h(n) = ヒューリスティック、現在の状態から最終状態までのコストの見積もり。許容できるヒューリスティックである (したがって A* の最適性を保証する) ために、コストを過大評価することはできません。A* に対するヒューリスティックの過大評価/過小評価の影響の詳細については、この質問を参照してください。
Iterative Deepening A* は単なるA* であり、通過できるノードの F 値に制限があることに注意してください。これFLimit
は、外側の反復ごとに増加します。反復するたびに、検索を深めています。
前述のスライディング ブロック パズルを解くために A* と IDA* の両方を実装するC++ コードを次に示します。std::priority_queue
カスタム Comparator でを使用して、F 値によって優先順位付けされたキューにパズルの状態を格納していることがわかります。また、A* と IDA* の唯一の違いは、FLimit
チェックの追加と、 this をインクリメントする外部ループであることにも注意してくださいFLimit
。これがこの問題に光を当てるのに役立つことを願っています。