对于有解的情况,只需ID-A*即可。
首先谈一谈估价函数,估价函数表示的应该是对期望步数的下界。我一开始想的是用所有数现在的位置到应该在的位置的曼哈顿距离和,考虑到一次交换最多令其减少2,所以还要把它除以2。后来看了题解发现所有题解都是用的所有非0数的现在的位置到目标位置的曼哈顿距离和,这样的话一次交换最多令其减少1,这样应该是比较合适的。。
我一开始写的A*,(因为没有看懂ID-A*)A*需要面对map判重、heap维护,空间复杂度与时间复杂度相同,且挂了log的常数,时间空间都不占优。
后来终于看懂了ID-A*,ID-A*为什么不用判重?是因为我们考虑搜索树中的一个节点,如果它(假设我们做一个简单的剪枝、拒绝反着走到达当前状态的最后一步)被再次搜到,就意味着它至少又转了四下。也就是说一个点至多被搜 504≈13 ,即其常数约为13!也就是说这其实是比用平衡树判重快得多的。但是ID-A*是不能像A*一样每次取出预估最优的状态的,它只能通过调整上下来解决这个问题;这跟DFS与ID-DFS的区别还不一样,因为在一个预估较劣的状态可能会达到一个预估较优的状态。所以实际上ID-A*与A*的区别还是很大的,它实际上并不是A*的简单优化;它也并不一定比A*跑得更快,如果你的估价函数不是很准的话。。
其实这个题更有意思的地方,在于对于无解的判断。
我在网上并没有找到关于15数码的完整证明,不过有8数码的,但是我似乎并不能把它推广到15数码甚至是N*M数码。但是我前前后后研究了差不多有4个月,在这里将会给出一个严谨的证明。
命题:
在一个N*M( N>1,M>2