BFS算法在Python中的实现

我正在进行一个项目,需要使用Python实现BFS算法,而我对Python还不太熟悉。

该算法用于完成一个9块拼图(3×3)的执行,但完成这个过程需要非常长的时间(大约5分钟):

def bfs(self):    fringe = deque([])    # 开始执行    fringe.append(self.stateObj.getState())    while len(fringe) > 0:        state = fringe.popleft()        self.visited.append(state)        # 仅用于跟踪        # 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) 从该列表和visited创建另一个新列表,c) 遍历整个列表以查看下一个状态是否已经存在。

看起来self.visited是一个list。将其改为set,这样in检查的时间复杂度将从O(n)变为O(1)。此外,在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*算法,使用错位的瓷砖数量作为启发式函数。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注