2010-12-06 3 views
7

これらの2つのアルゴリズムの利点と欠点は何ですか? AddEmUp C++を解決したいと思っていますが、(IDAまたはDFID)アルゴリズムを使用するかどうかはわかりません。DFID(Dept-First Iterative Deeping)対IDA *(反復盗聴A *)

私が見つけた最高の記事はthis oneですが、それは古すぎるようです - 93。それより新しい?

私はIDA *が良いと思うけど...?他のアイデア?

任意のアイデアや情報が参考になります。

ありがとうございます! (:

EDIT: IDA *とアルゴリズムの良い説明についていくつかの良い記事

EDIT2:??か、そのゲームのためのいくつかの良いヒューリスティック機能私はどのようにいくつかを考えるには考えています。/

+0

DFIDはヒューリスティック関数が常に0のIDA *の特殊なケースではありませんか?だから本質的にあなたはヒューリスティックな機能を使うべきかどうかを尋ねています。 – huaiyuan

+1

@huaiyuan:これは特別なケースですが、有用な意味ではありません。 –

答えて

10

The Russel & Norvigの本は、これらのアルゴリズムに関する優れたリファレンスであり、私はlarsmansにそれを提案するためのバーチャルハイレベルを与えます。しかし、私はIDA *がA *よりプログラムするのがかなり難しいとは考えていません。私は、スライディングブロックパズルを解決するためにAIを書く必要があったプロジェクトのためにそれをやってきました.N x Nグリッドの番号付きタイルを持ち、1つのフリースペースを使ってタイルをスライドさせて昇順で

リコール:

F(n) = g(n) + h(n). 

TotalCost = PathCost + Heuristic. 

G(N)=パスコスト、現在の状態に初期

H(N)=ヒューリスティック、現在の状態からコストの見積もりからの距離終了状態にする。許容ヒューリスティックである(したがってA *の最適性を保証する)ためには、いかなる場合でもコストを過大評価することはできません。 See this question for more info on the effects of overestimating/underestimating heuristics on A*

は、反復は、あなたがを通過することを許可されたノードのF値の上限である*ちょうど A *を深めることを覚えておいてください。このFLimitは外側の反復ごとに増加します。各反復であなたは深化です。

Here's my C++ code前述のスライドブロックパズルを解くためにA *とIDA *の両方を実装します。カスタムのComparatorでstd::priority_queueを使用して、F値によって優先順位が付けられたキューにパズル状態を格納することがわかります。また、A *とIDA *の唯一の違いは、FLimitのチェックと、これを増やす外側のループの追加であることに注意してください。FLimit。私はこれがこの主題についていくつかの光を放つのを助けることを望む。

+0

ありがとう、本当に助けになりました(:Accepted。 –

+0

@Aphexあなたの実装では、 IDA *の最後の反復では同じスペースが使用されています。元の提案された実装(http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.91.288を参照)では、著者は深さ優先検索IDA *の反復ごとに、A *の開かれたリストと閉じられたリストを格納する必要がないという利点があります(グラフがツリーでない場合はDFS中に訪問リストがあります) –

+0

それはアイデアですあなたが深いノードを横断することなく特定の(うまくいくらか浅い)深さ内に解決策が見つかる可能性があるあなたとあなたの記事は、IDDFS - 反復深化深度優先探索(DFI D) - 反復深化A *ではない。 – Aphex

4

チェックアウトRussell & Norvig、第3章と第4章、およびIDA *が正しくプログラムすることは困難であることを認識しています。あなたは再帰的な最良優先探索(RBFSを)しようとする場合があり、また、* R & N、または、昔ながらのAで説明後者はstd::priority_queueを使用して実装できます。

IIRC、R & Nは第1版でIDA *を記述し、次に第2版でRBFSに置き換えました。私はまだ第3版を見ていない。

2回目の編集に関して、私はゲームを見ていませんが、ヒューリスティックスを導く良い手順は、の緩和された問題です。ヒューリスティックが容易に表現され実行される(そして安価に計算できる)バージョンを導き出すまで、ゲームのルールを削除します。または、ボトムアップの方法では、メインルールをチェックして、どのルールが容易なヒューリスティックであるかを確認してから、それを試して、必要に応じて他のルールを追加します。

+0

ありがとう(:しかし、もし私が間違っていなければ、このゲームにはIDA *がもっと適しているようです。私の研究のために、私はこれがこの問題の正しいアルゴリズムだと信じています。誰かが私を反対に説得してくれることを願っています:/: –

+0

@Kiril:あなたはどんな検索アルゴリズムの実装を試みましたか?この種のタスクに適したアルゴリズムを選ぶことは、正確な科学ではありません。うまく動作するアルゴリズムが見つかるまで、いくつか試してみる必要があります。単純なアルゴリズムが必要なだけかもしれません。 –

+0

ああ、そうです。私は試していない。しかし、私はテストのための多くの時間がない、私はちょうどそのような種類のゲームのための推奨アルゴリズムがあるのだろうかと思った。 AddEmUpはIDA *を使用して最も効率的に解決される、8つのパズルの問題のような(littel)ようです。しかし、あなたは正しい、私は同意する。 –

3

DFIDは、ヒューリスティック関数が定数0であるIDA *の特別なケースです。言い換えれば、ヒューリスティックを導入するための規定はない。ヒューリスティックを使用せずに問題が解決できないほど問題が少ない場合は、IDA *(またはA *ファミリーの他のメンバー)を使用するしかありません。つまり、IDA *は本当に難しいことではありません.AIMAの著者によって提供されたimplementationは、Lispコードの約半ページです。私は、C++の実装はそれを2倍以上とすべきではないと思います。

+0

ああ、お返事ありがとう!私は間違いなくIDA *を使用します。私の+1。 –

関連する問題