A*算法(学习记录)

定义

一种在静态路网中求解最短路径最有效的直接搜索算法。


计算公式

F=G+H(f*(n)=g*(n)+h*(n))

G:代表从起点A移动到指定方格的移动代价(路径长短)

H:代表从指定方格移动到终点B的移动代价(路径长短)


G点的计算

PS:需要使用到开放列表中父节点的应用

  • 假设角色横向与纵向的移动代价是10,对角线的移动代价是14(平方根),。计算G值的方法就是找到父节点的G值,再根据横纵向,还是对角线为G值加上10或14。

H值的估算(Manhattan 方法:试探法)

PS:方法有很多不同的,可上网查找。

  • 计算从当前方格横向或纵向移动到达目标所经过的方格数,忽略对角移动,然后把总数乘以 10。

openlist(开放列表)与closelist(封闭列表)

  • openlist:记录所有被考虑来寻找最短路径的网格集合(经过路径的所有相邻节点逐渐加入该列表)
  • closelist:一个记录下不会被考虑的网格集合(已经被选中的路径点加入该列表)

寻路步骤:

  • 简化搜索区域,将搜索区域简化成2维数组,数组中每一项代表一个格子。状态分成可走与不可走。
  • 从起点A开始,将其加入方格组成的openlist(开放列表)中,列表中的格子是路径可能会沿途经过的(有可能经过的方块格)。
  • 简化搜索区域,将搜索区域简化成2维数组,数组中每一项代表一个格子。状态分成可走与不可走。

  • 从起点A开始,将其加入方格组成的openlist(开放列表)中,列表中的格子是路径可能会沿途经过的(有可能经过的方块格)。查找与A相邻的方格(忽略障碍物所在的格子),将所有可达的方格加入到openlist列表当中,并且将起点A设置成这些可达方格的父节点。

  • 将方格A从openlist列表中移除,加入到closelist(封闭列表)当中。

  • 根据公式计算,取出openlist表中F值最小的方格数据,放入closelist中。

  • 检索该方格相邻的所有方格,忽略不可达以及在closelist中的方格,openlist中,并为加入的方格设置父节点。重复以上操作。

  • 如果发现相邻的方格已经存在了openlist当中,就检查这条路径是否更优(是否具有更小的G值),没有则不作操作。如果 G 值更小,则把那个方格的父亲设为当前方格 ( 我们选中的方格 ),然后重新计算那个方格的 F 值和 G 值


算法性能的提高

  • 可以再openlist表中保存好路径元素,并且对表中元素进行排序,这样每次取值只要取第一个方格的数据就行

  • 使用二叉堆(快2~3倍):Using Binary Heaps in A* Pathfinding

  • 系列点子

    • 使用小地图或者更少的寻路者
    • 千万不要同时给多个寻路者寻路。取而代之的是把它们放入队列中,分散到几个游戏周期中。
    • 考虑在地图中使用更大的方格。这减少了寻路时需要搜索的方格数量。或长路径使用大方块,接近目标使用小方块。资料:Two-Tiered A* Pathfinding
    • 对于很长的路径,考虑使用路径点系统,或者可以预先计算路径并加入游戏中。
    • 预先处理你的地图,指出哪些区域是不可到达的。这些区域称为“孤岛”。A* 的下限是,你告诉他搜寻通往哪些区域的路径时,他会搜索整个地图,直到所有可以抵达的方格都通过 open list 或 close list 得到了处理。
    • 不同的地形损耗,地形不是只有 2 种:可抵达的和不可抵达,不同的地形移动代价可以不同,沼泽,山丘,地牢的楼梯等等
    • influence Mapping:创建一个额外的计分系统,把它应用到寻路的 AI 中。地图上有个通道穿过山丘,有大批的寻路者要通过这个通道,电脑每次产生一个通过那个方格的路径都会变得很拥挤。如果需要,你可以产生一个 influence map,用来标记提高那些方格的移动代价,让电脑避开那个区域移动
    • 采用布兰森汉姆算法预先判断两点是否可以直接通行,可通行就直接返回两点的直线路径,不可直接通行再采用A星算法寻路
    • A*算法走的是最小代价路径,但不一定是最平滑的路径。可以增加一个额外开销,作为允许G值的一定波动范围,然后查找相邻格子中最平滑的地方。

    github简单实例链接(没做优化版):https://github.com/The-Black-Sun/Static_pathfinding_algorithm_A_Star

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值