启发式搜索算法(A*算法)

A算发:在bfs算法中,若对每个状态n都设定估价函数f(n)=g(n)+h(n),并且每次从开启列表中选节点
进行扩展时,都选取f值最小的节点,则该搜索算法为启发式搜索算法,又称A算法。
g(n):从起始状态到当前状态n的代价。
h(n):从当前状态n到目标状态的估计代价。、

A算法的例子——八数码

2 6 3      1 2 3
1 8   -----> 8  4
7 4 5      7 6 5
定义估价函数  f(n)=g(n)+h(n)初始节点
g(n):为从初始节点到当前节点的步数。
h(n):为当前节点“不在位”的方块数。
h计算举例

2 6 3         1 2 3
1 8    ------>  8  4  
7 4 5         7 6 5
2,6,1,8,4,5 都不在位,因此h=6

A*算法
 
A算法中的估价函数若选取不当,则可能找不到解,或找到的解也
不是最优。因此,需要对估价函数做一些限制,使算发确保找到
最优解(步数,即状态转移次数最少的解)。A*算法即为估价函数
做了特定限制,且确保找到最优解的A算法。
A* 算法 f*(n)=g*(n)+h*(n) 
f*(n):从初始节点s0出发,经过节点n到达目标节点的最小步数(真实值)
g*(n):从s0出发,到达n的最少步数(真实值)
h*(n):从n出发,到达目标节点的最少步数(真实值)
估价函数f(n)则是f*(n)的估计值

A*算法 f(n)=g(n)+h(n),且满足以下限制: g(n)是从s0到n的真实步数(未必是最优的),因此g(n)>0且g(n)>=g*(n)
h(n)是从n到目标的估计步数,估计总是过于乐观的 即h(n)<=h*(n) 且h(n)相容,则A算法就转变为A*算法。

A*算法 h(n)的相容:如果h函数对任意状态s1和s2还满足:h(s1)<=h(s2)+c(s1,s2)
C(s1,s2)是s1转移到s2的步数,则称h是相容的。h相容能确保随着一步步往前走,f递增,这样A*能高效找到最优解。
h相容=> g(s1)+h(s1)<=g(s1)+h(s2)+c(s1,s2)=g(s2)+h(s2)=>f(s1)<=f(s2) 即f是递增的。

A*算法的搜索效率很大程度上取决于估价函数h(n),一般说来,在满足h(n)<=h*(n)的前提下,h(n)的值越大越好
八数码问题: 
方案一:h(n)为不在位的数字个数
方案二:h(n)为不在位的数字到其该呆的位置的曼哈顿距离和
后者优于前者
A*算法解决八数码问题 
hdu oj 1043 题解:http://blog.csdn.net/xiaosshhaa/article/details/54315981

poj :1376 1324 1084 2449 1475 











  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 启发式搜索算法A*搜索是一种常用于求解8数码问题的算法。该算法通过维护一个开放列表和一个关闭列表,不断地从开放列表中选取最优的节点进行扩展,直到找到目标状态或者开放列表为空。 在A*搜索中,每个节点都有一个估价函数f(n),表示从起始状态到该节点的路径长度加上该节点到目标状态的估计距离。其中,路径长度可以通过节点深度来计算,而估计距离则可以通过启发式函数来计算。常用的启发式函数包括曼哈顿距离、欧几里得距离等。 在扩展节点时,A*搜索会先计算每个邻居节点的f值,并将其加入开放列表中。如果邻居节点已经在开放列表中,那么会比较其新的f值和原来的f值,如果新的f值更小,则更新该节点的f值和父节点。如果邻居节点已经在关闭列表中,那么不做处理。 通过不断地扩展节点,A*搜索可以找到从起始状态到目标状态的最短路径。同时,由于启发式函数的存在,A*搜索可以在搜索过程中尽可能地减少搜索节点数,从而提高搜索效率。 ### 回答2: 8数码问题是一类经典的启发式搜索问题,其目的是在一个3x3的方格中,通过移动数码的方式将初始状态变为目标状态。该问题中,初始状态和目标状态都是由1~8这八个数字构成,其中一个方格为空位,可以用“0”代替。 A*搜索算法是一种启发式搜索算法,通过估算每个可能的下一步的代价(启发)来指导搜索,以最小化总代价(启发函数值 + 已花费代价)来寻找到达目标状态的最优解。具体流程如下: 1.将初始状态加入OPEN表中,同时将起始结点的估价函数值设为0. 2.从OPEN表中取出具有最小估价函数值的结点,记为当前结点。 3.对当前结点进行扩展,产生所有可能的子结点,并计算子结点的启发函数值和已花费代价。 4.对于每个子结点,如果它已经存在于OPEN或者CLOSE表中,那么将其父结点指向当前结点,并比较已花费代价。如果当前路径的已花费代价比之前路径低,那么更新子结点的已花费代价和父结点。 5.如果子结点不在OPEN或者CLOSE表中,那么将其加入OPEN表中,并更新其已花费代价和父结点。 6.重复以上步骤,直到当前结点为目标状态,或者OPEN表为空,此时问题无解。 对于8数码问题,可以将每个状态表示为一个长度为9的数组,数组中每个元素表示该位置的数码,空位用0表示。估价函数可以使用曼哈顿距离(Manhattan Distance)来估计,即对于当前状态和目标状态中的每个数字i,计算其在当前状态中的位置和在目标状态中的位置之间的曼哈顿距离,并将所有距离加起来作为该状态的估价函数值。已花费代价可以通过统计当前状态中的数字和目标状态中的数字不同的个数来计算。 综上所述,通过使用A*搜索算法以及曼哈顿距离和数字不同的个数作为启发函数和代价函数,可以解决8数码问题,并找到最优解。 ### 回答3: A*搜索是一种常用的启发式搜索算法,能够高效地求解许多实际应用中的搜索问题。在8数码问题中,我们需要从一个3x3的数字矩阵的初始状态出发,通过交换数字,找到一组特定的目标状态。 A*搜索的基本思想是维护一个节点集合,每个节点包含了从初始状态到该节点的路径,以及一个估价函数值f(n),表示从初始状态经过该节点到达目标状态的估计代价。通过选择f(n)最小的节点进行扩展,A*搜索能够快速地找到解决问题的最优路径。 在8数码问题中,我们可以采用曼哈顿距离作为估价函数。曼哈顿距离是每个数字距离目标位置的曼哈顿距离的总和。例如,数字1在初始状态中的位置为(0,0),在目标状态中的位置为(0,0),它的曼哈顿距离为0。数字2在初始状态中的位置为(1,0),在目标状态中的位置为(1,1),它的曼哈顿距离为1。而所有数字的曼哈顿距离之和就是估价函数值f(n)。 通过使用A*搜索算法,我们可以高效地求解8数码问题,找到从初始状态到目标状态的最短路径。同时,我们也可以通过调整估价函数来进一步优化算法的性能,使其适用于更加复杂的搜索问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值