基于A*算法的最优路径搜索

启发式搜索

启发信息:利用与该问题有关的信息来简化搜索过程,称此类信息为启发信息。
启发式搜索:利用启发信息的搜索过程。
估价函数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下载

运行截图

在这里插入图片描述

在这里插入图片描述
如有建议或问题,欢迎留言!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值