私はPythonでBFSを実装しようとしていますが、アルゴリズムの仕組みを理解していますが、プログラミングの経験はあまりありません。私はすべてを表現する最善の方法とできるだけ効率的になる方法について何時間も考えました。私は、スタートノードからゴールノードへのパスを取得する方法を理解することができませんでした。Pythonの幅広い検索実装
私は周りにグーグルを見て、他の人々のアルゴリズムの実装を見てきましたが、私のアプリケーションは少し異なり、これは私を混乱させる。人々がBFSを実装しているとき、彼らは彼らに与えられたグラフを持っていると仮定しています(BFSのwikipedia記事もそうです)。私の問題では、私は最初の状態と私が到達したい目標状態を持っていますが、グラフやツリーはありませんので、私はノードを生成しています。例えば
:私は何かに問題を抱えているので、それが適切に肉付けいない
def BFS(initial, goal):
q = [initial]
visited = []
while q:
n = q.pop()
states = generate_states(n)
for state in states:
if state == goal:
pass #placeholder
q.append(state)
visited.append(state)
、私はそれが特異的のいずれかである何...最初のゴールは、ノードの場合はわからない、と私
class node:
state = None
parent = None
これはノードを表すのに適した方法だと思います。だから私は自分のキューからノードオブジェクトをポップすると、それはgenerate_states関数で初期化される元の場所に関する情報を持っています。次に、forループは、これらの新しいノードのそれぞれをキューに追加し、訪問されたキューを生成し、生成されたノードの1つの下で繰り返され、そのノードは目標状態に一致します。
私は目標ノードを見つけたので、私は訪問先ノードのリストを持っていますが、目標ノードからのパスを逆方向にトレースすると、アルゴリズムは遅くなりませんか?目標が見つかったら、私はその親を見て、訪問先のリストでその親を見つけ、次に親の親を見て、など...まで、私はパス= [ノードオブジェクト、ノードオブジェクト、... ]を初期ノードからゴールノードに送信する。
これは別の問題に繋がります。ノードオブジェクトを作成すると、それはwhileループの1回の繰り返しでのみ持続します。どのようにオブジェクトを配列に格納するのか、それぞれ固有の名前が必要であり、これを行うための明白な方法はありません。これは私が前に私が確信していなかったことに言及した問題でした。だから、私はノードを作成しているようですが、node.starentをキューに格納するだけです。ノードオブジェクトがnode.parentにアクセスする必要があるため、無意味です...
なぜこれが難しいのですか?明白な何かを見逃したり、これを複雑すぎるものにしていますか?
読んでいただきありがとうございます。
初期状態と目標状態と有限数の演算子があります。私はグラフを与えられていません、あなたが言うように、私は、関数generate_states(n)を使っている集合演算を適用することで、それを構築する必要があります.nはノードです。最終的に、私は各状態を繰り返して、最終的にゴールノードで終了するツリーで終わります。私はこれを行う方法を理解しようとしています、そして、木の中のパスを見つけるために目標ノードから逆方向にトレースしてください。これはさらに混乱している場合はごめんなさい。 – user1291204