【综合算法】A*算法

A*算法

A*算法;A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是许多其他问题的常用启发式算法。注意是最有效的直接搜索算法。之后涌现了很多预处理算法(ALT,CH,HL等等),在线查询效率是A*算法的数千甚至上万倍。

  在游戏、优化领域,A*算法是很重要的一个算法。例如RTS游戏中控制移动单位到另外一个地点,玩家只需要在指定地点下达指令,移动单位可以自动搜索最好的路径抵达目的地。
  在路径搜索方面,A*算法的目标是找到当前已知约束条件下的最优路径。由于A*算法是直接搜索方法,没有全局优化,并且我们并不知道实际情况有多复杂,所以A*算法最后不一定能得出全局最短路径,而是得到当前已知约束条件下的最优路径,甚至可以根据实际情况,在路径搜索速度和路径搜索质量上取得平衡。
  A*算法可以看做迪杰斯特拉最短路径算法和最优贪心算法的综合。相比传统的迪杰斯特拉算法,A*算法在每个路径节点的权值计算有所不同。A*算法的权值计算表示为: f(n)=g(n)+h(n) ,其中 f(n) 是最终的权值, g(n) 是初始点到当前点的代价,类比于迪杰斯特拉算法的节点权值,在游戏中山地区域的权值就比较大,平原区域权值比较小,那么移动单位会倾向于走平原地区; h(n) 则是当前节点到目标节点的估计距离。路径搜索速度和路径搜索质量主要是通过 h(n) 来控制。如果 h(n) 能非常好的反映当前节点到目标节点的距离度量,那么A*算法得到的搜索路径就等于或逼近于全局最短路径;如果 h(n) 精准地反映当前节点到目标节点的距离度量,那么实际上我们已经知道当前节点到目标节点的最短路径,也就没A*算法什么事了;如果 h(n) 接近或者等于0,那么A*算法退化为普通的迪杰斯特拉算法;如果 h(n) 权重远比 h(n) 大,那么A*算法退化为普通的路径搜索算法。
   h(n) 的计算方法有很多种。设当前点为 (in,jn) ,目标点为 (id,jd) 。比较简单的距离度量有曼哈顿距离,即 h(n)=α[abs(inid)+abs(jnjd)] ,其中 α 控制 h(n) 的作用权重;计算量稍大的有欧式距离,即 h(n)=α(inid)2+(jnjd)2 ;也可以根据实际情况考量,设置自定义的距离度量。
  一般情况下,设上一级搜索的节点为n,其权值为 f(n)=g(n)+h(n) ,下一级搜索到的节点为n+1,则权值为 f(n+1)=g(n)+Δg(n)+h(n+1) 。这里 Δg(n) 指代在迪杰斯特拉算法情况下权值的增量,这说明搜索过程中 g(n) 是累加的,具有记忆效应;而h(n)则需要随时更新,是瞬时的。
  另外,格子的走法也需要设置。普通的方格路径,我们需要考量是否可以斜着行进,既可以设置当前点的斜向邻点是否可以移动,也可以只是设置斜向邻点具有稍微大点的权值;在《文明》系列游戏中,单位方格则是六边形方格,角色可以选择移动到周围六个方格。
  A*算法的伪代码非常简单,百度百科摘录如下:

创建两个表,OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。计算算起点的h(s);将起点放入OPEN表;
while(OPEN!=NULL)
{
 从OPEN表中取f(n)最小的节点n;
  if(n节点==目标节点)
   break;
{
  计算f(X);
   if(X in OPEN)
{
   if(新的f(X)小于OPEN中的f(X)){
   把n设置为X的父亲;
  更新OPEN表中的f(n);
}
if(X in CLOSE)
continue;
if(X为全新节点)
{
把n设置为X的父亲;
求f(X);
并将X插入OPEN表中;//还没有排序
}
}//endfor
将n节点插入CLOSE表中;
按照f(n)将OPEN表中的节点排序;//实际上是比较OPEN表内节点f的大小,从最小路径的节点向下进行。
}//endwhile(OPEN!=NULL)

  做完计算之后,如果遇到目标点,那么从目标点开始沿着父节点向上回溯到起始节点,然后对搜索路径执行反向操作,就得到了起始点到目标点的路径。
  读懂上述代码就知道A*算法的实现方法,可以说逻辑上比较简单。存在的问题主要在如何给出 h(n) ,如何用数据结构表示,如何同时提升搜索质量和搜索速度。这些就靠编程功力了。
  下面给出一部分使用曼哈顿度量计算的结果图和说明,图中包含一个白色C型障碍物,左边的小白点是起始点,右边的小白点是目标点,灰色区域表示搜索范围:
  0.0wet
  曼哈顿距离权值 α=0 ,算法退化为迪杰斯特拉算法,搜索范围是以起始点为中心的方框。该搜索能获取全局最短路径,但是搜索速度非常慢,因此我终止了搜索。
  0.8wet
  曼哈顿距离权值 α=0.8 算法搜索范围极大的缩小了。
  1wet
  曼哈顿距离权值 α=1.0 搜索范围变大,但是穿过障碍物之后行走一条最短路径。
  1.5wet
  曼哈顿距离权值 α=1.5 算法搜索范围更大。路径有些斜扭,但仍然是当前最优路径。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值