启发式搜索
启发信息:利用与该问题有关的信息来简化搜索过程,称此类信息为启发信息。
启发式搜索:利用启发信息的搜索过程。
估价函数f(n):从初始结点经过n结点到达目的 结点的路径的最小代价估计值,其一般形式是f(n)=g(n)+h(n)。g(n)是从初始结点到n结点的实际代价,而h(n)是从n结点到目的结点的最佳路径的代价。估价函数的任务就是估计待搜索结点的“有希望”程度,并依次给它们排定次序。
启发式图搜索法的基本特点:如何寻找并设计一个与问题有关的h(n)及构造出f(n)=g(n)+h(n),然后以f(n)的大小来排列待扩展状态的次序,每次选择f(n)值最小者进行扩展。
- open表:保留所有已生成而未扩展的状态。
- closed表:记录已扩展过的状态。
- 进入open表的状态是根据其估值的大小插入到表中合适的位置,每次从表中优先取出启发估价函数值最小的状态加以扩展。
A搜索算法
伪代码:
procedure heuristic_search
open:=[start];closed:=[ ];f(s):=g(s)+h(s); *初始化
while open≠[ ] do
begin
从open表中删除第一个状态,称之为n;
if n=目的状态 then return(success);
生成n的所有子状态;
if n没有任何子状态 then continue;
for n的每个子状态do
case子状态 is not already on open表 or closed表;
begin
计算该子状态的估价函数值;
将该子状态加到open表中;
end;
case子状态 is already on open表:
if 该子状态是沿着一条比在open表已有的更短路径而到达
then 记录更短路径走向及其估价函数值;
case子状态 is already on closed表:
if 该子状态是沿着一条比在closed表已有的更短路径而到达
then
begin
将该子状态从closed表移到open表中;
记录更短路径走向及其估价函数值;
end;
case end;
将n放入closed表中;
根据估价函数值,从小到大重新排列open表;
end; *open表中结点已耗尽
return(failure);
end.
A*算法:定义h*(n)为状态n到目的状态的最优路径的代价,则当A搜索算法的启发函数h(n)小于等于h*(n)时,则被称为A*算法。
如果某一问题有解,那么利用A*搜索算法对该问题进行搜索则一定能搜索到解,并且一定能搜索到最优的解而结束。
基于A*算法的最优路径搜索
问题定义:
如下图所示,搜索起点为A,目标点为B的最优路径。注意图中实心方格区域为墙,不可穿越。移动方向仅允许垂直和水平方向移动,每移动一步代价均相同,可设置为1。
程序实现
源码地址(包含程序说明和类图):
Github下载
CSDN下载
运行截图
如有建议或问题,欢迎留言!