1

私は、最小コストのルートを見つけるためにパスファインディングを実行する必要があるプロジェクトに取り組んでいます。最短ルートで構いません。これまでのところ、A* は問題外のようで、正直に言って Prim のアルゴリズムを理解していません。

ルートを見つけるために必要な地図の種類について説明しましょう。これはマップの例です:

+------|-*----
+------|----|-
+--|--------|-
+@-|----------

「*」は出発地、「@」は目的地です。行内の「+」記号は、a) 1 つのステップと同じコストがかかり、b) ルート全体のコストが半分になる直接ルートを示します。

これは、開始位置から「+」ルートを経由して目的地まで 10 の「ステップ」があることを意味し、最終的にコストは 5 になります。左端の「|」を使用するには 15 のステップがあります。ルート (「|」は「-」よりも低コストですが、「+」よりは劣ります)、最終的にコストは 15 になります。明らかに、コストが 5 のルートが使用するルートです。

現在、これを C# で実装するのに問題があります。私は現在、方法がブロックされた場合、またはステップのコスト、および新しい位置に移動して戻る「ステップ」機能を持っています。これはうまく機能しますが、現時点では「|」で終わるという点で非常に単純です。「+」の前に見つかった場合 (より速いルートが見つからないため、移動全体の費用が大幅に高くなることを意味します)。

各場所を「訪問済み」としてマークすることを考えていましたが、最低コストのルートがループバックすることは完全にありえます。また、多くの異なるパスがあり、それぞれが一意であり、それぞれが異なるパス セグメントを使用する場合があります (以前の実行で既にアクセスされている可能性があります)。明らかに、最も安価なパスを見つけるために各パスをたどる必要がありますが、同じルートを何度も何度も検索することなしにそれを行う方法を理解することはできません.

より簡単にする場合は、移動を目的地に向かってのみに制限できます (つまり、下降した後に再び上昇することはできません)。

誰かが洞察を提供できれば、それは素晴らしいことです!

4

1 に答える 1

4

私が理解していることから、マップ内の「-」フィールドはグラフ ノードです。各「-」ノードには、隣接する「-」フィールドへの最大 8 つのエッジがあります。斜めの移動を許可する場合は 8、それ以外の場合は隣接する 4 つの「-」ノードのみが有効です。「-」ノードと「|」の間にエッジはありません ノード。

これは、単純な深さ優先検索/幅優先検索を実装するのに十分です。この検索で​​は、非表示ノードのキュー (深さ優先の場合は LIFO、幅優先の場合は FIFO) と訪問済みノードのリスト (循環を避けるため) を保持します。 . どちらのアルゴリズムも比較的非効率的ですが、簡単に改善できます。

「+」ノードの意味がわかりません。ある「+」モードから次の「+」モードへの移動は自由な移動ですか? その場合、エッジ コストを使用してこれをモデル化できます。「-」ノードからまたは「-」ノードへの移動のコストは 1、「+」ノードから「+」ノードへの移動のコストは 0 です。

幅優先探索アルゴリズムは、すべてのグラフ エッジが非負である限り、ソースと宛先の間の最短パスを計算するダイクストラのアルゴリズムに拡張できます。

http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

ダイクストラ アルゴリズムは、単純なヒューリスティックを追加してA* アルゴリズムにすることでさらに改善できます。ゴールの座標が 2D 座標である場合、ノードとゴールの間のユークリッド距離を使用して、どのノードをたどるのが最適かを大まかに見積もることができます。「+」フィールドが、移動コストがゼロのマップを通るトンネルのようなものである場合、トンネルに向かって移動する必要がある場合、目的地に向かってヒューリスティックに移動することはしばしば間違っているため、A* アルゴリズムはあまり役に立ちません。複数のトンネルまたは目的地につながっていないトンネルがある場合、ナイーブなダイクストラ アルゴリズムより優れたヒューリスティックは存在しない可能性があります。

最低コストのルートにループを含めることは不可能であることに注意してください: 最低コストのルートにループが含まれている場合、ループを削除しても目標への有効なルートが得られますが、コストは低くなり、コストが最も低いルート。

Cormen の Introduction to Algorithms、または関連するウィキペディアのページをご覧ください。

http://en.wikipedia.org/wiki/Shortest_path

http://en.wikipedia.org/wiki/Breadth-first_search

http://en.wikipedia.org/wiki/Depth-first_search

http://en.wikipedia.org/wiki/A*_search_algorithm

于 2009-11-25T09:08:17.197 に答える