3

A *アルゴリズムを使用して、C#で敵ノードをプレイヤーノードに追従させようとしています。チュートリアルを読み、いくつかの C# の例をダウンロードしました。A* アルゴリズムがある程度機能するようになりました。オープン スペースではプレーヤーを追跡しますが、オブジェクトの周りをトレースしようとすると引っかかります。

したがって、私のアルゴリズムがチェックして F 値が最も低い方向に移動している場合、行き止まりに遭遇する可能性があります。この時点で、ステップを逆方向にたどる必要がありますが、コードが以前にチェックしたノードは閉じられており、移動できないため、動かなくなります。

閉じたノードを再計算して、その方法で戻ってもよいことをアルゴリズムに伝えるにはどうすればよいですか。

また、アルゴリズムに自分自身に戻るように指示した場合、元のより良いノードに再び戻るのを止めるにはどうすればよいですか。効果的に 2 つのノード間を繰り返し行き来します。

閉じたリストのノードをチェックして、この特定のパスでより良いかどうかを判断できるはずですが、それがどのように行われるかはわかりません。

私が使用しているヒューリスティック。

G = Math.Abs(StartNodeX - TargetNodeX) + Math.Abs(StartNodeY - TargetNodeY)

H = Math.Abs(CurrentNodeX - TargetNodeX) + Math.Abs(CurrentNodeY - CurrentNodeY)

F = G + H

疑似コード。

  1. 隣接するすべてのノードをオープン リストに追加します
  2. これらすべてのノードで F スコアが最も低いかどうかを確認し、そのノードを最適パス リストに追加します。
  3. チェックされたすべてのノードをクローズド リストに追加します (それらはすべてチェック済みであり、再度チェックする必要はありません)。
  4. 目標に到達するまで繰り返す
  5. 最適なパスの方向に敵を 1 ノード移動させる
  6. もう一度繰り返します
4

4 に答える 4

7

閉じたノードを再計算して、その方法で戻ってもよいことをアルゴリズムに伝えるにはどうすればよいですか?

それはOKではないので、あなたはしません。最適なパスには、行き止まりに足を踏み入れてから再び戻ることは含まれません。これは定義上、次善のパスです。A* アルゴリズムは、最適なパスを見つけます。

アルゴリズムに自分自身に戻るように指示した場合、元のより良いノードに再び戻るのを止めるにはどうすればよいですか。効果的に 2 つのノード間を繰り返し行き来します。

それを止めるものは何もありません。だからこそ、あなたが説明していることをするのは悪い考えです。それをするときに痛い場合は、それをしないでください

私が使用しているヒューリスティック....

かなりめちゃくちゃに見える。

G はスタートからゴールまでのマンハッタン距離、H は現在のポイントからゴールまでのマンハッタン距離、F はそれらの合計です。

まず、マンハッタン距離は、ヒューリスティックが斜めの動きが許可されていない正方形のグリッド用である場合にのみ有効なメトリックです。斜め移動は許しますか?もしそうなら、このヒューリスティックは間違っています。コストを過小評価するにはヒューリスティックが必要であることを忘れないでください。どこでも斜めに移動できる場合、マンハッタンの距離はコストを過大評価します。代わりにユークリッド メトリックを使用することを検討してください。

第二に、スタートからゴールまでの距離は一定ですが、それはどのように関連し、なぜ何かに追加するのですか? あなたが言っていることは、すべてのパスのコストが開始からゴールまでの距離によって増加するということのように見えますが、これは意味がありません。

あなたの質問に基づいて、アルゴリズムとそれが機能する理由を理解していないと思います。私のアドバイスは、実装を試みる前に、アルゴリズムがどのように機能するかを理解することです。英語のアルゴリズムは次のとおりです。

The closed set is an empty set of points.
The queue is an empty queue of paths, ordered by path cost.
Enqueue a path from the start to the start with zero cost.
START: 
If the queue is empty, then there is no solution.
The current path is the cheapest path in the queue.
Remove that path from the queue.
If the last step on the current path is closed then 
    the current path is necessarily bad. (Do you see why?)
    Discard it and go back to the START of the loop.
Otherwise, if the last step on the current path is the destination then
    the current path is the optimal path to the destination, so we're done.
Otherwise, we have the cheapest path *to the last 
    point in that path*. (Do you see why?) 
Therefore, every other path that could possibly go through that point is worse.
Therefore, close off that point. Add it to the closed set so that we can 
    automatically discard any future path that goes through that point.
For each possible direction from the last point of the current path,
    make a new path that extends the current path in that direction.
    The estimated cost of that new path is the known cost to get 
    to its end from the start, plus the estimated cost to get from
    its end to the destination.
    Enqueue the new path with that cost.
Go back to the START of the loop.

それは理にかなっていますか?

于 2012-04-28T15:46:13.390 に答える
1

したがって、あなたの質問を正しく理解できれば、これは基本的な A* アルゴリズムが適していないケースです。A* は、この世界が与えられた場合、A から B への最短経路を教えてくれると言います。この世界では物事が変化していると思います。A* は動的な世界を処理しないため、A* を使用したい場合の唯一の解決策は、毎回最初から A* を再実行することです。キューなどをリセットします。

これに対するより良い解決策がいくつかあります。これらのケースに対して私が取り組んだ 1 つのソリューションを示す論文といくつかのスライドをリンクしました。この論文には、他の多くのアルゴリズムへの参照も含まれています。

http://www.cs.unh.edu/~ruml/papers/rtds-socs10.pdf

http://www.cs.unh.edu/~ruml/papers/rtds-socs10-talk.pdf

于 2012-04-28T15:34:46.047 に答える
0

ここSOで古い問題を解決しようと走り回っています。私はそれがまだこの後半に役立つことを願っています.

数か月前に、matlab で同様の問題に取り組みました。

Gはあなたの問題です。G は、パスに沿って開始位置から移動することの難しさを示します。これはヒューリスティックではありません。それは知っていることであり、あなたはそれを見積もる必要はありません。

4 つの方向のいずれかにのみ移動する場合で、左、右、上、または下に移動するのが同じくらい簡単であるという前提の下で、つまり、「沼」のような領域を移動するのがより困難ではないという前提の下で他のエリアでは、元のパスに沿った正方形の数を数えるだけです。

マンハッタン距離 (G メトリック) は、基本 4 方向にしか移動できない遮るもののない追跡における最短経路であるため、G はオープンで機能します。

A から B に移動しようとしている次の例を考えてみましょう。場所 T は、式によると G = 4、H = 2 & F = 4+2 = 6 になります。

00000
00X00
00X00
00XT0
A0X0B

実際の A* パスは、G=10、H=2、F=12 の + で表されます。

0+++0
0+X+0
0+X+0
0+XT0
A+X0B

この方法で G を計算すると、問題が解決するはずです。

于 2013-12-01T03:04:17.030 に答える
0

ウィキペディアから、ヒューリスティック関数が許容される必要があることがわかります。許容可能なヒューリスティックは、実際の距離よりも高い推定値を決して与えてはなりません。そうしないと、A* 検索は機能しません。

あなたのヒューリスティックは受け入れられません。別のヒューリスティックを見つける必要があります。

于 2012-04-28T15:41:31.030 に答える