LPA-star算法(Lifelong Planning)及相关思考

news2024/12/26 21:20:14

   一、LPA-star算法(Lifelong Planning)简介

   LPA * ( Lifelong Planning 终身规划 A * )是一种基于A * 的增量启发式搜索算法,被用来处理动态环境下从给定起始点到给定目标点的最短路径问题,即起始点和目标点是固定的。

在这里插入图片描述

   (注:启发式搜索是利用启发函数来对搜索进行指导,从而实现高效的“智能”搜索,例如A_star算法、遗传算法等。增量搜索是对以前的搜索结果信息进行再利用来实现高效搜索,大大减少搜索范围和时间,例如LPA * 、D * 、D* Lite算法等。)


   二、节点的代价与状态

   与D * 用 h(X)和 k(X)描述节点代价类似,为了应对动态环境,LPA * 用g(s)和rhs(s)两个值描述节点的代价。g(s)是目前所有次计算中,从起始点到当前节点的最小代价值(符号命名与A * 算法的g(n)类似,与D * 算法中的 k(X)发挥的作用类似) ; rhs(s)是本次计算中,从起始点到当前节点的代价值(与D * 算法中的 h(X)发挥的作用类似)。

   根据 g(s) 和 rhs(s) 的大小,定义节点状态。

   1)若g(s)=rhs(s),局部一致( Locally Consistent )状态,类似D*算法的Lower态;

   2)若g(s)>rhs(s),局部过一致( Locally Overconsistent )状态,表明现在节点s有更理想的父节点使自己到起点的代价值更小,那么此时将设置g(s)=rhs(s),节点便恢复为局部一致状态﹔

   3)若g(s)<rhs(s),局部欠一致(Locally Underconsistent)状态, 这种情况通常出现在父辈的某一节点突然变为障碍的情况下,造成父辈节点到起点的路径变大,从而需要修改g(s)的值,如果节点处于这种状态,则当它由优先队列中取出时,将其g值设置为无穷大,即将该节点状态变为局部过连续,而局部过连续的点将会被再次添加到优先队列中,这样就可以在它下次被取出时将其作为局部过连续状态处理,如果需要的话,最终达到局部连续状态。

   当一个节点n在局部变得不一致时,它将被放在一个优先队列U(类似A * 算法或 D * 算法中的openList )中进行重新评估。U队列按照节点n的k值(先k1后k2)进行排序,k值定义如下:

   上式中的k1类似于A * 算法中的f(n),k2类似于A * 算法中的个g(n),即在选取拓展点时,优先拓展k1值最小的点,当存在多个k1相等的最小点时,再从中选取k2值最小的点进行拓展


   三、关键函数及概念

   (1)S:地形图中节点的集合,s属于S

   (2)c(s,s`):两节点之间的代价函数。

   (3)succ(s):successors,节点s的后续节点(子代节点)集合。

   (4)pred(s):predecessors,节点s的前代节点(父代节点),与上述succ(s)的意义刚好相反。

   (5)g*(s):节点s到起始点的实际最短距离。(这个概念用于对算法进行分析解释,并不参与算法的运算,在算法运行过程中实际发挥作用的是 g(s)和 rhs(s))

   (6)g(s):节点s到起始点的预计最短距离,上面那个值是实际的最短距离,这个值是一个预计值,是随着算法求解进程不断变动的,当所有节点的g(s)=rhs(s)时,g(s)的值就是到起始点的实际最短距离,即g(s)=g*(s)。也就是储存节点s曾经的最小值与当前最小值中最小的那个值

   (7)rhs(s) :right hand sides,对于s的所有邻接节点,求它们到s的距离加上邻接节点自身的g值,其中最小的那个值作为s的 rhs 值。也就是储存节点s当前的最小代价值

   (8)U:LPA * 的优先队列,类似于A * 中的openlist ,依据每个节点的k1和k2值进行排序,拓展时优先选择最小k值进行拓展。

   (9)topKey(),返回U队列中k值(按照先k1后k2进行排序)最小的节点;

   (10) pop(),从U队列中删除k值最小的节点;

   (11)insert(s,k),将具有给定优先级( k值)的节点插入队列;

   (12) remove(s),从队列中移除一个节点;

   (13)contains(s)如果队列包含指定节点,则返回true,如果不包含指定节点,则返回false ;


   四、LPA * 算法总体流程

   0、初始化:令优先队列U为空集,将所有节点s存入集合S中,并令每个节点s的g=rhs=inf ;令起始点的rhs值为0,此时起始点的rhs值与g值不相等,即起始点处于局部不一致状态,所以将起始点插入到U中,完成初始化。

   1、开始进行循环规划,直至U中的最小k值大于目标点k值时,或者目标点的rhs值与g值相等且不为Inf时,退出循环,完成当前的规划。

   2、在每轮循环中,首先获得U队列中的最小k值对应的节点u,并将该节点u从U队列中删除。如果g(u)>rhs(u),即节点u处于局部过一致状态,表明u可以令某个邻近节点作为父节点以获得更优的路径,故令g(u)=rhs(u)。遍历节点u的八邻域子节点(后续节点succ),如果g(u)<=rhs(u),即节点u处于局部欠一致状态或局部一致状态,则将g(u)=inf,使u处于局部过一致状态,遍历u的八邻域子节点和u节点本身(后续节点succ)。

   3、对于u的每一个八邻域子节点s(i),遍历节点s(i)的每一个八邻域前向节点p(i)(pred),通过rhs(si)=g(pi)+c(pi,si)计算假设分别将这些节点p(i)作为节点s(i)的父节点时,s(i)的rhs值,并选取他们中最小的rhs值,作为节点s(i)的rhs值,并将对应的pi作为其真正的父节点,此时若节点s(i)处于U中,则将s(i)从U中移除,并判断s(i)的g值与rhs值是否相同,若不相同说明节点s(i)处于局部不一致状态,重新将s(i)节点加入到U中,

   4、 待节点u的每一个八邻域节点s(i)完成以上操作后,本轮循环结束,从队列U中继续挑选k值最小的节点作为新的父节点进行下一轮循环,直至满足退出循环的条件,此时,静态路径规划已经完成,从目标点反推每一个节点的父节点,直到起点,就可以获得从起点至目标点的路径。直到地图突然有障碍物栅格u出现,导致节点间的连接代价发生变化,开始进行动态规划。

   5、首先找到所有以障碍物栅格u作为父节点的子代节点v,然后更新u和v节点的代价,实际上就是令受障碍物栅格点u影响的点的rhs值变为inf,使其与g值不等,重新处于局部不一致状态,加入U中进行更新。最后重新执行以上步骤1~3,找到新的最优路径


   五、LPA * 算法流程示例

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


   六、关键细节深入梳理

   1、关于succ与pred的概念问题:个人认为不必过于纠结这两个概念,在ComputeShortestPath函数中进行拓展时,实际上在编程实现时succ完全可以认为是当前拓展点周围八个邻近节点,同样在UpadateVertex函数中,pred完全也可以认为是s’周围的八个邻近节点

   2、环境突变后的处理:若环境发生变化,导致之前规划的路径不可行,则开始进入动态规划阶段。

   (1)首先,找到所有受影响的节点

   对于 每个 突变为障碍物的节点xi,找到其八邻域的相邻节点中 所有 的真正子节点ci(所谓真正的子节点也就是ci中保存的父节点信息为xi),将所有突变为障碍物的节点xi的所有真正子节点ci找到后,再以每个ci为父节点找到他们八邻域相邻节点中所有的真正子节点cci,以此不断的一层层找下去,直至没有子节点。那么所有的受影响的子节点也就找到了,即由ci、cci、ccci . . . . . .等构成的集合

   (2)然后,更新突变为障碍物的节点的rhs值和g值

   将所有突变为障碍物的节点的rhs值和g值设为inf

   (3)更新受影响的节点的rhs值

   将ci、cci、ccci . . . . . .等构成的集合中存储的受影响的子节点的rhs值设为inf,并将其添加到U队列中,等待更新,在往U队列中添加时,同时重新计算了这些受影响子节点的k1和k2值,尽管此时k1值和k2值并没有来得急发生改变。

   (4)调用ComputeShortestPath函数进行动态规划


主要参考资料:

     古月学院 基于栅格地图的机器人路径规划算法指南:【点击此处跳转】


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

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

相关文章

图数据库知识点1:图数据库与关系型数据库区别

文章目录 前言一、图数据库区别于其他数据库的核心是什么&#xff1f;二、图数据库能解决哪些问题&#xff1f; 1.图的优势2.目前的图的实现方式及优劣3.图的技术趋势及优势小结总结前言 《图数据库知识点》系列有20讲&#xff0c;每一讲中会重点分享一个图数据库知识点&#…

什么是JVM?JVM的机制与JVM自动内存管理机制,如何进行优化

1. 什么是JVM&#xff1f; JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码…

彻底搞懂MySql的B+Tree

1.什么是索引 官方定义&#xff1a;一种能为mysql提高查询效率的数据结构&#xff0c;索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。好比如&#xff0c;一本书&#xff0c;你想找到自己想看的章节内容&#xff0c;直接查询目录就行。这里的目录就类似索引…

华为路由器升级系统文件

欢迎关注微信公众号【厦门微思网络】。http://www.xmws.cn 组网图形 组网需求 RouterA的管理网口与用户侧主机HostA相连。要求通过BootROM菜单下载系统文件至RouterA完成系统升级。 操作步骤 1.在PC端启动FTP Server服务。 2.用串口线连接并通过Console口登录设备。 3.重启设…

Java内存模型与线程(3)

文章目录4. Java与线程4.1 线程的实现4.2 Java线程调度4.3 状态转换4. Java与线程 并发不一定要依赖多线程&#xff08;如PHP中很常见的多进程并发&#xff09;&#xff0c;但是在Jva里面谈论并发&#xff0c;大多数都与线程脱不开关系。既然我们这本书探讨的话题是Java虚拟机…

一个系列涨粉47w,小红书内容创意卷出新高度

前有双11&#xff0c;后有世界杯&#xff0c;11月注定是热闹的。图源新红_流量分析_趋势查询在此情况下&#xff0c; 小红书内又涌现出哪些黑马博主&#xff1f;有多少品牌打造出了爆品&#xff1f;什么样的种草玩法才能成功出圈&#xff1f;我们将全面分析11月榜单&#xff0c…

java面向对象最全入门笔记

Java面向对象 什么是面向对象编程&#xff1f; 面向&#xff1a;找、拿。 对象&#xff1a;东西。 面向对象编程&#xff1a;找或者拿东西过来编程。 设计对象并使用 设计类&#xff0c;创建对象并使用 类是什么&#xff1f; 类&#xff08;设计图&#xff09;&#xff1…

Vue Cli安装和node-sass、less-loader、sass-loader安装

一、Vue Cli安装 CLI全程是Command-Line Interface&#xff0c;命令行界面&#xff0c;俗称脚手架&#xff0c;可以帮我们快速的创建vue项 Vue Cli的使用必须依赖node环境和webpack 管理员方式打开cmd进行安装&#xff0c;安装命令&#xff1a; npm i -g vue/cli 查看版本…

鸢尾花数据种类预测、分析与处理、scikit-learn数据集使用、seaborn作图及数据集的划分

一、鸢尾花种类预测 Iris数据集是常用的分类实验数据集&#xff0c;由Fisher, 1936收集整理&#xff0c;Iris也称鸢尾花卉数据集&#xff0c;是一类多重变量分析的数据集 鸢尾花数据集包含了 4个属性&#xff08;特征值&#xff09; Sepal.Length&#xff08;花萼长度&#…

Linux学习-69-Linux系统启动管理

16 Linux系统启动管理 Linux 系统的启动是不需要人为参与和控制的&#xff0c;只要选择开机&#xff0c;系统就会按照设定好的方式进行启动。不过&#xff0c;了解系统的启动有助于我们在系统出现问题时能够快速地修复 Linux 系统。在 CentOS 6.x 中&#xff0c;系统的启动过程…

NoSQLBooster for MongoDB 7.1.X

最智能的 MongoDB IDE NoSQLBooster 是 MongoDB v2.6-6.0 的跨平台 GUI 工具&#xff0c;它提供了内置的 MongoDB 脚本调试器MongoDB 脚本调试器、全面的服务器监控工具、链接流畅查询、SQL 查询、查询代码生成器、任务调度、ES2020 支持和高级智能感知体验。 嵌入式 MongoDB 外…

网络面试-0x17如何立即诶OSI模型和TCP/IP协议

OSI(Open System Interconnect) 开放式通信系统互连参考模型。 每一层实现各自的功能和协议&#xff0c;并完成与相邻层的接口通信。即每一层扮演固定的角色&#xff0c;互不打扰。 应用层 ⑦ 作用&#xff1a;通过应用程序间的交互来完成特定的网络应用。 定义了应用程序之间…

【ONE·R || R与C++混合编程简单介绍 】

总言 课堂演讲&#xff1a;R语言与CPP混合编程课后学习汇报。    文章目录总言1、汇报目的&#xff12;、RCPP2.1、简单介绍&#xff1a;2.2、简单使用演示&#xff1a;2.1.1、Rcpp包与RTools2.2.2、上手尝试1.0&#xff1a;一个hello world小程序。2.2.3、上手尝试2.0&#…

STC 51单片机57——矩阵键盘 基本原理演示

51单片机 矩阵键盘 基本原理演示 #include "reg51.h" sbit P11P1^1; sbit P14P1^4; sbit P20P2^0; sbit P21P2^1; void main(void) { P111;// Hight P140; //Low if(P111) P200; else P210; while(1); }

刷爆力扣之较大分组的位置

刷爆力扣之较大分组的位置 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 工作原因拖更些时日&#xff0c;今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照…

Java项目:SSM农业信息管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 管理员角色包含以下功能&#xff1a; 管理员登陆,用户管理,新闻管理,留言列表查看等功能。 用户角色包含以下功能&#xff1a; 查看所有新闻,市…

免费分享20套微信小程序源码 源码免费下载【强烈推荐】

淘源码&#xff1a;国内知名的源码免费下载平台 微信小程序源码包括&#xff1a;商城系统、点餐外卖、垃圾分类、预约洗车、物业管理、校园跑腿、驾考学习、会议预约、图书管理、智能停车、在线答题等小程序源码。 源码分享&#xff0c;文末获取源码&#xff01; 1、JAVA微信…

微信API接口、微信二次开发API调用

微信API接口、微信二次开发API调用 微信协议接口调用-加微信好友及通过好友请求 加微信好友 /** * 微信自动添加好友 * author wechatno:tangjinjinwx * blog http://www.wlkankan.cn */ Async public void handleMsg(ChannelHandlerContext c…

代码随线录刷题|LeetCode 392.判断子序列 115.不同的子序列

目录 392.判断子序列 思路 1、确定dp数组 2、确定递推公式 3、初始化dp数组 4、遍历顺序 判断子序列 动态规划 双指针 115.不同的子序列 思路 1、确定dp数组 2、确定递推公式 3、初始化dp数组 4、遍历顺序 不同的子序列 392.判断子序列 题目链接&#xff1a;力扣 思路 比较简单…

【Exception】 Java Lambda List转换Map报错 触发异常 IllegalStateException: Duplicate key

【Exception】 Java Lambda List转换Map报错 触发异常 IllegalStateException: Duplicate key 一、问题描述 在使用Java8 lambda 将List转换为Map时&#xff0c;遇到报错&#xff1a;IllegalStateException- Duplicate key .... 具体报错信息如下&#xff1a; java.lang.Illega…