我正在编写一个程序,使用两个启发式解决24拼图(5x5网格)。第一个使用了多少块不正确的位置,第二个使用块当前位置和所需位置之间的曼哈顿距离。
我在程序中有不同的功能,使用每个启发式A *和贪婪的搜索并比较结果(总共4个不同的部分)。
我很好奇我的节目是否错误或是否是这个难题的限制。拼图是随机生成的,片段被移动几次,大部分时间(约70%)找到大多数搜索的解决方案,但有时它们会失败。
我可以理解为什么贪婪会失败,因为它不完整,但看到A *完成后这让我相信我的代码中存在错误。
有人可以告诉我这是我的想法中的错误还是谜题的限制?对不起,如果措辞不当,我会在必要时重新说明。
由于
编辑:
所以我相当肯定这是我做错了。这是我如何进行搜索的逐步列表,这里有什么不对吗?
答案 0 :(得分:3)
如果您的意思是滑动拼图:如果您从工作解决方案中交换两个部分,这是可以解决的 - 所以如果您没有找到解决方案,这并不能说明算法的正确性。
这只是你的种子存在缺陷。
编辑:如果您从解决方案开始并进行(随机)合法移动,那么正确的算法将找到解决方案(因为撤销订单是一种解决方案)。
答案 1 :(得分:2)
发明它的人并不完全清楚,但Sam Loyd推广了14-15世纪的14-15拼图,这是5x5的4x4版本。
从Wikipedia文章中,奇偶校验证明了一半可能的配置无法解决。当你的搜索失败时,你可能会遇到类似的事情。
答案 2 :(得分:0)
我将假设您的代码是正确的,并且您正确地实现了所有算法和启发式。
这给我们留下了拼图初始化的“随机生成”部分。你确定你正在产生拼图的正确状态吗?如果你生成非法状态,显然没有解决方案。
答案 3 :(得分:0)
虽然您列出的步骤似乎有点不完整,但您已经列出足够的内容以确保您的A *会在有一个解决方案时达到解决方案(尽管只要您只是跳过节点就不是最佳的)。
听起来你的谜题生成有缺陷或你的算法没有正确实现。要轻松验证您的拼图生成,请存储用于生成拼图的步骤,然后反向运行并检查结果是否为解决方案状态,然后才能将拼图发送到搜索例程。如果您生成了无效拼图,请转储拼图,预期步骤并查看问题所在。如果谜题通过并且算法失败,则至少缩小了问题所在的位置。
如果结果是您的算法,请发布您实际实施的步骤的更详细说明(不仅仅是A *如何工作,我们都知道),例如当您运行评估函数时,以及您可以使用充当队列的列表。这样可以更轻松地确定实施中的问题。