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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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