私は深さ優先探索を実装するさまざまな方法を試してきました。私はいくつかの実用的な方法を見つけましたが、それらはかなり退屈な辞書の仕事を含んでいました。リストを使用して新しいアイデアを開発しましたが、この実装が返すアクションが目的の結果と一致しません。コードにできるだけ明確にコメントを付けようとします。
start = problem.getStartState() ## returns an (x, y) tuple
children = problem.getSuccessors(start) ##returns the children of a parent node in ((start
state), action, cost) format.
stack = Stack() ##creates a Stack (LIFO) data structure
visited = [] ##list of visited nodes
visited.append(start)
for child in children:
stack.push((child, [], [], 0)) ##push children to fringe in the format of (child,
while stack: ##path taken, actions taken, cost)
parent = stack.pop()
node = parent[0]
if parent[0] in visited: continue
visited.append(parent[0])
path = parent[1] + [node[0]] ##assigns previous path/actions/cost to new
actions = parent[2] + [node[1]] ##node, creating a cumulative, ordered list of
print actions ##the path/actions and a cumulative cost
cost = parent[3] + node[2]
if problem.isGoalState(node[0]):
print parent[2]
return parent[2] ## returns list of actions
children = problem.getSuccessors(node[0])
if children != []:
for child in children:
stack.push((child, path, actions, cost)) ##assigns cumulative lists to child
誰かが私の問題がこの実装のどこにあるのかわかりますか?ところで、私はDFSがほとんどの場合非効率的なアルゴリズムであることを知っています。しかし、この実装を正しく行うと、親ノードの子を格納するデータ構造を変更するだけで、他の検索アルゴリズムにクロスオーバーできるようになります。