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