我使用曼哈顿启发式和曼哈顿以及线性冲突启发式编码了A-star算法的15-puzzle。
我的问题是,对于某些特定的谜题实例,线性冲突会导致比单独使用a-Star的曼哈顿启发式创建和探索更多节点吗?
由于我尝试通过我的程序解决的大多数谜题实例需要< 50 Moves使用曼哈顿的给定内存在适当的时间内解决并解决更快将其与线性冲突组合作为启发式,需要> 50个移动的实例导致程序无限期运行并挂断我的机器,但是对于一个需要42次移动的特定问题,我的程序在~8秒内使用曼哈顿解决但是同时使用线性冲突导致程序无限期运行并挂断我的机器
我一遍又一遍地浏览了我的代码,但我在线性冲突或曼哈顿启发式代码中找不到错误。因此,这个一般性问题需要确定。
以下实例导致上述问题。
2,8,7,11 //Takes 42 Moves to solve
5,0,4,15
13,9,14,3
1,10,6,12
答案 0 :(得分:7)
曼哈顿启发式和曼哈顿线性冲突都是可接受的启发式,即他们从不高估达到目标的努力。此外,线性冲突的曼哈顿比简单的曼哈顿更有见地。
我们说如果每个节点n 的h2(n)> = h1(n),则启发式h2占主导地位,或者比启发式h1更明智。在这种情况下,使用h2作为启发式的 A *将始终扩展由h1 扩展的节点的子集。回答你的问题,A *与曼哈顿和线性冲突启发式不能扩展更多的节点,事实上,无法扩展任何未被A *扩展的节点与简单的曼哈顿启发式< / strong>,即由A *与曼哈顿线性冲突扩展的节点集是由A *与普通曼哈顿展开的节点的子集。
尝试使用调试器检查您的代码并找到此方案,这可能会帮助您找到实现中的错误。
如果有更正式的答案,我建议您仔细阅读post。
关于您的机器在困难问题中遇到的问题,A *必须存储所有已关闭和打开的节点,从而导致内存的指数浪费。要解决15个难题,请进行迭代深化(IDA *),其中执行时间和内存消耗更好。
答案 1 :(得分:0)
虽然如FrankS101所述,使用具有线性冲突的曼哈顿距离启发式不可能扩展比仅仅使用manhttan距离更多的节点,但可能需要更多时间。这是因为计算曼哈顿距离与线性冲突将使算法&#34;花费&#34;每个节点的时间更长,因为计算此启发式需要更多时间。