我一直在试验深度优先搜索的不同方式。我找到了一些工作方式,但他们涉及一些相当乏味的字典工作。我已经使用列表开发了一个新想法,但是这个实现返回的行为与所需的结果不匹配。我会尝试尽我所能地评论代码:为什么我的深度优先搜索实施损坏
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在大多数情况下是一种效率低下的算法。但是一旦我得到这个实现的权利,它应该能够通过简单地改变存储父节点的子节点的数据结构来跨越到其他搜索算法。
你能举一个预期的输出与你的输出的例子吗? –
您有一种代码异味,您在迭代其子时将“起始”节点与其他节点视为不同。我敢打赌,这个错误与此有关。 – amit
那么,这是非常具体的问题,没有大量的规范可能没有太多的意义。基本上,我期待着一系列的行动,这些行动将带领我走向目的地的正确道路。问题到达目的地(否则它不会返回任何东西),但是行动列表以某种方式使我回溯到已经覆盖的地面(尽管我已经访问了列表)并停在了死胡同。 – user1427661