美文网首页
A星(A*,AStar)寻路

A星(A*,AStar)寻路

作者: logoss | 来源:发表于2019-03-11 00:12 被阅读0次

    概念

    • node:节点,格子
    • cost:代价
    • F:预计的总路径的代价
    • G:从起点到点前节点的代价
    • H:从当前节点到终点的估计代价
    • heuristic:估价函数,估算的到H
    • open list:待考察表
    • closed list:已考察表
    • parent node:父节点,node需要有父节点属性,表示从那个节点走到这个节点

    寻路逻辑

    1.添加起始节点到待考察表(open list)
    2.主循环

    a.如果openlist里有节点,找到open list 里拿出最小代价节点,设为当前节点。如果openlist里没有节点了,查找失败。
    b.如果当前节点为终点,已经找到路径,跳到第4步
    c.考察每个相邻节点(一般可以斜着走时有8个,不斜着走时4个,当然也可以自己定义):

    (1)如果不能通过,或者已经在已考察表,跳过,继续下一节点
    (2)计算它的代价。
    (2.5)如果这个节点在openlist里。如果现在的g比较小,重置当前节点为它的父节点,更新这个节点的g,然后跳过下面。如果现在的g没有比较小,直接跳过下面,继续下个节点。
    (3)把当前节点定义为这个节点的父节点添加到待考察表
    (4)添加当前节点到已考察表

    3.更新待考察表,重复第二步。
    4.你已经到达终点,创建路径列表并添加终点节点
    5.添加终点节点的父节点到路径列表
    6.重复添加父节点直到起始节点。路径列表就由一组节点构成了最佳路径

    常用估价函数

    寻路性能优化

    在节点上加一个状态变量,状态有normal,open,close 三种。
    这样在判断节点是不是在openlist 或者closelist里时不用每次从列表中搜索,可以减少很多时间。

    路径优化 佛洛依德路径平滑算法(floyd)

    常见的a*算法的结果是一串用来表示所经过的路径点坐标。但是这样的路径通常是有“锯齿”的,并不符合现实中的智能表现。
    因此,需要进一步的进行平滑处理,比如 佛洛依德算法~
      算法原理很简单,分为两步:
      1.去掉相邻的共线的点
      2.去掉多余的拐弯的点
      第一步实现起来很简单,只需要遍历一下,计算两个向量的方向是否相同。
      第二步的实现稍微麻烦一点,遍历所有的点,去掉两个可以直接通过的点之间的点。
      其实是很经典的画直线算法,找两个点作为端点画一条线,这条先经过的网格如果都是可同行的,那么我们就认为在路径中这两个点中间的那些点是多余的。
    其实第二步就可以完成优化,但是计算量比较大。所以先通过第一步来减少一部分计算量。

    相关文章

      网友评论

          本文标题:A星(A*,AStar)寻路

          本文链接:https://www.haomeiwen.com/subject/qlpmpqtx.html