我正在做一项任务,我必须使用a-star来解决15-puzzle(在C中)。
启发式函数是Manhattan distance(又名出租车距离)。
我们获得了一个示例输入/输出,其中电路板以 22 移动并在扩展 395 节点(电路板状态)后解决(即我们必须查看395个节点的孩子们)
通过'正确'启发式,我的意思是我的功能与用于产生样本输出的功能相同,并产生正确的距离。
问题是我的解决方案扩展了超过400个节点以找到解决方案(它是最佳的22个移动但是不同的)。
我注意到数字的变化取决于我生成子节点的顺序(向上,向左,向下,向右或其他方向移动空格键)。
有24种方法可以向上,向下,向左和向右移动空间磁贴以生成子项,我尝试了所有这些,但没有一个扩展395个节点。
为什么会这样?
术语:
PS:如果重要的话,我正在使用二进制堆作为开放列表
由于
答案 0 :(得分:2)
嗯......在理想的情况下,A *不依赖于你生成孩子的顺序。不幸的是,如果您在“队列”中有两个或多个具有相同距离加成本启发式值的节点,则算法可以选择“随机”其中一个节点并找到不同的解决方案(并探索不同的搜索路径)。
我认为你可以尝试:
这是我能用这些信息告诉你的唯一的事情。 :)