启发式搜索的想法
由于盲目搜索不会考虑当前节点离目标还有多远,因此我们提出了启发式搜索
这就是盲目搜索和启发式搜索的本质区别
它的想法是:试图尽早达到目标,优先扩展离目标更近的点
但是有个问题:如果我们能知道哪个结点离目标更近,那不就相当于已经知道解了?
因此我们这里所说的离目标更近,指的是估计距离,而不是实际距离
在这里,我们用启发式函数h(n)来表示估计距离,表示当前结点n离目标结点的距离
下面是几个启发式函数的例子
该图通过计算当前状态有多少个结点没有到达目标状态来表示启发式函数的值
该图通过表示当前当前状态与目标状态的曼哈顿距离来作为启发式函数的值
因此我们可以利用启发式函数,从而得到各种各样的启发式搜索方案
这里我们再引入一个概念:评估函数f(n)
评估函数决定了各种各样的启发式搜索方案
我们会优先选择评估函数最小的结点进行扩展
启发式搜索策略
贪婪最佳优先搜索GBFS
贪婪最佳优先搜索所使用的评估函数就是启发式函数,即f(n)=h(n)
即它优先扩展那些离目标状态最近的结点
下面我将给出几个GBFS的实例,便于理解
这里使用的是贪婪最佳优先图搜索,从而去除了重复的结点
若我们使用贪婪最佳优先树搜索,会出现什么问题呢?
如上图所示,从Iasi出发,路径最短的结点为Neamt。从Neamt出发,路径最短的结点为Iasi
因此整个搜索卡在死循环里,故这个贪婪最佳优先树搜索是不完备的
但若我们改为图搜索,则可以避免该问题
可以发现,图搜索直接跳过了Neamt,转而搜索Vaslui,从而避免了死循环问题
下面我们再来讨论一下GBFS的最优性
以机器人导航问题为例
若使用GBFS算法,该机器人的路径如上图所示,因此其不具备最优性
我们可以发现,GBFS不是不完备的,而且不是最优的
A*搜索
GBFS搜索只考虑到当前离目标有多远,并没有考虑初始状态到当前结点有多远,故我们可以加入已经产生的路径代价,即f(n)=g(n)+h(n),这就是A*搜索的基本思想。
其中g(n)表示初始节点到当前结点的距离
A*搜索算法的特性就是:每次从frontier中选出g(n)+h(n)最小的结点进行扩展
此处A*搜索算法也有做重复性检查,即子节点不在frontier或explore里,就进行插入
若新产生的子节点和已有的frontier结点重复,则保留小的,去掉大的
若新产生的子节点和已有的explore结点重复,则保留老的,去掉新的
我们通过最后一张图来解释一下,该算法是如何做重复性检查的
上图蓝色斜线去除的部分:表示新产生的子节点与已有的frontier结点重复,则保留小的,去除大的,因此450的Bucuresti被去除了,418的Bucuresti被保留了
上图灰色斜线去除的部分:表示新产生的子节点与已有的explore结点重复,则保留老的,去除新的
下面我们需要考虑A*搜索的最优性如何呢?这需要通过启发式函数的性质来确定。
启发式函数
可采纳性
我们考虑下图的情况,尝试使用A*搜索能否找到解
下面我们使用A*搜索来走一遍流程
- S为初始状态,那么会将A和G同时加入到frontier中
- 我们从frontier中选取g(n)+h(n)最小的结点:即G
- 可以发现G就是目标节点
因此我们如果使用的是A*搜索,找到是绿色那条路径
但显然绿色这条路径不符合常理,因此我们需要思考一下问题出在哪?
既然路径距离估计错误,那问题肯定是出现在启发式函数这里,即我们所估计离目标节点的值不准
故需要更改启发式函数的值!
我们发现,A结点的估计距离h=6,这个估计距离大于A到G的实际距离,因此这会破坏算法的最优性
因此,并不是所有的启发式函数都能够被使用,故我们引入可采纳性
由上图可知,只有当估计值小于最优值时,才能作为可采纳的启发式
下面我们再给出一个例子
左边的图表示原始的图,中间的图表示使用A*树搜索算法得到的结果,右边表示使用A*图搜索算法得到的结果。
可以发现A*图搜素算法此时并没有最优性,但若我们对B的启发式函数值进行更改,从100->91
则此时就可以找到最佳路径,如下图所示
一致性
从上图我们可以引出一致性的概念
任何问题的最优路径解代价都遵守三角不等式
我们可以发现,若满足一致性就会满足可采纳性
下图是证明
准确性
下面再来考虑一下准确性
当给定两个启发式函数时,我们需要判断哪个启发式函数更加准确
此处两个启发式函数h2,h1对于所有结点而言,h2都大于h1,则说明h2更加准确
如何设计可采纳的启发式函数
可采纳:即估计代价小于最优路径的真实代价
我们有以下几种方法:①松弛问题②子问题③学习
松弛问题
我们减少了行动的限制,那么在每个结点处,可做的动作就增加了,那么就相当于图中的结点之间的边变多了,那么松弛后的图的最优路径一定小于等于未松弛后的图。
因此,一个松弛问题的最优解代价一定小于等于原问题的最优解代价,从而是原问题的可采纳的启发式。
下面我们需要考虑:松弛问题所得到的启发式是否为原问题的一致的启发式?
上述证明利用了:任何问题和松弛问题的最优路径解代价都满足三角不等式的特点
那若有多个可采纳的启发式,该如何选择?
子问题
上面提及的松弛问题的本质就是在图里面增加边
那子问题的本质就是在图里面合并结点
我们以两个例子为例进行说明
对于上图而言,若未进行合并,则需要走5步,若进行合并,则需要走3步即可
因此对结点进行合并,也会导致最优路径代价变小