启发式搜索方法的概念
(1)启发式搜索方法介绍
早期人工智能算法进行问题求解的过程就是在给定具体问题后,算法在问题对应解空间中进行搜索,得到与问题相对应、满足一定的约束条件的最佳答案。也就是找到一条从初始状态到目标状态的最佳路径。
由于求解问题的过程中求解方式有多种,到达目标状态的方式也就有多种。这主要是由于求解过程中求解条件的不确定性和不完备性造成的。求解的路径多样性构成了一个图,我们称这个图为状态空间。常用的状态空间搜索有广度优先搜索和深度优先搜索,但是它们存在着较大的缺陷,它们都是在一个给定的状态空间中进行穷举,也都是根据搜索的次序依次进行搜索。故而我们把它称为盲目搜索,当状态空间非常大且不可预测时,使用盲目搜索的效率会非常低。这时就需要启发式搜索方法了。
与盲目搜索不同,启发式搜索方法利用与问题有关的信息(即启发信息),从中得到启发来指导搜索,从而降低搜索的复杂性,减少搜索量,以提高效率。
(2)启发式搜索方法表达形式
启发式搜索方法的核心在于启发式函数。这是一个将启发信息形式化为一个关于结点的函数,用于估计结点n距离达成目标还需付出多少代价。启发式函数是基于当前结点到目标结点的某些特征来估算成本,从而指导搜索过程优先考虑那些可能更接近最优解的路径。由于启发式函数是用来估计结点之间的距离,因此它通常是非负的。值得注意的是,启发式函数存在一些负值有时也不会影响搜索算法的性质。
在利用启发信息来辅助指导搜索时,常见的做法是使用这些信息来规定从边缘集合挑选结点次序。对于边缘集合中的任意结点n,函数
f
(
n
)
=
g
(
n
)
+
h
(
n
)
f\left(n\right)=g\left(n\right)+h\left(n\right)
f(n)=g(n)+h(n)
决定了搜索算法拓展结点n的优先度,这个函数被称为评价函数。我们规定:边缘结合中某个结点的评价函数值越小,其被挑选的优先级就越高。在深度优先搜索中,结点n的f\left(n\right)值可定义为该结点深度的倒数;在广度优先搜索中,结点n的
f
(
n
)
f\left(n\right)
f(n)值可以定义为该结点的深度。启发式搜索方法的公式表达如下,
f
(
n
)
=
g
(
n
)
+
h
(
n
)
f\left(n\right)=g\left(n\right)+h\left(n\right)
f(n)=g(n)+h(n)
其中
f
(
n
)
f\left(n\right)
f(n)是结点n的评价函数,
g
(
n
)
g\left(n\right)
g(n)是在状态空间中从初始节点到节点 n的实际代价,
h
(
n
)
h\left(n\right)
h(n)是从节点n到目标节点的最佳路径的估计代价。
g
(
n
)
g\left(n\right)
g(n)是已知的,
所以在这里主要是
h
(
n
)
h\left(n\right)
h(n)体现了搜索的启发信息,也就是是启发式函数。换句话说,
g
(
n
)
g\left(n\right)
g(n)代表了搜索的广度的优先趋势。但是当
h
(
n
)
>
>
g
(
n
)
h\left(n\right)>>g\left(n\right)
h(n)>>g(n)时,可以忽略
g
(
n
)
g\left(n\right)
g(n)从而提高效率。
常见的启发式搜索方法包括贪婪最佳优先搜索(Greedy Best-First Search),A搜索算法。贪婪最佳优先搜索仅使用启发式函数
h
(
n
)
h\left(n\right)
h(n)来选择下一个要扩展的结点,而不考虑从起点到当前结点的实际代价。
为了解决这个问题,一种可行的方案是考虑起始结点到当前结点的路径代价,并在评价函数中予以考虑。这样,定义一个结点n的函数
g
(
n
)
g\left(n\right)
g(n),
g
(
n
)
g\left(n\right)
g(n)是从起点到当前结点n的实际代价,
h
(
n
)
h\left(n\right)
h(n) 是从当前结点n到目标结点的估计代价。按照这个定义所得到的搜索算法被称为A算法,其评价函数可认为是从起始结点到结点n的实际最小代价与从结点n到目标结点的后续估计最小代价之和。
A*搜索算法原理介绍
(1)A*搜索算法的基本概念
A搜索算法是由著名的人工智能学者Nilsson提出的,它是目前最有影响的启发式搜索算法,也称为最佳图搜索算法。主要用于在图或网格中找到从起点到终点的最短路径。它结合了最佳优先搜索和Dijkstra算法的优点,通过评价函数
f
(
n
)
=
g
(
n
)
+
h
(
n
)
f\left(n\right)=g\left(n\right)+h\left(n\right)
f(n)=g(n)+h(n)来选择路径。
显然:
(1)如果只有
g
(
n
)
g\left(n\right)
g(n)起作用,则 A 搜索算法退化为Dijkstra 算法;
(2)如果
h
(
n
)
h\left(n\right)
h(n)远大于
g
(
n
)
g\left(n\right)
g(n),则只有
h
(
n
)
h\left(n\right)
h(n)起作用,则A* 搜索算法退化成最佳优先搜索算法,因此不一定找到最短路径。那什么条件下A搜索算法一定可以找到最佳路径呢?
如果
h
(
n
)
h\left(n\right)
h(n)小于(或等于)从结点移动到目标结点的实际代价,则A搜索算法保证能找到一条最佳路径。
(2)A*搜索算法的算法流程
接下来我们看一下A* 搜索算法的工作原理,如图5.4所示。
首先进行初始化,将起点s加入开放列表Open,并设置起点s到起点的
g
(
n
)
为
0
g\left(n\right)为0
g(n)为0,
h
(
n
)
h\left(n\right)
h(n)根据启发式函数计算。然后选择一个启发式函数
h
(
n
)
h\left(n\right)
h(n),该函数需要满足以下条件:
它应该对所有节点都是非负的;
它应该对目标节点的值为0,即
h
(
n
)
=
0
h\left(n\right)=0
h(n)=0 ;
对于所有n,
h
(
n
)
h\left(n\right)
h(n)应该小于或等于实际从n到目标的成本。
之后便开始路径搜索,即从开放列表Open中选择具有最低
f
(
n
)
f\left(n\right)
f(n)值的结点,将其作为当前结点,并将其从开放列表Open移至封闭列表Close。对于当前结点的每个相邻结点,计算从起点到当前结点的实际代价
g
(
n
)
g\left(n\right)
g(n),加上从当前结点到相邻结点的代价,得到从起点到相邻结点的总代价。如果相邻结点不在开放列表Open中,或者从起点到相邻结点的总代价小于从起点到相邻结点的已知代价,则更新相邻结点的
g
(
n
)
和
f
(
n
)
g\left(n\right)和f\left(n\right)
g(n)和f(n)值,并将其父结点设置为当前结点,然后将相邻结点加入开放列表Open。如果相邻结点已经在开放列表中Open,则比较从起点到相邻结点的已知代价和新的总代价,如果新的总代价更小,则更新相邻结点的
g
(
n
)
和
f
(
n
)
g\left(n\right)和f\left(n\right)
g(n)和f(n)值,并将其父结点设置为当前结点。
重复上述步骤,直到找到终点或开放列表Open为空。当找到终点时,算法从终点开始,沿着父节点回溯到起点,构建出一条从起点到终点的最短路径。当到达终点时,路径构建完成,算法结束。
A搜索算法之所以高效,是因为它优先考虑了具有较低估计成本的结点,这通常意味着它们离目标更近。由于启发式函数的合理选择,A搜索算法通常能够快速找到最短路径,即使是在非常大的搜索空间中。然而,如果启发式函数选择不当,可能会导致算法陷入局部最优解,而不是全局最优解。因此,选择合适的启发式函数对于A*搜索算法的性能至关重要。
(3)基于A*算法的导弹拦截路径规划
在现代战争中,导弹拦截是一个关键的防御措施。为了有效地拦截敌方导弹,需要对导弹的飞行路径进行精确预测,并规划出拦截路径。接下来我们使用A搜索算法模拟导弹拦截路径。
基于A搜索算法的导弹拦截路径规划旨在通过合理的启发式函数和算法设计,实现对导弹飞行轨迹的快速预测,并规划出最优的拦截路径。通过综合考虑导弹飞行速度、轨迹变化和环境因素,算法能够实时调整拦截路径,提高拦截成功率。
A*搜索算法搜索能力强,能有效求解最短路径问题。但是该算法对搜索空间有要求,不适合高维环境的路径规划问题。进而我们需要探索更为合适的算法来解决复杂问题。
以上文字来自原创,不得转载复制。公式解释部分参考其他博主。评论区有博主链接。