在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

L1-L2正则化的不同系数

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

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

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

f1_score metric in lightgbm

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

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

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

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

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

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

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

发表回复

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