在A*搜索中选择/排序最佳节点的更有效方法是什么?

我在使用A*搜索和广度优先搜索来寻找8字谜游戏的获胜状态。获胜状态看起来像这样

123456780

并以如下列表形式存储

[1,2,3,4,5,6,7,8,9,0]

我使用了一个启发式函数来对每个节点(基于其状态)进行评分,但我认为我对最佳评分节点的优先级排序方法大大减缓了程序的速度。实际上,我的广度优先搜索算法的表现远远超过了A*算法(尽管大部分内部工作是相同的)。

我认为减缓A*搜索速度的主要原因是我使用了边缘列表(用于存储节点的列表)中的位置来指示下一个要优先处理的节点。

def aStartSort(node):    if not fringe:        fringe.append(node)    else:        fl = len(fringe)        if node.score >= fringe[fl-1].score:            fringe.append(node)        else:            for i in range(fl):                if node.score < fringe[i].score:                    fringe.insert(i, node)

如你所见,每次向边缘列表添加一个节点时,它会寻找一个评分比它差的节点,然后将自己插入到该节点之前。这样可以确保当我执行fringe.pop(0)时,至少能得到一个最佳评分节点的平局。但将项目插入到一个巨大的列表中间并不是一个很快的操作,对吗?有什么更好的替代方法吗?

我还考虑过不排序边缘列表,但这似乎同样糟糕或更糟(因为每次弹出一个节点时,都需要搜索整个列表)。


回答:

为了回答你的具体问题,假设你的分数是整数,创建一个字典列表,将分数映射到具有该分数的节点。这样插入操作是O(1),而且由于你可以遍历可能的分数范围,检索速度也应该很快。

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中创建了一个多类分类项目。该项目可以对…

发表回复

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