web-dev-qa-db-ja.com

経路探索のためのツリー検索-アルゴリズムの批評

ですから、私は一般的にAIにかなり慣れておらず、テキストファイル入力(迷路)からツリーベースの検索を実装しようとしています。例は次のとおりです。

_||||||||||||||||||||||
| ||        | |      |    \
|    |||||| | |||||| |     \
||||||       |    P  |      \
|   .| |||||| || |||||       \  P = Start
| |||| |         |   |       /  . = Goal
|        ||| |||   | |      /
||||||||||    |||||| |     /
|          ||        |    /
||||||||||||||||||||||
_

基本的なアルゴリズム(BFS、DFS、A *など)は一般的に理解していますが、「最適なパスがどこにあるかがわかっている」ため、どういうわけか手抜きをせずに、正しく実装していることを確認したいと思います。私の基本的な考え方は次のとおりです。

  • ファイルを2D配列に解析します
  • 解析中にPに遭遇した場合は、開始インデックスに注意してください
  • 解析中に_._に遭遇した場合は、目標インデックスに注意してください
  • Index(Start)から始めて、周囲の[空白]スペースを評価します
  • これらのNodesを作成し、現在のノードで使用可能なアクションに適切なアクションを追加します---これらのNodesを私のfrontierqueに追加します
  • [ここからどちらのアルゴリズムも続行します]

ですから、私の主な質問は、「世界」を正しく生成しているかということだと思います。検索中にノードに遭遇するまで、実際にノードを作成しないのは正しいですか? [空白]スペースに移動し、周囲の4方向をスキャンして他の[空白]スペースを探し、それらが存在する場合はそれらを使用可能なアクションに追加し、すべての可能なアクションに対してNodesを作成するのは無駄に思えます。

もう1つの方法は、[空白]スペースに遭遇したときにノードを生成することですが、これは難しいでしょう(今後の空白を認識しないため)...ファイルを完全に解析し、格納されている配列をトラバースする必要があります可能なすべてのノード/リンク/アクションを作成するには?それとも、それはどういうわけか不正行為と見なされます...

2
ctote

この種の問題に対するオブジェクト指向プログラマーの本能は、ある時点で、ある種のNodeオブジェクトをインスタンス化する必要があるということですが、実際にはそうではありません。 2D配列を作成する必要もありません。

経路探索アルゴリズムは、主にsetsの観点から説明されています。迷路を_(row, col)_タプルのsetsに解析することで、非常に明確な実装を記述できます。これにより、次のような操作を記述できます。

_(row, col) = starts.pop()
neighbors = {(row+1,col), (row-1,col), (row,col+1), (row,col-1)}
neighborSpaces = neighbors & spaces
unvisitedNeighborSpaces = neighborSpaces - visited
neighborGoals = neighbors & goals
_

ここで、startsspaces、およびgoalsはファイルの解析から作成したsetsであり、visitedはあなたの過程で更新されますアルゴリズム。セット演算は一般にO(n)であることに注意してください。ここで、n最小オペランドです。つまり、迷路内のスペースの数に関係なく、_neighbors & spaces_は_4_の比較のみを行います。これは可能な限り最も効率的な実装ではありませんが、十分に効率的であり、それが購入する明快さはそれだけの価値があります。

3
Karl Bielefeldt