尽管具有正确的启发式算法,为什么我的a-star算法会扩展太多节点?

时间:2011-10-22 12:46:23

标签: algorithm artificial-intelligence graph-algorithm path-finding a-star

我正在做一项任务,我必须使用a-star来解决15-puzzle(在C中)。

启发式函数是Manhattan distance(又名出租车距离)。

我们获得了一个示例输入/输出,其中电路板以 22 移动并在扩展 395 节点(电路板状态)后解决(即我们必须查看395个节点的孩子们)

通过'正确'启发式,我的意思是我的功能与用于产生样本输出的功能相同,并产生正确的距离。

问题是我的解决方案扩展了超过400个节点以找到解决方案(它是最佳的22个移动但是不同的)。

我注意到数字的变化取决于我生成子节点的顺序(向上,向左,向下,向右或其他方向移动空格键)。

有24种方法可以向上,向下,向左和向右移动空间磁贴以生成子项,我尝试了所有这些,但没有一个扩展395个节点。

为什么会这样?

术语:

  • 节点:每个节点是15拼图板的配置
  • children:通过移动空间可以实现的配置 从当前节点向上,向下,向左或向右平铺

PS:如果重要的话,我正在使用二进制堆作为开放列表

由于

1 个答案:

答案 0 :(得分:2)

嗯......在理想的情况下,A *不依赖于你生成孩子的顺序。不幸的是,如果您在“队列”中有两个或多个具有相同距离加成本启发式值的节点,则算法可以选择“随机”其中一个节点并找到不同的解决方案(并探索不同的搜索路径)。

我认为你可以尝试:

  • 检查距离加成本启发式功能。 (每个动作花费1?你以正确的方式将每个方格与正确位置的距离相加?)
  • 检查你的堆。它返回正确的节点?在同一步骤中可以拥有多少具有相同启发式值的节点?

这是我能用这些信息告诉你的唯一的事情。 :)