A *アルゴリズムの詳細な説明(素晴らしいもの)

概要概要

A *アルゴリズムをマスターした人は簡単だと思いますが、初心者にとっては、A *アルゴリズムはまだ非常に複雑です。

検索エリア

誰かがポイントAからポイントBに移動したいが、2つのポイントが壁で区切られているとします。図1に示すように、緑はA、赤はB、真ん中の青は壁です。
ここに写真の説明を書いてください
図1

検索領域を正方形のグリッドに分割したことに気付いたはずです。これはパス検索の最初のステップであり、ここで行ったように検索領域を簡素化します。この特定の方法では、検索領域が2次元配列に縮小されます。配列の各項目はグリッドを表し、その状態は歩行可能(walkalbe)と歩行不可能(歩行不可能)です。AからBまで歩く必要のある正方形を計算することにより、パスが見つかります。パスが見つかると、キャラクターは目的地に到達するまで、ある正方形の中心から別の正方形の中心に移動します。

正方形の中心点は「ノード」と呼ばれます。A *パスファインディングアルゴリズムに関する他の記事を読むと、人々がノードについて話し合っていることがよくあります。なぜそれを正方形として説明しないのですか?たとえば、検索領域を正方形ではなく他の複数の変形に分割できるため、六角形、長方形、または任意の複数の変形にすることができます。ノードは、任意のポリゴンに配置することも、複数の変形の中心に配置することも、ポリゴンの側面に配置することもできます。最も単純なため、このシステムを使用します。

上記のように、検索領域を定量化可能なノードのセットに縮小したら、次に実行する必要があるのは、最短パスを見つけることです。A *では、開始点から開始し、隣接する正方形を確認してから、ターゲットが見つかるまで拡大します。

私たちは次のようにパスファインディングの旅を始めます:

  1. 開始点Aから開始し、正方形で構成されるオープンリスト(オープンリスト)に追加します。このオープンリストは、ショッピングリストに少し似ています。もちろん、オープンリストには開始点Aであるアイテムが1つだけあり、後でさらにアイテムが追加されます。オープンリストのグリッドは、パスが途中を通過する場合と通過しない場合があることを示しています。基本的に、オープンリストはチェッカーリストです。

  2. 出発点Aに隣接する正方形を確認し(壁が占める正方形、川が占める正方形、その他の違法な地形が占める正方形は無視してください)、その中から歩行可能または到達可能を選択します。正方形もオープンリストに追加されます。開始点Aをこれらの正方形の親(親ノードまたは親正方形)に設定します。パスを追跡する場合、これらの親ノードのコンテンツは非常に重要です。後で説明します。

  3. オープンリストからAを削除し、クローズリスト(クローズドリスト)に追加します。クローズリスト内のすべての正方形は不要になります。

下の図に示すように、濃い緑色の正方形が開始点であり、その外枠は明るい青色であり、正方形がクローズリストに追加されたことを示します。隣接する黒い四角を確認する必要があり、フレームは明るい緑色です。それぞれの黒い四角には、親ノードを指す灰色のポインターがあります。これが開始点Aです。
ここに写真の説明を書いてください
図2。

次に、オープンリストから開始点Aに隣接する正方形を選択し、以下に説明するように前の手順を多かれ少なかれ繰り返す必要があります。しかし、どの正方形を選ぶべきでしょうか?F値が最も小さいもの。

パスの並べ替え

パスを構成する二乗を計算するための鍵は、次の式です。

F = G + H

ここに、

G =正方形に到達するために生成されたパスに沿って、開始点Aから指定された正方形に移動するコスト。

H =指定された正方形から終点Bに移動するための推定コスト。これはしばしばヒューリスティックと呼ばれ、少し混乱します。それは推測であるため、なぜそれが呼ばれるのですか。途中にはいろいろなもの(壁や水など)があるので、道が見つかるまで本当の距離はわかりません。このチュートリアルでは、Hを計算する方法を説明します。また、インターネット上で他の方法を見つけることもできます。

パスは次のように生成されます。開いているリストを繰り返しトラバースし、F値が最小の正方形を選択します。このプロセスについては、後で詳しく説明します。まず、上記の式の計算方法を見てみましょう。

前述のように、Gは開始点Aから指定された正方形に移動するためのコストです。この例では、水平および垂直移動コストは10で、斜め移動コストは14です。これらのデータが使用されるのは、実際の対角移動距離が2の平方根、つまり水平または垂直移動コストの約1.414倍であるためです。簡単にするために、10と14を使用します。比率は正しいです。オープン計算と10進計算は避けます。私たちにこの能力がない、または数学が好きではないということではありません。これらの番号を使用すると、コンピューターを高速化することもできます。これらの手法を使用しないと、パスファインディングアルゴリズムが非常に遅くなることが後でわかります。

指定された正方形へのパスに沿ってG値を計算するので、正方形のG値を計算する方法は、その父のG値を見つけてから、10を加算するか、父が直線方向か斜め方向かに応じて加算することです。 14.14。出発点を離れてより多くの正方形を取得すると、この方法はより明確になります。

Hの値を推定する方法はたくさんあります。ここでは、マンハッタンの方法を使用して、現在の正方形からターゲットまでの水平または垂直の正方形の数を計算し、斜めの動きを無視して、合計に10を掛けます。マンハッタン法と呼ばれるのは、ある場所から別の場所に渡るブロックの数を数えるのとよく似ており、ブロックを斜めに横切ることができないためです。パス内の障害物を無視するには、Hを計算することが重要です。これは実際の値ではなく残りの距離の推定値であるため、ヒューリスティックと呼ばれます。

GとHを追加してFを取得します。最初のステップの結果を次の図に示します。各正方形は、開始点の右側の正方形と同じように、F、G、Hの値でマークされ、左上隅がF、左下隅がG、右下隅がHです。
ここに写真の説明を書いてください
画像3

さて、それではいくつかの正方形を見てみましょう。文字でマークされたボックスでは、G = 10です。これは、始点から水平方向に正方形が1つしかないためです。開始点に直接隣接する上、下、左の正方形のG値は10で、対角線の正方形のG値は14です。

H値は、始点から終点(赤い四角)までのマンハッタンの距離を推定し、水平方向と垂直方向にのみ移動し、途中の壁を無視して得られます。このように、始点の右側の正方形から終点までの距離は3正方形であるため、H = 30になります。この正方形の上の正方形から終点までの正方形が4つあるため(水平距離と垂直距離のみが計算されることに注意してください)、H = 40です。他の正方形については、同じ方法を使用して、H値がどのように導出されるかを知ることができます。

各正方形のF値も、G値とH値を直接加算するだけです。

検索を続行するには、開いているリストからF値が最小の(正方形の)ノードを選択し、選択した正方形に対して次の操作を実行します。

  1. オープンリストから取り出して、クローズリストに入れます。

  2. 隣接するすべての正方形を確認し、クローズリストの正方形または歩けないもの(壁、水、その他の違法な地形など)を無視します。正方形が開いた場所にない場合は、それらを配置します。オープンリストに参加してください。

選択した正方形を、これらの新しく追加された正方形の父として設定します。

  1. 隣接する正方形がすでにオープンリストにある場合は、このパスが優れているかどうか、つまり、現在の正方形(選択した正方形)を介してその正方形に到達するためのG値が小さいかどうかを確認します。そうでない場合は、何もしません。

逆に、G値が小さい場合は、その正方形の親を現在の正方形(選択した正方形)に設定してから、その正方形のF値とG値を再計算します。それでも混乱する場合は、下の写真を参照してください。
ここに写真の説明を書いてください
図4

では、どのように機能するか見てみましょう。最初の9つの正方形のうち、さらに8つがオープンリストにあり、開始点がクローズリストに配置されています。これらの正方形の中で、開始点の右側の正方形のF値が最小である40であるため、この正方形を次に処理する正方形として選択します。そのフレームは青い線で強調表示されています。

まず、それをオープンリストからクローズリストに移動します(これが青い線で強調表示されている理由です)。次に、それに隣接する正方形を確認します。その右側の正方形は壁ですが、無視します。その左側の正方形が開始点であり、これもクローズリストでは無視されます。他の4つの隣接する正方形はオープンリストにあります。この正方形を通るパスがより良いかどうかを確認し、G値を使用して決定する必要があります。上の正方形を見てみましょう。現在、G値は14です。現在の正方形を経由してそこに到達すると、G値は20になります(10は現在の正方形に到達するためのG値に、現在の正方形から上の正方形に移動するG値10を加えたものです)。明らかに20は14より大きいので、これは最適なパスではありません。写真を見ればわかるでしょう。開始点からその正方形に斜めに移動する方が、水平に移動してから垂直に移動するよりも優れています。

オープンリストで隣接する4つの正方形すべてをチェックした後、現在の正方形を通るより良いパスが見つからないため、変更を加えません。現在の正方形の隣接するすべての正方形をチェックして処理したので、次に処理する正方形を選択します。

したがって、オープンリストを再度トラバースすると、正方形が7つしかないため、F値が最も小さいものを選択する必要があります。興味深いのは、今回はF値が54の正方形が2つあることです。どちらを選択する必要がありますか?それは問題ではありません。速度に関しては、最後にオープンリストに追加される正方形を選択する方が高速です。これにより、パスファインディングプロセス中にターゲットに近づくときに、最初に新しく見つかった正方形を使用することが優先されます。しかし、これは重要ではありません。(同じデータの処理が異なると、2つのバージョンのA *が同じ長さの異なるパスを検出します)。

次の図に示すように、開始点の右下にある正方形を選択します。
ここに写真の説明を書いてください
図5

今回、隣接する四角を確認すると、右側の四角が壁であることがわかりますので、無視してください。上記についても同様です。

また、壁の下の正方形も無視します。どうして?角を越えないと、現在の広場からその広場に直接移動できないからです。最初に降りてから、その広場に移動して角を曲がる必要があります。(注:コーナーを横切るルールはオプションであり、ノードの配置方法によって異なります)

これにより、5つの隣接する正方形が残ります。現在の正方形の下にある2つの正方形はオープンリストに追加されていないため、それらを追加して、現在の正方形を父親として設定します。残りの3つの正方形のうち、2つはすでにクローズリストにあります(1つは開始点、もう1つは現在の正方形の上の正方形、外枠が強調表示されます)。無視します。現在の正方形の左側にある最後の正方形で、現在の正方形を介してそこに到達するための小さいG値があるかどうかを確認します。番号。これで、開いているリストから処理する次の正方形を選択する準備が整いました。

次の図に示すように、エンドポイントもオープンリストに追加されるまで、このプロセスを繰り返します。
ここに写真の説明を書いてください
画像6

始点から2マス下のマスの父は、前のマスとは異なることに注意してください。以前は、そのG値は28で、右上の正方形を指していました。現在、そのG値は20であり、その真上の正方形を指しています。これは、パス検索プロセスのどこかで発生します。新しいパスが使用されると、G値がチェックされて低くなるため、親ノードがリセットされ、G値とF値が再計算されます。この例ではこの変更は重要ではありませんが、多くの場合、この変更によりパスファインディングの結果に大きな変化が生じます。

では、実際のパスをどのように決定するのでしょうか。とても簡単です。最後から始めて、矢印を押して親ノードに移動すると、開始点に戻ります。これがパスです。以下に示すように。始点Aから終点Bに移動することは、パス上の1つの正方形の中心から、ゴールに向かう別の正方形の中心に移動することです。とても簡単です!
ここに写真の説明を書いてください
図7

A *アルゴリズムの概要(A *メソッドの概要)

さて、これで紹介全体を読んだので、すべてのステップをまとめました。

  1. 開始点をオープンリストに追加します。

  2. 次のプロセスを繰り返します。

a。開いているリストをトラバースし、F値が最小のノードを見つけて、それを現在処理するノードとして使用します。

b。このノードをクローズリストに移動します。

c。現在の正方形の8つの隣接する正方形のそれぞれについて?

◆到達不能またはクローズリストにある場合は、無視してください。それ以外の場合は、次のようにします。

◆オープンリストにない場合は、オープンリストに追加し、現在の正方形を親として設定し、正方形のF、G、H値を記録します。

◆すでにオープンリストにある場合は、このパス(つまり、現在のグリッドを介して到達するパス)が適切かどうかを確認し、G値を参照として使用します。G値が小さいほど、これがより適切なパスであることを示します。その場合は、父親を現在の正方形に設定し、G値とF値を再計算します。開いているリストがF値でソートされている場合は、変更後に再ソートする必要がある場合があります。

d。あなたが

◆エンドポイントをオープンリストに追加します。この時点でパスが見つかりました。または

◆エンドポイントの検索に失敗し、オープンリストが空であるため、現時点ではパスがありません。

3.パスを保存します。終点から、各正方形は親ノードに沿って始点に移動します。これがパスです。

逸脱(小さな暴言)

私の逸脱を許してください。インターネットやフォーラムでA *アルゴリズムに関するさまざまな議論を見ると、実際にはそうではないA *コードが見つかることがあります。A *を使用するには、上記で説明したすべての要素、特にオープンリスト、クローズリスト、パスコストG、H、およびFを含める必要があります。他にも多くのパスファインディングアルゴリズムがありますが、これらのアルゴリズムはA *アルゴリズムではなく、A *が最適と見なされます。この記事の最後に引用されている記事のいくつかで、ブライアン・スタウトはそれらの長所と短所を含め、それらのいくつかについて説明しています。ある時点で2つのうちの1つを選択できますが、何をしているのかを理解する必要があります。

おすすめ

転載: blog.csdn.net/qq_41371349/article/details/107501179