我正在编写一个程序,它使用两个启发式来解决一个 24 谜题(5x5 网格)。第一个使用不正确位置的块数,第二个使用块当前位置和所需位置之间的曼哈顿距离。
我在程序中有不同的函数,它们将每个启发式与 A* 和贪婪搜索一起使用并比较结果(总共 4 个不同的部分)。
我很好奇我的程序是否错误,或者是否是拼图的限制。拼图是随机生成的,碎片被移动了几次,大部分时间(~70%)通过大多数搜索找到了解决方案,但有时它们会失败。
我可以理解为什么贪婪会失败,因为它不完整,但是看到 A* 是完整的,这让我相信我的代码中有错误。
那么有人可以告诉我这是我的思维错误还是谜题的限制?对不起,如果这措辞不好,我会在必要时重新措辞。
谢谢
编辑:
所以我相当肯定这是我做错了。这是我如何进行搜索的分步列表,这里有什么问题吗?
- 为边缘创建一个新列表,按使用的启发式排序
- 创建一个集合来存储访问过的节点
- 将拼图的初始状态添加到边缘
- 虽然边缘不是空的..
- 从边缘弹出第一个元素
- 如果之前访问过该节点,则跳过它
- 如果节点是目标,则返回它
- 将节点添加到我们的访问集中
- 展开节点并将所有后代添加回边缘