八数码问题A*算法
2014-08-14 10:37
134 查看
转载自:http://blog.163.com/lqp18_31/blog/static/54182769200931953856679/
在此只介绍八数码问题A*算法的主要思想及思路:
1、什么是八数码问题A*算法?
简单来说八数码问题A*算法就是会将队列中的结点按“估价值”由小至大按序并让“估价值”小的结点优先出队的广度优先搜索算法。
2、下面看该算法相关介绍:
(1)、启发式搜索
广度优先搜索和双向广度优先搜索都属于盲目搜索,这在状态空间不大的情况下是很合适的算法,可是当状态空间十分庞大时,它们的效率实在太低,往往都是在搜索了大量无关的状态结点后才碰到解答,甚至更本不能碰到解答。
搜索是一种试探性的查寻过程,为了减少搜索的盲目性引,增加试探的准确性,就要采用启发式搜索了。所谓启发式搜索就是在搜索中要对每一个搜索的位置进行评估,从中选择最好、可能容易到达目标的位置,再从这个位置向前进行搜索,这样就可以在搜索中省略大量无关的结点,提高了效率。
(2)、A*算法
A*算法是一种常用的启发式搜索算法。
在A*算法中,一个结点位置的好坏用估价函数来对它进行评估。A*算法的估价函数可表示为:
f'(n) = g'(n) + h'(n)
这里,f'(n)是估价函数,g'(n)是起点到终点的最短路径值(也称为最小耗费或最小代价),h'(n)是n到目标的最短路经的启发值。由于这个f'(n)其实是无法预先知道的,所以实际上使用的是下面的估价函数:
f(n) = g(n) + h(n)
其中g(n)是从初始结点到节点n的实际代价,h(n)是从结点n到目标结点的最佳路径的估计代价。在这里主要是h(n)体现了搜索的启发信息,因为g(n)是已知的。用f(n)作为f'(n)的近似,也就是用g(n)代替g'(n),h(n)代替h'(n)。这样必须满足两个条件:(1)g(n)>=g'(n)(大多数情况下都是满足的,可以不用考虑),且f必须保持单调递增。(2)h必须小于等于实际的从当前节点到达目标节点的最小耗费h(n)<=h'(n)。第二点特别的重要。可以证明应用这样的估价函数是可以找到最短路径的。
3、估价函数算法:
估价函数f(n)=结点深度g(n)+结点至目标结点的估价h(n)
示意图:
![](http://img.blog.163.com/photo/CwQxlf9nebu3VPOM-KIQbw==/856246879154885856.jpg)
4、算法示意图:
![](http://img.blog.163.com/photo/ky8maeVB5qBwyKdKC_vgUQ==/856246879154885875.jpg)
5、队列重复键处理。
(1)、若新生结点与已出队结点重复则不入队。
(2)、若新生结点与队列中结点重复则保留深度较浅的结点。
在此只介绍八数码问题A*算法的主要思想及思路:
1、什么是八数码问题A*算法?
简单来说八数码问题A*算法就是会将队列中的结点按“估价值”由小至大按序并让“估价值”小的结点优先出队的广度优先搜索算法。
2、下面看该算法相关介绍:
(1)、启发式搜索
广度优先搜索和双向广度优先搜索都属于盲目搜索,这在状态空间不大的情况下是很合适的算法,可是当状态空间十分庞大时,它们的效率实在太低,往往都是在搜索了大量无关的状态结点后才碰到解答,甚至更本不能碰到解答。
搜索是一种试探性的查寻过程,为了减少搜索的盲目性引,增加试探的准确性,就要采用启发式搜索了。所谓启发式搜索就是在搜索中要对每一个搜索的位置进行评估,从中选择最好、可能容易到达目标的位置,再从这个位置向前进行搜索,这样就可以在搜索中省略大量无关的结点,提高了效率。
(2)、A*算法
A*算法是一种常用的启发式搜索算法。
在A*算法中,一个结点位置的好坏用估价函数来对它进行评估。A*算法的估价函数可表示为:
f'(n) = g'(n) + h'(n)
这里,f'(n)是估价函数,g'(n)是起点到终点的最短路径值(也称为最小耗费或最小代价),h'(n)是n到目标的最短路经的启发值。由于这个f'(n)其实是无法预先知道的,所以实际上使用的是下面的估价函数:
f(n) = g(n) + h(n)
其中g(n)是从初始结点到节点n的实际代价,h(n)是从结点n到目标结点的最佳路径的估计代价。在这里主要是h(n)体现了搜索的启发信息,因为g(n)是已知的。用f(n)作为f'(n)的近似,也就是用g(n)代替g'(n),h(n)代替h'(n)。这样必须满足两个条件:(1)g(n)>=g'(n)(大多数情况下都是满足的,可以不用考虑),且f必须保持单调递增。(2)h必须小于等于实际的从当前节点到达目标节点的最小耗费h(n)<=h'(n)。第二点特别的重要。可以证明应用这样的估价函数是可以找到最短路径的。
3、估价函数算法:
估价函数f(n)=结点深度g(n)+结点至目标结点的估价h(n)
示意图:
![](http://img.blog.163.com/photo/CwQxlf9nebu3VPOM-KIQbw==/856246879154885856.jpg)
4、算法示意图:
![](http://img.blog.163.com/photo/ky8maeVB5qBwyKdKC_vgUQ==/856246879154885875.jpg)
5、队列重复键处理。
(1)、若新生结点与已出队结点重复则不入队。
(2)、若新生结点与队列中结点重复则保留深度较浅的结点。
相关文章推荐
- 用java实现人工智能中的A*算法求8数码问题
- 数码城竞选海报问题;空间换时间;类似于哈希表的思想一样;过一阵贴上另一种的算法;
- 八数码问题的三种算法解答(C#源代码)
- 数据结构算法: 八数码问题 小结
- A* 算法解决八数码问题 matlab
- 八数码问题--A算法实现---C#实现---VS2008可以执行
- [算法入门经典] 7.5.3 八数码问题 | HDU 1043
- 八数码问题高效算法(人工智能实验)
- 三种距离.A*算法解八数码问题
- 算法学习之8数码问题
- 八数码问题的 A* 算法解答
- 算法竞赛入门经典 7.5.3 八数码问题
- 【算法学习笔记】18.暴力求解法06 隐式图搜索2 八数码问题 未启发
- 【算法】BFS+哈希解决八数码问题
- 吴昊品游戏核心算法 Round 17 ——(转载)八数码问题的十重境界
- 算法练习-NOJ-1045-六数码问题
- 八数码问题的三种算法解答(C#源代码) (补充)
- 双向广度优先搜索算法框架及八数码问题例程
- 每天刷个算法题20160526:BFS解决八数码问题(九宫格问题)
- 【算法学习笔记】18.暴力求解法06 隐式图搜索2 八数码问题 未启发