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

时间:2016-02-25 00:29:40

标签: python search artificial-intelligence a-star 8-puzzle

我正在使用A *搜索和广度优先搜索来查找8拼图中的获胜游戏状态。获胜州看起来像这样

123
456
780

并存储为类似

的列表
[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)时,我得到了最佳得分节点的并列。但是将项目插入巨型列表的中间并不是一个非常快速的行动吗?什么是更好的选择?

我还考虑过没有订购边缘列表,但这看起来一样糟糕或更糟(因为每次弹出一个节点时都必须搜索整个列表。

1 个答案:

答案 0 :(得分:1)

要回答您的具体问题,假设您的分数是整数,请创建列表字典,将分数映射到具有该分数的节点。这使得插入O(1),并且因为你可以迭代可能的分数范围,所以检索也应该很快。