A*算法

A*算法是一种启发式搜索方法,通过估价函数F=G+H来指导搜索,提高效率。它维护open和close表,不断寻找最优节点直至目标。F值是最小堆中的排序依据,算法适用于游戏寻路、图的寻路等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A*算法学习

2013-6-20


(1)是一种启发式搜索,其中很重要的影响因素是估价函数。

启发式搜索——不是简单的DFS和BFS,启发式搜索会根据当前的状态空间,对每一个搜索的位置进行评估,选择最优的节点直到达到目的节点。 这样提高了效率。

估价函数——启发式的,在迷宫和地图问题中,常用曼哈顿算法(距离=|x轴的差值|+|y轴的差值|)



(2)算法思路

关键因素—— F = G + H

整个算法中维护两个列表:open表 和  close表(用于存放节点)

算法过程:


把起点放到open表中,设为当前节点A。

1.寻找该点周围可达的点,也放入open表(此时记录每个点的父节点为A,同时把A节点移动到close表中)。

       * 若周围可达的点叫B已经在open表中,看看以A作为B的父节点是否减小了B的F值,如果是的话则进行B节点上值的更新。

2.计算这些节点的F值。G表示从起始节点到该节点的距离值。H表示从该节点到终点的距离值(这个值的计算就需要使用到估算函数,目前有很多各种各样的估算函数,算法最开间的就是选择的估算函数的优劣)

 按照f值的大小从小到大,所以表可以用数据结构中的最小堆来进行维护

3.把f值最小的节点放到close表中。把该节点当做当前节点A开始重复1~3步骤。


直到把终点放到open节点中。(更优的方法是直到open节点为空,避免了快到终点时的距离特别大这种情况造成的非最优解)


最优路径: 从终点开始逆推该节点的父节点,直到起始点,这些节点组成的就是最优路径。


(3)应用

游戏里的寻路啦,图里的寻路啦



参考文章:

http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx (更易懂些)

http://blog.youkuaiyun.com/v_JULY_v/article/details/6093380





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值