ですから、私は一般的にAIにかなり慣れておらず、テキストファイル入力(迷路)からツリーベースの検索を実装しようとしています。例は次のとおりです。
_||||||||||||||||||||||
| || | | | \
| |||||| | |||||| | \
|||||| | P | \
| .| |||||| || ||||| \ P = Start
| |||| | | | / . = Goal
| ||| ||| | | /
|||||||||| |||||| | /
| || | /
||||||||||||||||||||||
_
基本的なアルゴリズム(BFS、DFS、A *など)は一般的に理解していますが、「最適なパスがどこにあるかがわかっている」ため、どういうわけか手抜きをせずに、正しく実装していることを確認したいと思います。私の基本的な考え方は次のとおりです。
P
に遭遇した場合は、開始インデックスに注意してください.
_に遭遇した場合は、目標インデックスに注意してくださいIndex(Start)
から始めて、周囲の[空白]スペースを評価しますNode
sを作成し、現在のノードで使用可能なアクションに適切なアクションを追加します---これらのNode
sを私のfrontier
queに追加しますですから、私の主な質問は、「世界」を正しく生成しているかということだと思います。検索中にノードに遭遇するまで、実際にノードを作成しないのは正しいですか? [空白]スペースに移動し、周囲の4方向をスキャンして他の[空白]スペースを探し、それらが存在する場合はそれらを使用可能なアクションに追加し、すべての可能なアクションに対してNode
sを作成するのは無駄に思えます。
もう1つの方法は、[空白]スペースに遭遇したときにノードを生成することですが、これは難しいでしょう(今後の空白を認識しないため)...ファイルを完全に解析し、格納されている配列をトラバースする必要があります可能なすべてのノード/リンク/アクションを作成するには?それとも、それはどういうわけか不正行為と見なされます...
この種の問題に対するオブジェクト指向プログラマーの本能は、ある時点で、ある種の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
_
ここで、starts
、spaces
、およびgoals
はファイルの解析から作成したsets
であり、visited
はあなたの過程で更新されますアルゴリズム。セット演算は一般にO(n)
であることに注意してください。ここで、n
は最小オペランドです。つまり、迷路内のスペースの数に関係なく、_neighbors & spaces
_は_4
_の比較のみを行います。これは可能な限り最も効率的な実装ではありませんが、十分に効率的であり、それが購入する明快さはそれだけの価値があります。