我有一个代码从队列中获取父节点,检查它是否已被访问,如果没有,生成其子节点,将它们推送到队列,并重复循环,从下一个父节点以FIFO方式排队。不幸的是,似乎我从未达到目标状态。我实施BFS的方式是否存在结构上的错误?我使用Stack而不是Queue来获得我想要的输出和相同的代码来创建DFS搜索。将“q”更改为队列(FIFO)数据结构实际上是我对此代码所做的唯一更改。还有什么我应该补充的吗?父母/孩子被存储为元组,因此可以随意忽略所有这些工作 - 这似乎不是问题所在。此外,程序在isGoalState被评估为True之前中断,因此代码似乎也没有导致问题。 isGoalState测试给定状态的坐标是否与BFS需要找到的“目标”相匹配。 getSuccessors返回一个元组列表,每个元组代表一个节点的子节点。
while q:
parent = q.pop()
print "parent: " + str(parent)
print str(q)
if parent[0] in visited: continue
visited.append(parent[0])
if problem.isGoalState(parent[0]):
pathList.append(parent[0])
while actionMap[parent] is not None:
actionList.append(actionMap[parent])
try:
pathList.append(parentMap[parent])
except KeyError:
break
parent = parentMap.get(parent, None)
actionList.reverse()
children = problem.getSuccessors(parent[0])
if children != []:
for child in children:
q.push(child)
parentMap[child] = parent
actionMap[child] = child[1]
答案 0 :(得分:0)
好吧,我的朋友们,案子已经结案了。在我的翻译形式DFS到BFS的某处,在isGoalState条件中的while循环完成后,我省略了一个return语句。这是很多大脑无所事事。