A星 混合A星

通俗易懂聊A*算法 - 知乎 (zhihu.com)

伪代码:

输入:网格连通图,起点Node_start,终点Node_end
输出:联通起点和终点的路径

# 初始化
初始化Openlist为空,初始化图中所有的节点,也就是将所有属性置空。
将被障碍物占据的节点的is_in_Closedlist置为1
为初始节点完善相关属性:g = 0;利用曼哈顿距离计算h;parent_idx = null ;is_in_Openlist = 0;is_in_Closedlist = 0
将初始节点加入Openlist,并将初始节点的is_in_Openlist置为1

# 循环
while Openlist != 空 :
    从Openlist中选取一个代价f最小的节点,记为Node_current
    拓展Node_current,将其所有子节点放置在临时集合A中
    for each Node_child in 集合A :
        if (Node_child 超出地图边界)) or (Node_child的is_in_Closedlist==1):
            continue
        if Node_child的is_in_Openlist==0 :
            计算Node_child的历史代价g,预期代价h,总代价f
            将Node_child的父节点记为 parent_idx = Node_current
            将Node_child放入Openlist,并将Node_child的is_in_Openlist置为1
        else :
            计算将Node_child的父节点换成Node_current的话,总代价f_alternative
            if f_alternative < Node_child原有的f :
                将Node_child的父节点更新为 parent_idx = Node_current
                更新Node_child的历史代价g和总代价f
    将Node_current从Openlist中移除。
    将Node_current对应属性改为:is_in_Openlist = 0;is_in_Closedlist = 1
    if 集合A中包含终点Node_end :
        break

# 输出路径
构建空列表B,将Node_end放入列表B
if 列表B中最后一个节点的父节点不是空 :
    B.append(将列表B中最后一个节点的父节点)
将列表B逆序打印就是路径

混合A*算法详解 - 知乎 (zhihu.com) 

伪代码:

输入:环境布局,始末位姿
输出:联通起点和终点的路径

# 初始化
初始化Openlist为空,iter=0,ready_flag=false
为初始节点完善相关属性:g = 0;计算h;parent_idx = null ;is_in_Openlist = 0;is_in_Closedlist = 0
将初始节点加入Openlist,并将初始节点的is_in_Openlist置为1

# 循环
while Openlist != 空 and ready_flag != true:
    iter = iter + 1
    从Openlist中选取一个代价f最小的节点,记为Node_current
    if (iter - 1)可以被 N_rs 整除:
        使用Reeds-Shepp曲线生成当前节点到终点的路径
        if 生成的路径满足碰撞检测:
            ready_flag = true
            定义中止节点Node_end
            设置Node_end的父节点为当前节点
            设置Node_end的轨迹为刚生成的那段轨迹
            break
    拓展Node_current,将其所有子节点放置在临时集合A中
    for each Node_child in 集合A :
        if (Node_child 超出地图边界)) or (Node_child的is_in_Closedlist==1):
            continue
        if Node_child的is_in_Openlist==0 :
            if 碰撞检测不通过:
                设置Node_child的is_in_Closelist置为1
                continue
            计算Node_child的历史代价g,预期代价h,总代价f,轨迹
            将Node_child的父节点记为 parent_idx = Node_current
            将Node_child放入Openlist,并将Node_child的is_in_Openlist置为1
        else :
            计算将Node_child的父节点换成Node_current的话,总代价f_alternative
            if f_alternative < Node_child原有的f :
                将Node_child的父节点更新为 parent_idx = Node_current
                更新Node_child的历史代价g和总代价f
    将Node_current从Openlist中移除。
    将Node_current对应属性改为:is_in_Openlist = 0;is_in_Closedlist = 1
    if 集合A中某节点位姿与终点位姿偏差在某一较小范围内 :
        ready_flag = true
        将该节点定义为Node_end
        break

if ready_flag != true:
    return  #表示没有找到路径
    
# 输出路径
构建空列表B,将Node_end的轨迹放入列表B
设置Node_current为Node_end
while Node_current的父节点不是空 :
    将Node_current的父节点的轨迹加入集合B
    将Node_current的父节点设置为Node_current
将列表B逆序打印就是路径
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值