我有一段代码,它从队列中取出一个父节点,检查它是否已被访问,如果没有访问过,则生成它的子节点,并将它们推入队列,然后重复这个循环,以先进先出的方式从队列中取出下一个父节点。不幸的是,似乎我永远无法达到目标状态。广度优先搜索(BFS)的实现方式在结构上是否有问题?我使用相同的代码,但用栈代替队列来创建深度优先搜索(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]
回答:
朋友们,案子已经结了。在我从DFS转换到BFS的过程中,我在isGoalState条件完成后的while循环中遗漏了一个返回语句。这真是白费了不少脑力。