启发函数

这个应该是搜索部分最有实用意义的一部分。给定一个搜索问题,如何确定一个启发函数,这无意是最具指导意义的。

考虑一个实际问题,8数码问题:在3×3的格子上有8个棋子,1-8,随机摆放在棋盘的四周格子中,其中中间的一格没有棋子,要通过移动,把这8个棋子变成按1-8的顺序排列的棋子。并且空格在0,0位置。

这里有两个启发函数
h1 = 不在位的棋子数,如果某状态所有的棋子都不在正确的位置,那么h1=8.可以知道这是一致性的启发函数。

h2=所有棋子到其目标位置的距离和,因为棋子不能斜着移动,这里的距离是指水平和竖直距离的和。这个函数也是一致的。

这两个启发函数,到底哪个好呢?一种刻画启发式函数的方法是有效分支因子b* , 对于某个问题,如果A*算法生成的总结点数为N,解的深度为d。那么b*就是深度为d的标准搜索树为了能够包括这N+1个节点所必需的分支因子。即
N+1 = 1+ b* + pow(b*,2) + pow(b*,3) + … + pow(b*,d)

如果A*算法用52个节点在第5层找到了解,那么b*就是1.92. 这个因子在实际问题中通常比较稳定,因此可以在小规模范围内估计这个b*,然后在实际问题中采用最小的b*来处理问题。

实际实验证明h2要比h1要好。

其实从另一个方面,如果h2/h1,是两个一致启发函数,并且h2(n)>h1(n) , 那么h2是比h1更好的启发函数。这是因为A*算法总是搜索所有的f(n) < C* 的节点。 而f(n) = g(n) + h(n) ,  h(n)越大,那么对应的g(n)就越小,满足f(n) < C*的节点就越少。

那么如何设计h2这个启发函数呢?计算机能否设计出这样的函数呢?

h1/h2估计剩余路径的长度,如果我们改变游戏规则,是棋子可以随便移动,而不是只能移动到起相邻的空格上,那么h1将给出最短解的确切步数。如果棋子每次可以横向或者纵向移动一格,而不管这个位置原来是不是有棋子,那么h2将给出最短解的确切步数。这里,减少了行动限制问题的问题成为松弛问题。松弛状态问题是原有状态空间的超图,因为减少限制导致图的边增加。

由于松弛问题增加了状态空间的边,原有问题的最优解是松弛问题的“最优”解,但是松弛问题可能存在更好的解。所以一个松弛问题的最优解代价是原问题的可采纳的启发式。更进一步,由于得出的启发式是松弛问题的确切代价,那么他一定遵守三角不等式,因而是一致的。

考虑上面的8数码问题,其行动可描述如下:棋子可以从A移到B,如果A与B水平或竖直相邻,并且B是空的。

如果去掉其中一个或者两个条件,生成三个松弛问题:

1.棋子可以从A移到B,如果A和B是相邻的。
2.棋子可以从A移到B,如果B是空的
3.棋子可以从A移到B。

由1,我们可以得到h2; 由3,可以得到h1。而由二,我们可以得到第三个启发函数。

如果我们得到一些列的启发函数,h1,h2,h3,但是找不大一个明显好的启发函数,那可以用h(n)=max(h1(n),h2(n),…,hm(n)) 来作为启发函数,而这个启发函数比任何一个单个的启发函数都要好。

可以证明h(n)是一致的,如果每个hi(n)都是一致的。
这个可以通过反证法得到,假设h(n)=hi(n) ,  h(n’)=hj(n’) , 现在要证明hi(n)<=c(n,a,n’) + hj(n’)
假设hi(n)  > c(n,a,n’) +hj(n’)  , 那么因为hj(n’) > hi(n’),  可以得到hi(n) > c(n,a,n’) + hi(n’) . 这与hi是一致启发函数相矛盾。因此,max(h1,h2,h3,…hm)是一致的启发函数。因为这函数比所有的启发函数都要大,因此她比所有的启发函数的都要好。

另外从子问题出发,也可以设计处可采纳的启发式。依旧考虑上面的8数码问题,如果只考虑将棋子1,2,3,4移动到正确的位置上,显然这个子问题的最优解的代价是完整问题的解代价的一个下界。在某些情况下,比上面提到的h2 要更好。

模式数据库的想法就是对每个可能的子问题实例存储解代价,最为一个启发函数。而1,2,3,4的选择是随机的,我们也可以选择自问题,2,3,4,5或者5,6,7,8,这样对于每个子问题。我们都可以构造一个启发函数,然后取MAX(hi)得到一个较好的启发函数。通过这样的方式,可以构造出更加精确的启发函数。

文章出处:http://www.bagualu.net/wordpress/archives/3431

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值