寻路A* g值不断变化


start:路径规划的起始点,也是机器人当前位置或初始位置A goal:路径规划的终点,也是机器人想要到达的位置B g_score:当前点到沿着start点A产生的路径到A点的移动耗费 h_score:不考虑不可通过区域,当前点到goal点B的理论移动耗费 f_score:g_score+h_score,通常也写为F=G+H 开启列表openset:寻路过程中的待检索节点列表 关闭列表closeset:不需要再次检索的节点列表 追溯表comaFrom:存储父子节点关系的列表,用于追溯生成路径。


作者:joey_zhou
链接:https://www.jianshu.com/p/8905d4927d5f
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



  1. 程序主体
  • 将起始点start加入开启列表openset
  • 重复一下工作
    • 寻找开启列表openset中F值最小的节点,设为当前点current
    • 开启列表openset中移出当前点current
    • 关闭列表openset中加入当前点current
    • 对当前点的每一个相邻点neighbor
      • 如果它不可通过或者已经在关闭列表中,略过。否则:
      • 如果它不在开启列表中,加入开启列表中
      • 如果在开启列表中,G值判定,若此路径G值比之前路径小,则此相邻点的父节点为当前点,同时更新G与F值。反之,则保持原来的节点关系与G、F值。
    • 当目标点goal在开启列表中,则结束程序,此时有路径生成,此时由goal节点开始逐级追溯上一级父节点,直到追溯到开始节点start,此时各节点即为路径。
    • 当开启列表为空,则结束程序,此时没有路径


// a* 伪代码
function A*(start, goal)
    //初始化关闭列表,已判定过的节点,进关闭列表。
    closedSet := {}
    // 初始化开始列表,待判定的节点加入开始列表。
    // 初始openset中仅包括start点。
    openSet := {start}
    // 对每一个节点都只有唯一的一个父节点,用cameFrom集合保存节点的子父关系。  
        //cameFrom(节点)得到父节点。
    cameFrom := the empty map

    // gScore估值集合
    gScore := map with default value of Infinity
    gScore[start] := 0 

    // fScore估值集合
    fScore := map with default value of Infinity
    fScore[start] := heuristic_cost_estimate(start, goal)

    while openSet is not empty
                    //取出F值最小的节点设为当前点
        current := the node in openSet having the lowest fScore[] value
                    //当前点为目标点,跳出循环返回路径
        if current = goal
            return reconstruct_path(cameFrom, current)

        openSet.Remove(current)
        closedSet.Add(current)

        for each neighbor of current

            if neighbor in closedSet
                continue        // 忽略关闭列表中的节点
            // tentative_gScore作为新路径的gScore
            tentative_gScore := gScore[current] + dist_between(current, neighbor)
            if neighbor not in openSet  
                openSet.Add(neighbor)
            else if tentative_gScore >= gScore[neighbor]
                continue        //新gScore>=原gScore,则按照原路径

            // 否则选择gScore较小的新路径,并更新G值与F值。同时更新节点的父子关系。
            cameFrom[neighbor] := current
            gScore[neighbor] := tentative_gScore
            fScore[neighbor] := gScore[neighbor] + heuristic_cost_estimate(neighbor, goal)

    return failure
    //从caomeFrom中从goal点追溯到start点,取得路径节点。
function reconstruct_path(cameFrom, current)
    total_path := [current]
    while current in cameFrom.Keys:
        current := cameFrom[current]
        total_path.append(current)
    return total_path

作者:joey_zhou
链接:https://www.jianshu.com/p/8905d4927d5f
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值