python - python中的BFS算法

标签 python algorithm performance artificial-intelligence breadth-first-search

我正在做一个项目,需要我使用 Python 实现 BFS 算法,我是新手。

该算法完成了 9 block 拼图 (3x3) 的执行,但这样做需要花费大量时间(5 分钟):

def bfs(self):

    fringe = deque([])
    # start it
    fringe.append(self.stateObj.getState())

    while len(fringe) > 0:
        state = fringe.popleft()
        self.visited.append(state)

        # just for tracing
        # self.helper.drawBoard(state)

        if self.stateObj.isCurrentStateGoalTest(state):
            return True

        for next_state in self.stateObj.getNextStates(state):
            if (next_state not in (self.visited + list(fringe))):
                fringe.append(next_state)

任何人都可以指出我可以改进它以获得更好的性能吗? 任何实际的答案都会被广泛接受。

最佳答案

有问题的部分可能是这样的:if (next_state not in (self.visited + list(fringe))) 这将 a) 从 fringe 创建一个新列表, b) 从该列表创建另一个新列表并访问, c) 迭代整个列表以查看下一个状态是否已经存在。

看起来 self.visited 是一个 list。改为将其设为 set,因此 in 检查只需要 O(1) 而不是 O(n)。此外,在 BFS 中,您可以在 next_state 循环中将元素添加到 visited,这样您就不必检查它们是否在 fringe,以及。

def bfs(self):
    fringe = deque([self.stateObj.getState()])
    while fringe:
        state = fringe.popleft()
        if self.stateObj.isCurrentStateGoalTest(state):
            return True
        for next_state in self.stateObj.getNextStates(state):
            if next_state not in self.visited:
                fringe.append(next_state)
                self.visited.add(next_state)

如果这还不够,我建议使用 A*相反,使用错放的图 block 数量作为启发式函数。

关于python - python中的BFS算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42141272/

相关文章:

python - 使用分隔符拆分列表

python - 比较两个大文件

Java LinkedHashSet remove(Object obj) 方法常量/线性时间复杂度?

Javascript:如何优化此行以提高性能?

sql - 关于 Oracle Explain Plan 成本的问题

python - 使用装饰器从类外部动态添加方法

python - 在 python 中,如何将数组/列表与数字进行比较

python - 如何在 C++ 中正确加载 python(3.0) 函数

algorithm - 在现有轮廓线之间插入缺失的轮廓线

python - 获得范围内频率平均值的最快方法