浅谈A星算法

         A*(读作A星)算法对初学者来说是比较深奥难懂,本篇文章是简单阐述它的基本原理。

 初步:搜索区域

我们假设某个人要从 A 点到达 B 点,而一堵墙把这两个点隔开了,如下图所示,绿色
部分代表起点 A ,红色部分代表终点 B ,蓝色方块部分代表之间的墙。
- t; D7 b2 f: m" e" v) j3 W
; O; _7 E' T* S S% p

 

~1 o, \1 O' X5 U
[ 图一 ]
你首先会注意到我们把这一块搜索区域分成了一个一个的方格,如此这般,使搜索
区域简单化,正是寻找路径的第一步。这种方法将我们的搜索区域简化成了一个普
通的二维数组。数组中的每一个元素表示对应的一个方格,该方格的状态被标记为
可通过的和不可通过的。通过找出从 A 点到 B 点所经过的方格,就能得到 AB 之间的
路径。当路径找出来以后,这个人就可以从一个格子中央移动到另一个格子中央,
直到抵达目的地。
这些格子的中点叫做节点。当你在其他地方看到有关寻找路径的东西时,你会经常 发现人们在讨论节点。为什么不直接把它们称作方格呢?因为你不一定要把你的搜
索区域分隔成方块,矩形、六边形或者其他任何形状都可以。况且节点还有可能位
于这些形状内的任何一处呢?在中间、靠着边,或者什么的。我们就用这种设定,
因为毕竟这是最简单的情况。
开始搜索
/ v* a# F* a4 M, g( K
. N7 I L4 k- b% _
当我们把搜索区域简化成一些很容易操作的节点后,下一步就要构造一个搜索来寻
找最短路径。在 A* 算法中,我们从 A 点开始,依次检查它的相邻节点,然后照此继
续并向外扩展直到找到目的地。
我们通过以下方法来开始搜索:
, J/ P7 y x$ t3 h& G
1.
3 q2 K% [! h, o) X! j' O \# Y1 @9 d
A 点开始,将 A 点加入一个专门存放待检验的方格的 开放列表 中。这个开放列表
有点像一张购物清单。当前这个列表中只有一个元素,但一会儿将会有更多。列表
中包含的方格可能会是你要途经的方格,也可能不是。总之,这是一个包含待检验
方格的列表。
1 c0 X3 G. N2 @( x' y5 a7 z
2.
% e0 R( ^: h4 V2 L% E. r, ~' C8 B
检查起点 A 相邻的所有可达的或者可通过的方格,不用管墙啊,水啊,或者其他什
么无效地形,把它们也都加到开放列表中。对于每一个相邻方格,将点 A 保存为它
们的 父方格 。当我们要回溯路径的时候,父方格是一个很重要的元素。稍后我们
将详细解释它。
3.
% ~5 h8 I" I1 z1 `8 X7 u5 I W
从开放列表中去掉方格 A ,并把 A 加入到一个 封闭列表 中。封闭列表存放的是你现
在不用再去考虑的方格。
! A9 r- Y# p6 L7 K9 h" V0 m
此时你将得到如下图所示的样子。在这张图中,中间深绿色的方格是你的起始方格,
所有相邻方格目前都在开放列表中,并且以亮绿色描边。每个相邻方格有一个灰色
的指针指向它们的父方格,即起始方格。
/ v8 n! ^: D3 
"

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值