Artificial intelligence 用启发式方法找到星形中展开值最小的节点的最有效方法是什么?

Artificial intelligence 用启发式方法找到星形中展开值最小的节点的最有效方法是什么?,artificial-intelligence,heuristics,a-star,Artificial Intelligence,Heuristics,A Star,我正在用星号算法做8个谜题解算器。我在这个解算器中实现了曼哈顿和错位的启发式函数。在某些情况下,解算器工作正常。但在某些情况下,找到解决方案需要很多时间。我认为我的问题之一是在函数中查找打开列表中值最低的节点(等待扩展) 那么,找到最低f_分数值的最佳方法是什么?只需找到最小值,或者我们必须在有状态要添加时修改列表(在添加状态时对列表进行排序),以便最小值将位于第一个位置。维护一个列表 给定n元素,您可以在时间O(n)中将它们转换为一个堆。一旦它们成为堆,您就可以在timeO(log(n))中添

我正在用星号算法做8个谜题解算器。我在这个解算器中实现了曼哈顿和错位的启发式函数。在某些情况下,解算器工作正常。但在某些情况下,找到解决方案需要很多时间。我认为我的问题之一是在函数中查找打开列表中值最低的节点(等待扩展)

那么,找到最低f_分数值的最佳方法是什么?只需找到最小值,或者我们必须在有状态要添加时修改列表(在添加状态时对列表进行排序),以便最小值将位于第一个位置。

维护一个列表

给定
n
元素,您可以在时间
O(n)
中将它们转换为一个堆。一旦它们成为堆,您就可以在time
O(log(n))
中添加和删除元素,并且可以在time
O(1)
中找到最小的元素


要实现一个,您只需要一个数组。根节点是
0
,而
i
下面的节点位于
2*i+1
2*i+2
。堆的条件是每个节点都比它上面的节点小。最小的总是根。要添加一个元素,只需将它推到数组上,并让它“下降”到其自然水平。要移除一个元素,请取出根元素,从数组中取出最后一个元素,将其放在根,然后让它“冒泡”到正确的位置。(在“冒泡”阶段,将其与两个子节点中较小的节点交换,直到其下方最终没有较小的子节点。)要高效地创建阵列,请从中间元素开始,让每个元素“冒泡”。这个操作看起来像
O(nlog(n))
,但是仔细的分析表明,在这种情况下,堆只是
O(n)

。您选择的语言可能已经提供了比自己维护二进制堆更有效的优先级队列。@DataWraith说得对。然而@khpn可能正试图实现8谜题解算器,用于教育目的。编写自己的堆是一种教育经历。
 a part of psedocode(from wiki)
 while openset is not empty
     x := the node in openset having the lowest f_score[] value
     if x = goal
         return reconstruct_path(came_from, came_from[goal])
     ................................