2016-12-05 15 views
0

私が現在使用してC++で*を実装しようとしています:http://www.policyalmanac.org/games/aStarTutorial.htmA *経路探索

をしかし、私は斜めの動きを含めないことを決めた最初のバージョンのために。それは現在のポイントの隣人をチェックするループポイントcにおける要約セクションで

for each neighbour of the current square (above, below, left, right) 
    if neighbour on closed list or not walkable { 
     continue 
    } 

    if neighbour not in open list { 
     add to open list 
     set parent of neighbour to current square 
     update F, G, H values 
    } else if neighbour is on open list { 
     check to see if this path to that square is better, 
     using G cost as the measure. A lower G cost means that this is a better path. 
     If so, change the parent of the square to the current square, 
     and recalculate the G and F scores of the square. 
    } 

私は唯一の4方向の移動を許容していた場合、私はまだどうかを確認するためにグラムコストをチェックする必要がありますその広場への道は良いですか?例えば、開始点から始まり、開始点の4つの隣接点は全て同じgを有する。

+0

私が正しく思い出すと、すべての直近の人は同じgコストですが、あなたのターゲットがあなたの場所の北西に対角線上にある場合、西または北の隣から始まるパスのgコストはgコストより低くなりますもしあなたが東または南の隣人から始めるならば。 – mrogers

+0

@NicoSchertlerだから、最低のgコストで隣人をチェックすべきですか?その四角形の親を現在の四角形に設定し、値を更新しますか? – PrimateJunkie

+0

A *アルゴリズムのステップは、セット内のアイテム数(現在のセルの隣)によって変わりません。あなたは地図の向こう側に(隣の細胞に加えて)明確な隣人を持っているワームホール/テレポーターを持っていても、A *はまだ動作します。 –

答えて

0

より低いGコストをチェックする点は、よりよいものが見つかると、その正方形の新しいパスを設定することです。最初にAから正方形Cへのパスを見つけることができます。しかし、後で検索するとき、Cの隣人と異なるパスを見つけるでしょう。Cが閉じたリストにない場合、Cへの新しいパスのGコストは、最初のものよりも低くなるので、より良いG(したがってF)値でCを更新したいとします。

+0

これは私が巻き込まれて混乱するところです。だから、各隣人を見て、その隣人がそのノードの親よりもコストが低いかどうか、隣人と親の間の距離を調べるべきですか?@aah – PrimateJunkie

+0

隣人が開いているリストにありますが、閉じたリストにない場合、それは前の親を持っていたことを意味します。したがって、新しい親に基づいてGコストを計算し、それを古い親のGコストと比較し、2つのうち小さい方を使用します。あなたは親のGコストを隣人と比較しません。 – aah

+0

@PrimateJunkie明確にするために、古い親に対するGコストを新しい親に対するGコストと比較する。したがって、隣接する四角形の間の重みがW(*、*)であり、古い親がP1であり、新しいがP2である場合、G(P1)+ W(P1、C)対G(P2)+ W P2、C)であり、Cは隣接する正方形である。 – aah

0

状況を分析しましょう。基本的なポイントは、グラフのすべてのエッジが同じ重みを持つことです。

現在、頂点がcで、隣人nを分析しているとします。次に、近隣のnの更新された距離は、distance(c) + wとなります。ここで、wは均一なエッジの長さです。今問題はnが別のパスを経由する距離よりも大きい距離を持つことができるかどうかです。

nの親のpが長いパスにつながるとします。次に、nの距離はdistance(p) + wです。その式がcから更新されたコストよりも大きくなるようにするためには、次のようなニーズに保持する:

distance(p) + w > distance(c) + w 
distance(p) > distance(c) 

のでpは遠く離れてcより開始されてからでなければならないであろう。 Dijkstraのアルゴリズムを使用した場合、これはpcの後に修正されることを意味するため、これは不可能です。しかし、あなたはA *を使って、ヒューリスティックで順序を決定します。したがって、次の2つの条件を満たす必要があります。

distance(p) > distance(c) 
distance(p) + heuristic(p) <= distance(c) + heuristic(c) 
<=> heuristic(p) <= heuristic(c) - (distance(p) - distance(c)) 

これはあなたのヒューリスティックに帰着します。広く使用されているマンハッタン距離ヒューリスティックはこれを可能にします。したがって、このヒューリスティックを使用する場合、より低いコストをチェックする必要があります。あなたのヒューリスティックが上記の条件を許容しない場合(例えば、ダイクストラの場合のような一定のヒューリスティック)、あなたはしません。

関連する問題