我正在使用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)时,我得到了最佳得分节点的并列。但是将项目插入巨型列表的中间并不是一个非常快速的行动吗?什么是更好的选择?
我还考虑过没有订购边缘列表,但这看起来一样糟糕或更糟(因为每次弹出一个节点时都必须搜索整个列表。
答案 0 :(得分:1)
要回答您的具体问题,假设您的分数是整数,请创建列表字典,将分数映射到具有该分数的节点。这使得插入O(1),并且因为你可以迭代可能的分数范围,所以检索也应该很快。