A*算法是一种寻路算法,常常被用在游戏智能ai的自动寻路过程等等,它较之于图论的最短路算法而言,更加适用于节点巨大的情况下,但是该算法是一种启发式搜索算法,并不能保证总是找到最优路径。
A*的算法思想如下:
定义两个函数:f和g,其中f揭示当前点到出发点的距离,g揭示当前点到终点的距离。
对于每个将要遍历的点,h=f+g是其启发函数,每次选择待选择节点中启发函数值最大的节点放入路径之中,重复此步骤。
算法具体步骤如下:
- 将方块添加到open列表中,该列表有最小的和值。且将这个方块称为S吧。
- 将S从open列表移除,然后添加S到closed列表中。
- 对于与S相邻的每一块可通行的方块T:
-
- 如果T在closed列表中:不管它。
- 如果T不在open列表中:添加它然后计算出它的和值。
- 如果T已经在open列表中:当我们使用当前生成的路径到达那里时,检查F G和值是否更小。如果是,更新它的和值和它的前继。
因为matlab的画图功能比较强大,所以下面使用matlab实现最基本的A*算法:
function[open,close]=Astar(map)
[row,col]=size(map);
close=struct('row',-1,'col',-1,'g',0,'h',0);%????????????????????????
closelen=1;
open=struct('row',-1,'col',-1,'g',-1,'h',-1);%????????????????????????
openlen=0;
bindex=1;
fork=1:row
forj=1:col
ifmap(k,j)==1
barrierrow(bindex)=-k;
barriercol(bindex)=j;
bindex=bindex+1;
end
end
end<