我用曼哈顿的启发式和曼哈顿的线性冲突启发式编码了15个拼图的A星算法。
我的问题是,对于某些特定的谜题实例,线性冲突会导致更多的节点被创建和探索,而不是仅仅使用a-Star的曼哈顿启发式?
由于我尝试通过我的程序解决的大多数谜题都需要在适当的时间内用曼哈顿来解决给定的内存,并以启发式的方式结合线性冲突进行更快的求解,而需要>50次移动的实例会导致程序无限期地运行并挂断我的机器,但是对于一个需要42次移动的具体问题,我的程序用曼哈顿在大约8秒内解决了,但在同样的情况下使用线性冲突会导致程序无限期地运行,并将我的机器挂机。
我一遍又一遍地检查我的代码,在我的线性冲突或曼哈顿启发式code.Thus中找不到一个错误,这是一个需要确保的一般性问题。
如上文所述,下面的实例会导致问题。
2,8,7,11 //Takes 42 Moves to solve
5,0,4,15
13,9,14,3
1,10,6,12发布于 2016-03-03 23:06:48
具有线性冲突的曼哈顿启发式算法和具有线性冲突的曼哈顿都是容许启发式算法(),也就是说,它们从不高估实现目标的努力。此外,具有线性冲突的曼哈顿比简单的曼哈顿更有见识。
如果(N) >= h1(n)对于每一个节点n,则称为h2(n) >= h1 (N),或者说它比启发式h2 (N)>=h1(N)更明智。在这种情况下,使用A*使用h2作为启发式,总是会扩展由h1扩展的节点子集。在回答您的问题时,A*使用曼哈顿和线性冲突启发式不能扩展更多的节点,实际上,不能用简单的曼哈顿启发式扩展任何未被A*扩展的节点,即A*与曼哈顿线性冲突扩展的节点集合是A*与普通曼哈顿扩展的节点的子集。
尝试使用调试器检查您的代码并找到这个场景,这可能会帮助您在实现中找到错误。
对于一个更正式的答案,我鼓励你仔细阅读这个post。
关于您的问题,您的机器挂在困难的问题上,A*必须存储所有关闭的和开放的节点,造成内存的指数浪费。为了解决15个难题,需要迭代深化(IDA*),在那里执行时间和内存消耗更好。
发布于 2016-03-26 22:23:22
虽然,正如FrankS101所述,使用带有线性冲突的曼哈顿距离启发式算法比简单地使用manhttan距离扩展更多的节点是不可能的,但可能需要更多的时间。这是因为用线性冲突计算曼哈顿距离会使算法在每个节点上“花费”更多的时间,因为计算这种启发式需要更多的时间。
https://stackoverflow.com/questions/35552661
复制相似问题