广度优先搜索 - 为什么我的队列被清空?

时间:2012-10-14 21:51:34

标签: python algorithm artificial-intelligence

我有一个代码从队列中获取父节点,检查它是否已被访问,如果没有,生成其子节点,将它们推送到队列,并重复循环,从下一个父节点以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]

1 个答案:

答案 0 :(得分:0)

好吧,我的朋友们,案子已经结案了。在我的翻译形式DFS到BFS的某处,在isGoalState条件中的while循环完成后,我省略了一个return语句。这是很多大脑无所事事。