路径规划——搜索算法详解(六):LPA*算法详解与Matlab代码

上文讲解了D*算法,D*算法为在动态环境下进行路径规划的场景提出了可行的解决方案,本文将继续介绍另外一种动态规划路径的方法——Lifelong Planning A*(LPA*)算法。

该算法可以看作是A*的增量版本,是一种在固定起始点与目标点、动态环境下实时搜索路径的算法。笔者看了很多篇讲解、原文后发现许多文章描述得云里雾里,本文可以看作是笔者对于古月学院LPA*算法的学习笔记,希望本文的算法讲解与MATLAB仿真能够给大家带来理解上的帮助!

一、LPA*算法流程讲解:

1. 基本概念:

  • 符号表示:
    • g(s):之间记录的起点距离代价的最小值;
    • rhs(s):基于父节点g所预测的最小值,设s'为s的父节点,此时有rhs(s)=g(s')+d(ss'),d(ss')表示s与父节点s‘的连接代价
    • 对于每一个节点,其记录着一个代价很熟k(n),其决定了S中的弹出顺序,类比于A*算法中的Openlist弹出的规则,其包含两个值,根据k1优先排序,当k1相同时根据k2排序,其计算方式如下:                                      

    • S:地形图中路径点集合
    • U:优先队列,每次弹出k值最小的节点s;
  • 与D*算法中采用h(X)、k(X)表示每个节点实时更新的代价、最小更新代价类似,LPA*算法采用rhs(s)、g(s)两个值表示每一个搜索点的本次计算中起始点到当前节点的代价值、目前所有次计算中从起始点到当前节点的最小代价值,注意D*是从终点开始搜索的,而LPA*算法是从起点开始搜索,所以衡量指标rhs(s)、g(s)均表示到起点的距离,这要注意不要跟D*混淆。根据rhs(s)、g(s)的大小关系定义节点的状态:
    • rhs(s)=g(s):局部一致状态,表示当前节点并未造成影响,类比于D*算法中的Lower态;
    • rhs(s)<g(s):局部过一致状态,即当前代价小于记录的历史代价,表明当前节点可以寻找到更加适合的父节点以减小到起点的代价值,更新代价:g(s)=rhs(s);此时该节点的后续子节点必定受到影响,此时需要遍历后续子节点,对于每一个后续子节点更新其rhs,检查其子节点是否能恢复到历时最小代价g,当不可恢复时将其插入搜索队列,使节点恢复到局部一致;
    • rhs(s)>g(s):局部欠一致状态,即当前代价大于记录的历史代价,此时表示该节点受到障碍物影响,遍历后续节点更新代价。一般由于父节点突变情况所致,需要将此节点g设置为∞,将其状态改为局部过一致,对于局部过一至的点在下一次循环中更新其g(s)达到局部一致状态。

2. 算法流程解释:

参考论文中的伪代码与符号解释,如下所示:

直接看代码流程会很混乱,待会会有案例讲解,有以下绩点关键需要注意,老规矩留个印象就好,看完例子再回来会有收获的:

1. 搜索过程不断重复事情是:搜索节点达到局部一致;

2. 搜索完成的指标如下(两者之一)如果目标的代价为无穷大,那么从开始到目标没有有限的代价路径。否则,最短路径可以通过向后移动来确定。

        (1)搜索队列U中最小k值大于目标点k值;

        (2)目标节点达到局部一致且不为inf;

3. 当节点s发生变化时,需要检查其所有子节点,更新子节点的rhs值,将局部一致的节点从搜索列表中删除,将受影响导致局部不一致的节点加入到搜索队列U中,并及时更新局部不一致节点的k值,不断循环该过程直到达到2中的搜索指标。

4. 增量式搜索是基于初次完成A*搜索的结果上进行的,需要进行初次搜索。

5. 上述流程中的函数含义如下:

3. 案例讲解(案例出于古月学院):

(1).初始化:

在增量式搜索开始前,求出路径点集合S中每一个自由栅格的起点的实际最小代价g*、终点启发函数h,笔者感觉此处启发函数用的是切比雪夫距离:

(2).起点搜索处理

首先将所有节点的距离起点代价rhs、记录最小的起点代价g初始化为inf,由于起点本身距离为0,所以此时rhs(A3)=0,g(A3)=∞,此时rhs(A3)!= g(A3),局部不一致,此刻将其插入到优先级队列U中。如上图所示,每一个节点处包含k=[k1,k2],后续将根据此从U中弹出元素。

(3).拓展节点(循环1):

此时弹出A3点, 此时到流程中的步骤2(代码09-16),rhs(A3)=0,g(A3)=∞,此时rhs(A3)<g(A3),令g(A3)=rhs(A3)=0(代码12),此时A3点局部一致,g(A3)=rhs(A3)=0,故确定为代价0。

同时遍历A3在第一次搜索时候的子节点(看(1)中相连接且以A3作为父节点的A2、B3),此时将A2、B3分别带入UpdateVertex函数(代码06-08)中此时根据节点A3更新rhs(A2)=g(A3)+d(A2、A3之间的距离) = 0+1=1、rhs(B3)=g(A3)+d(A3、B3之间的距离) = 0+1=1,此时由于初始化时候g(A2)=g(B3)=inf>1,此时A2、B3局部过一致,将其加入到队列U中,此时U中元素为U={A2(6,1),B3(5,1)}。

(4).弹出节点(循环2):

跟上述流程相同,弹出k最小的节点,此时U中最小的为B3,首先令其g(B3)=rhs(B3)=1,达到局部一致,此时记为1,将流程(1)中对应的子节点(C3)带入代码(代码06-08)中,步骤与上次循环一样,应该很好理解。

(5).不断循环直到结束:

不断循环计算,更新节点状态,直到满足跳出循环的条件,按照序号排序即可得到一条最佳轨迹。

(6).节点状态改变处理步骤:

如上图所示,当D1节点突变为障碍物时,此时rhs(D1)=inf,此时节点D1变为欠一致状态,此时检查其所有与之相连接的节点(代码21-23行),此时如上图#1-#4所示,其子节点(子节点定义为在路径中排列在该节点后的所有路径节点E1、F0,而F1父节点为E1,也会受到影响)由于其状态变化也变为了欠一致状态(代码14-16行),此时rhs(E1、F0、E1)= inf,故此时的图变为了#4的状态,灰色的为上次搜索得到结果后在U序列中的节点。此时U={A0(8,3)、E3(7,4)}。此时弹出E3,循环执行代码步骤2,根据上述流程即可得到一条新的路径

大家看完案例讲解后再看一遍上述的1、2部分,相信会有新的收获!

二、LPA*算法代码:

这是笔者按照课程打出来的代码,已经上传到了本人Github,需要的自取:
Adamaser/Path-Planning (github.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/786723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea开发 java web 酒店推荐系统bootstrap框架开发协同过滤算法web结构java编程计算机网页

一、源码特点 java 酒店推荐推荐系统是一套完善的完整信息系统&#xff0c;结合java web开发和bootstrap UI框架完成本系统 采用协同过滤算法进行推荐 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式…

萨科微slkor(www.slkoric.com)半导体

萨科微slkor&#xff08;www.slkoric.com&#xff09;半导体技术总监&#xff0c;清华大学李老师介绍说&#xff0c;IGBT器件与MOSFET在技术上的主要区别在于&#xff0c;在IGBT芯片背面引入了一个P掺杂的集电极。从MOSFET拓展至IGBT主要存在IGBT器件设计和IGBT器件加工工艺两方…

Layui三级联动插件使用方法

Layui高版本中没有在提供三级联动这个动画了&#xff0c;而是封装成了一个插件&#xff0c;使用方式也很简单 官网 省市县区三级联动下拉选择器 layarea - Layui 第三方扩展组件平台 (layuion.com)https://dev.layuion.com/extend/layarea/#doc html页面约束 整个选择器需要…

如何在 Oracle 中使用 CREATE SEQUENCE 语句

在本文中&#xff0c;我们将讨论 Oracle CREATE SEQUENCE 语句&#xff0c;其主要目的是提供一种可靠的方法来生成唯一且连续的数值&#xff0c;通常用于数据库表中的主键字段。此功能对于维护数据完整性和效率、确保不同记录之间的标识符有序分配尤其重要。从本质上讲&#xf…

日记本(源码+文档)

日记本&#xff08;小程序、ios、安卓都可部署&#xff09; 文件包含内容程序简要说明功能项目截图客户端首页日记列表 书写日记个人中心设置密码锁拨打客服热线修改信息退出登录登录页输入密码锁注册页 后端管理登录页首页管理员列表管理用户管理日记列表管理日记数据 文件包含…

【stm32】USART编码部分--详细步骤

USART编码部分(文章最后附上源码) 如果看不懂步骤可以根据源码参考此篇文章就能轻而易举学会USART通信啦&#xff01; 编码步骤 第一步 开启时钟 把需要用到的USART和GPIO的时钟打开 第二部 GPIO初始化 把TX配置成复用输出&#xff0c;RX配置成输入(上拉输入、浮空输入)。…

C++ 注册Nacos

下载源码&#xff1a; git clone GitHub - nacos-group/nacos-sdk-cpp: C client for Nacos 编译源码 cd nacos-sdk-cpp cmake . make 生成库文件 在nacos-sdk-cpp 下 注册nacos 将include 和libnacos-cli.so libnacos-cli-static.a 放入你的工程 如果Nacos服务地址:…

ExpressionUtil的应用

ExpressionUtil是什么 ExpressionUtil是一个工具类&#xff0c;用于处理表达式相关的操作。它提供了一些方法&#xff0c;方便用户在程序中处理表达式相关的计算、比较、转换等操作。例如&#xff0c;可以使用ExpressionUtil计算一个数学表达式的结果&#xff0c;比较两个表达式…

代码随想录笔记|C++数据结构与算法学习笔记-栈和队列(〇)|stack、queue、单调队列和优先级队列(priority_queue)、大顶堆和小顶堆

文章目录 stack容器stack 基本概念常用接口构造函数赋值操作数据存取大小操作 queue容器queue常用接口构造函数赋值操作数据存取大小操作 栈和队列的灵魂四问C中stack,queue是容器吗我们使用的stack,queue属于哪个版本的STL我们使用的STL中stack,queue是如何实现的&#xff1f;…

SAP CAP篇十六:写个ERP的会计系统吧,Part III

本文目录 本系列文章目标开发步骤数据库表设计Service 定义生成Fiori App更新CDS Annotation更新Entity: Companies更新Entity&#xff1a;Accounts App运行 本系列文章 SAP CAP篇一: 快速创建一个Service&#xff0c;基于Java的实现 SAP CAP篇二&#xff1a;为Service加上数据…

volatile关键字的作用

volatile 关键字告诉编译器 i 是随时可能发生变化的&#xff0c;每次使用它的时候必须从内存中取出 i 的值&#xff0c;因而编译器生成的汇编代码会重新从 i 的地址处读取数据放在 k 中。 所以说使用 volatile 声明的变量的值的时候&#xff0c;系统总是重新从它所在的内存读…

NLP学习路线总结:从入门到精通

自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是人工智能领域的重要分支&#xff0c;它致力于使计算机能够理解、解释和生成人类语言。NLP技术的应用范围广泛&#xff0c;涵盖了机器翻译、情感分析、语义理解、信息抽取等诸多领域。对于想要…

每日一题---存在重复元素(1)和(2)

文章目录 一、存在重复数组1,1.题目展示1.2.解题思路1.3.参考代码 二、存在重复元素||2.1.题目展示2.2.解题思路2.3.参考代码 大家学习完了数组&#xff0c;指针等内容可以进行刷题了&#xff0c;刷题不仅可以增加大家的代码量&#xff0c;也可以积累自己的经验&#xff0c;言归…

C语言之指针的指向地址和指针的内容总结(八十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

量化交易入门(三十九)怎么获取A股历史数据

前面我们都是以美股的苹果股票为例进行策略和技术指标的回测&#xff0c;量化交易对中国A股是否适用呢&#xff1f;我们怎么样免费获取A股的股票数据呢&#xff1f;我给你们介绍三个免费的数据平台Tushare 、AkShare和Baostock。 1、Tushare Tushare是一个免费、开源的Pytho…

HashMap 和 Hashtable 有什么区别?

HashMap和Hashtable在Java中都是用于存储键值对的集合&#xff0c;但它们之间存在几个重要的区别。 线程安全性&#xff1a; Hashtable是线程安全的。这意味着多个线程可以同时操作Hashtable&#xff0c;而不会出现数据不一致的情况。但是&#xff0c;这种线程安全性的代价是降…

基于决策树算法的糖尿病遗传风险预测研究

基于决策树算法的糖尿病遗传风险预测研究 一、引言 糖尿病是一种常见的慢性疾病&#xff0c;全球范围内患病率持续上升。遗传因素在糖尿病的发病中起着重要作用&#xff0c;因此&#xff0c;预测糖尿病的遗传风险对于早期预防、诊断和治疗具有重要意义。本研究旨在利用决策树…

2023年第十四届蓝桥杯 - 省赛 - Python研究生组 - A.工作时长

题目 数据文件&#xff1a;https://labfile.oss.aliyuncs.com/courses/21074/records.txt Idea 直接通过 datetime 模块加载时间字符串进行格式化&#xff0c;然后对时间列表进行排序&#xff0c;最后两两计算时间差。 Code Python from datetime import datetimetime_lis…

深入浅出Prim算法和Kruskal算法求最小生成树算法

深入浅出Prim算法和Kruskal算法求最小生成树&#xff1a; Prim算法 ​ 首先初始化距离 正无穷。 ​ n 次迭代(因为要选中n个点)&#xff0c;找到不在集合(当前生成树)中的且距离当前块最小的点(记作)m点&#xff0c;&#xff0c;用m点去更新其他掉到集合中的点的距离&#x…

目标检测——服饰属性标签识别数据集

一、重要性及意义 首先&#xff0c;随着电商、时尚推荐等业务的发展&#xff0c;服饰属性标签识别已经成为一项关键的计算机视觉任务。这些标签&#xff0c;如颜色、款式、材质等&#xff0c;对于实现图像搜索、时尚推荐等业务需求至关重要。服饰属性标签识别数据集为此类任务…