問題は、直近のノードから直近のノードに到達できない場合はどうなりますか?
この手順は必要ありません。同様に、現在の最も近いものから最も近いものから、目的ノードに到達しようとしているものを計算しているわけではなく、現在の最も近いものだけが重要です(アルゴリズムが最後の繰り返しを気にしないあなたは100キロ離れていました。この繰り返しは96キロしか離れていないからです)。
概説として、A *は経路を直接構築しない:探索した領域内に経路が含まれていることを確実に知るまで調査し、探査中に記録された情報に基づいて経路を構築する。
(私は私の説明を補助するために、リファレンス実装としてthe code in the Wikipedia articleを使用するつもりです。)
あなたはノードの2セットを持っている:closedset
とopenset
closedset
が完全に評価されたノードを保持し、つまり、あなたはどれくらい正確に彼らがstart
からどれくらい離れているかを知っていて、すべての隣人は2つのセットのうちの1つにあります。これは、あなたがそれらで行うことができる計算がもうないので、それらを無視することができます。
openset
は「ボーダー」ノードを保持していますが、これはstart
からどのくらい離れているかを知っていますが、まだ近隣に触れていないため、検索の端にありますこれまでのところ。
は(暗黙的に、第三のセットがあります:。完全に手付かずのノードしかし、彼らはそう、彼らは問題ではありませんopenset
になるまで、あなたは実際にそれらに触れないでください。)
所与の反復では、「あなたの場合veは探索するノードを持っています(つまり、ノードはopenset
にあります)。どのノードを探索するかを検討する必要があります。これはヒューリスティックの仕事ですが、基本的に境界線のどの点が次にどのノードを探索するのかについてのヒントを与えます。最短経路はgoal
です。
以前の最も近いノードは無関係です。境界を少し広げただけで、新しいノードをopenset
に追加しました。これらの新しいノードは、この繰り返しで最も近いノードの候補になりました。あなたが最終的にgoal
に到達するまで、
は最初に、openset
はstart
が含まれていますが、その後、あなたは反復処理し、各ステップで境界線が(最も有望な方向に)少し拡大しています。
A *が実際に探索を行っているとき、どのノードがどこから来たのか心配しません。 start
からヒューリスティック関数までの距離を知っているので、それは必要ではありません。
しかし、後でパスを再構築するには、パスのレコードが必要です。これはcamefrom
です。特定のノードの場合、camefrom
はstart
に最も近いノードにリンクするため、goal
からのリンクを逆にたどって最短パスを再構築することができます。
実際に関数の引数として「グラフ」をどのように取るのでしょうか?
representations of a graphのいずれかを渡します。
A *がTSPにどのように当てはまるかわかりません。私は、AからBへのルートを見つけることを意味します、確かに、私はそれを取得します。しかしTSP?私は接続が表示されません。
異なるヒューリスティックと異なる終了条件が必要です。goal
は、もはや単一ノードではなく、すべてが接続されている状態です。ヒューリスティックは、残りのノードを結ぶ最短パスの長さの見積もりです。
[A *](http://en.wikipedia.org/wiki/A*_search_algorithm)はbと思われる私がCSコースから覚えているものからかなり良いサマリー。 [Dijkstraアルゴリズム](http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm)は非常に似ていますが(よりシンプルなので)、最初はもっとうまくいくかもしれません。どちらの場合でも優先キューが便利です。 –
@pst:A *とDijkstraのアルゴリズムは、A点からB点に移動したい場合に便利です。A点からA点まで、特定の制約のあるパスで移動したい場合は、それ以外の方法があります。 –
Uni(以前の千年紀)に私が望んでいた言語でA *を実装する課題がありました。私たちが最もよく知っていたC++を選んだのですが、Prologを選択しました。短編小説、私は多くの人よりもはるかに速く割り当てを終えました。おそらくPrologで始まり、中間段階をスキップすることができます。 – Motti