【发布时间】:2012-10-16 14:15:56
【问题描述】:
我一直在尝试不同的方式来实现深度优先搜索。我找到了一些工作方法,但它们涉及一些相当繁琐的字典工作。我使用列表开发了一个新想法,但是此实现返回的操作与所需的结果不匹配。我会尽量清楚地注释代码:
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 在大多数情况下是一种低效的算法。但是一旦我正确地实现了这个实现,它应该能够通过简单地更改存储父节点子节点的数据结构来跨越其他搜索算法。
【问题讨论】:
-
你能举一个预期输出与你的输出的例子吗?
-
您有一种代码味道,在迭代其子节点时,您将“开始”节点与其他节点区别对待。我打赌这个错误与此有关。
-
嗯,这是非常具体的问题,如果没有大量规范,可能不会有太多意义。基本上,我期待一份行动清单,这些行动将引导我走上通往目标的正确道路。问题到达目标目的地(否则它不会返回任何内容),但动作列表不知何故让我回溯已经覆盖的地面(尽管我访问过的列表)并停在死胡同。
-
你能添加一些调试符号吗?例如在此处提供的图表上:code.activestate.com/recipes/576723-dfs-and-bfs-graph-traversal?
标签: python algorithm depth-first-search