1、问题描述
1.1什么是八数码问题
八数码游戏包括一个33的棋盘,棋盘上摆放着8个数字的棋子,留下一个空位。与空位相邻的棋子能够滑动到空位中。游戏的目的是要达到一个特定的目标状态。标注的形式化以下: 初始状态 7 5 3java
1 6 4c++
2 8 0算法
目标状态 1 2 3编程
8 0 4bash
7 6 5函数
1.2 问题的搜索形式描述
状态: 状态描述了8个棋子和空位在棋盘的9个方格上的分布。布局
初始状态: 任何状态均可以被指定为初始状态。学习
操做符: 用来产生4个行动(上下左右移动)。测试
目标测试: 用来检测状态是否能匹配上图的目标布局。优化
路径费用函数:每一步的费用为1,所以整个路径的费用是路径中的步数。
如今任意给定一个初始状态,要求找到一种搜索策略,用尽量少的步数获得上图的目标状态
1.3 算法思想
1.3.1 启发式搜索算法 有序搜索算法(A算法)
启发式搜索算法 A,通常简称 A算法 是一种典型的启发式搜索算法,其基本思想:
定义一个评估函数f,对当前的搜索状态进行评估,找到一个最有但愿的节点进行扩展。
评估函数的形式以下:
f(n)=g(n)+h(n)
其中:
n是被评估的节点
f(n) 是节点n从初始点到目标点的估价函数。
g(n) 是在状态空间中从初始节点到n节点的实际代价。
h(n)是从n到目标节点最佳路径的估计代价。
f(n)=g(n)+h(n) 表示从初始节点s通过节点n到目标节点g的评估代价
保证找到最短路径(最优解)的条件,关键在于估价函数h(n)的选取。估价值h(n)<= n到目标节点的距离实际值,这种状况下,搜索的点数多,搜索范围大,效率低。但能获得最优解。若是估价值>实际值, 搜索的点数少,搜索范围小,效率高,但不能保证获得最优解。
搜索中利用启发式信息,对当前未扩展结点根据设定的估价函数值选取离目标最近的结点进行扩展,从而缩小搜索空间,更快的获得最优解,提升效率。
1.3.1.1 A算法应用
在启发式搜索算法中,根据估价函数值,按由小到大的次序对Open表中的节点进行从新排序,这就是有序搜索法。所以,此时的Open表是一个按节点的启发估价函数值的大小为序排列的一个优先队。
有序搜索算法以下:
一、将初始节点S0放入Open表中;
二、如Open表为空,则搜索失败,退出;
三、把Open表的第一个节点取出,放入到Closed表中,并把该节点记为节点n;
四、若是节点n是目标节点,则搜索成功,求得一个解,退出;
五、扩展节点n,生成一组子节点,对既不在Open表中也不在Closed表中的子节点,计算出相应的估价函数值;
六、把节点n的子节点放到Open表中;
七、对Open表中的各节点按估价函数值从小到大排列;
八、转到2 。
1.3.2启发式搜索算法 A*算法
在A*算法中,启发性信息用一个特别的估价函数f*来表示:
f*(n)=g*(n)+h*(n)
式中:
g*(n)为从初始节点到节点n的最佳路径所付出的代价;
h*(n)是从n到目标节点的最佳路径所付出的代价;
f*(n)是从初始节点出发经过节点n到达目标节点的最佳路径的总代价。
(在这里要特别说明前面所说的f(n)=g(n)+h(n) 未带 * 为评估代价而非必定是最优代价)
基于上述g*(n)和h*(n)的定义,对启发式搜索算法中的g(n)和h(n)作以下限制:
①g(n)是对g*(n)的估计,且g(n)>0;
②h(n)是h*(n)的下界,即对任意节点n均有h(n)≤h*(n)。
在知足上述条件状况下的有序搜索算法称为A*算法。
对于某一搜索算法,当最佳路径存在时,就必定能找到它,则称此算法是可纳的。能够证实,A*算法是可纳算法。也就是说,对于有序搜索算法,当知足h(n)≤h*(n)条件时,只要最佳路径存在,就必定能找出这条路径。
2、问题解析
2.1 A*算法评估函数的分析
A* 算法的优劣性主要是靠评估函数的启发能力上,对于八数码问题
f*(n)=g*(n)+h*(n)
g*(n)是能够肯定的,对于h*(n)启发函数根据任意结点与目标之间的差别定义,例如取h(n)=w(n),咱们很容易知道,尽管对具体的h*(n)是多少咱们不知道,但根据“不在位”将牌个数这个估计,就能得出至少要移动多少步才能到达目标。若是启动函数根据考虑到任意结点与目标之间的距离的信息,例如取h(n)=P(n),P(n)定义为每个将牌与其目标位置之间的距离总和
例如:
任意状态s 7 5 3
1 6 4
2 8 0
目标状态g 1 2 3
8 0 4
7 6 5
中任意状态s中将牌 7 (1,1) 与目标状态 7 (3,1)距离为 L=|3-1|+|1-1|=2
P(n)=每个将牌与其目标位置之间的距离总和,
此外,咱们还发现
1 2 3 1 2 3
8 0 4 4 0 8
7 6 5