【问题标题】:BFS algorithm in pythonpython中的BFS算法
【发布时间】:2017-02-09 15:57:28
【问题描述】:

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

算法完成了一个 9 块拼图 (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)

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

【问题讨论】:

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


    【解决方案1】:

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

    似乎self.visitedlist。改为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*,将错位图块的数量用作启发式函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-20
      • 2016-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 2022-07-18
      • 1970-01-01
      相关资源
      最近更新 更多