关于A*算法的内容请看这个包你看懂的教程(只要你有耐心): 点击打开链接
关于八数码问题请看:点击打开链接
其实,看完这个A*算法的教程,你肯定知道怎么用A*算法去解决路径是否存在,若存在最短路径是多少这类的问题。但是,遇到八数码问题时,估计还是觉得它跟A*算法没什么关系啊。(至少我这个死菜鸟是这样觉得的......)有这样的疑问,很可能是心中有以下几个问题:
1、第一个链接的A*算法跟第二个链接的A*算法的联系和区别到底在哪里呢?
2、搜索算法到底是怎样来解决问题的?
3、A*算法到底可以解决怎样的问题?
下面,我们来一一理清:
1、区别:第一个A*跟第二个A*的估价函数的不同,即第一个A*的估价函数用的是曼哈顿估值法,而且第二个A*的估价函数是每个点的初始态和终止态的偏移量之和;
联系:寻找待扩展点的方式。都是按照“是否与当前节点相邻节点”这一条件来找待扩展点。
2、搜索算法就是通过在一个图(矩阵)中,1、从初始点开始,2、寻找到待扩展点,3、通过某些人为的约定来从待扩展点中选择下一个真正的扩展点(如A*中根据估价函数来选择扩展点,保证每次的扩展点都是估价函数最小的),最终得到到终点的一条路径。
3、A*算法解决的就是矩阵如何从一个状态转换到另外一个状态(前提是可以转换成功),无论这个“状态”是想第一个A*中的单个点的矩阵点的转换,还是八数码中的整个矩阵的所有点的转换。
PS:八数码问题还有一个特殊情况,就是开始的节点所在的位置刚好是目标节点的位置,如:
283 164 705
123 804 765
此时,终止循环的条件就是:while(当前节点所在的位置是终止点&&估价函数为0)
A*算法的启发性有小小贪心算法的味道!!
未完待续...