D*算法学习

系列文章目录

A*算法学习-CSDN博客

弗洛伊德算法(Floyd)和路径平滑弗洛伊德算法(Smooth Floyd)学习-CSDN博客


目录

系列文章目录

前言

一、D*算法是什么?

二、D* 算法是对 A* 算法的改进

三、增量搜索是什么

总结


前言

之前弄了离线的,当然离线的Dijkstra算法没总结,A*算法和Dijistra算法的区别在于有无估价值Dijistra算法相当于A*算法中估价值为0的情况。然后今天看了下适合动态的D*算法。

参考资料:

original_dstar_icra94.pdf (mit.edu)

最短路经算法简介(Dijkstra算法,A*算法,D*算法)(转载)_d星算法和dijkstar算法-CSDN博客

 D*路径搜索算法原理解析及Python实现_d*算法-CSDN博客

D*算法超详解 (D星算法 / Dynamic A*算法/ Dstar算法)(死循环解决--跟其他资料不一样奥)-CSDN博客

D*算法图文详解_d*算法图解_一叶执念的博客-CSDN博客 

路径规划五种算法简述及对比 - 知乎 (zhihu.com)

资料好多,主要我感觉都是大家的思考,没有实现(之后可以试试)。


一、D*算法是什么?

D* (D-Star) 算法是一种用于路径规划的增量式搜索算法,它在已知地图上找到从起点到目标的最短路径。与 A* 算法不同,D* 算法具有增量搜索的特性,允许在环境发生变化时更新路径而不必重新计算整个路径。

D* 算法的基本思想是:

  1. 初始化: 从目标点开始,向起点搜索,计算每个节点的代价值(g值)。
  2. 路径改进: 当环境发生变化,或者机器人移动到新位置时,根据新的代价值信息,以增量方式更新路径。
  3. 迭代: 不断迭代,根据新的代价值信息改进路径,直至达到起点。

D* 算法主要包括两个核心函数:

  1. ComputeShortestPath: 从机器人当前位置开始,向目标搜索,并计算每个节点的代价值。
  2. ImprovePath: 根据新的代价值信息,对路径进行增量式的改进。

以下是 D* 算法的一个简化版本的伪代码

function ComputeShortestPath():while (有未被探索的节点) {选择代价最小的节点 u;for (u 的每个邻居节点 v) {计算节点 v 的新代价值 g_new;如果 g_new 比 v 当前的代价值小,则更新 v 的代价值,并将 v 添加到 OPEN 列表;}}function ImprovePath():while (机器人移动或环境发生变化) {更新机器人的位置;将机器人当前位置标记为已被修改;for (每个已被修改的节点 v) {for (v 的每个邻居节点 u) {计算节点 u 的新代价值 g_new;如果 g_new 比 u 当前的代价值小,则更新 u 的代价值,并将 u 添加到 OPEN 列表;}}从 OPEN 列表中选择代价最小的节点作为机器人的下一个移动目标;移动机器人到目标位置;}

二、D* 算法是对 A* 算法的改进

D* 算法是对 A* 算法的改进,主要用于路径规划问题。以下是 D* 算法相对于 A* 算法的主要改进点:

  1. 增量搜索: D* 算法支持增量式搜索,可以在环境变化时有效地更新路径而不必重新计算整个路径。这使得 D* 算法更加适用于实时应用,例如机器人导航。

  2. 反向搜索: D* 算法从目标点开始搜索,向起点移动。这种反向搜索的方式对于机器人等应用而言,通常更符合实际情况,因为机器人通常知道目标位置而不知道起点位置。

  3. 减少重新规划次数: D* 算法通过增量更新路径,减少了对节点的重新规划的次数。只有在发生环境变化或机器人移动到新位置时,才会进行必要的更新,提高了算法的效率。

  4. 灵活的数据结构: D* 算法使用了灵活的数据结构,如优先队列(Priority Queue)来维护待处理的节点。这样可以更高效地选择下一个待处理的节点,提高搜索效率。

  5. 自适应性: D* 算法具有自适应性,能够在搜索过程中根据需要灵活地调整搜索策略,以适应不同的环境和实际情况。

尽管 D* 算法在某些方面改进了 A* 算法,但在某些情况下,A* 算法可能仍然更适用。选择算法应根据具体应用场景、性能需求和实际情况进行权衡。

三、增量搜索是什么

增量搜索是指在原有路径的基础上,只对发生变化的部分进行重新规划,而不必重新计算整个路径。D* 算法通过增量搜索实现了对路径的高效更新。

在 D* 算法中,主要有两个核心的数据结构:

  1. Priority Queue(优先队列): 用于按照节点的启发式值(通常是代价估计)维护待处理的节点,以便在每一步选择最有希望的节点进行拓展。

  2. Key Value: 每个节点都有一个键值对 (k, v),其中 k 是节点的当前估计代价,v 是节点的实际代价。节点的排序依据是键值对 (k, v)。

D* 算法的增量搜索过程可以概括为以下几个步骤:

  1. 根据当前的启发式值更新代价: 如果环境发生变化,导致某些节点的代价发生变化,那么更新这些节点的实际代价。

  2. 将发生变化的节点加入优先队列: 将发生变化的节点(代价发生变化的节点)加入优先队列中,以备后续的路径规划。

  3. 从优先队列中选择下一个节点: 从优先队列中选择键值对 (k, v) 最小的节点进行拓展。

  4. 拓展节点: 对选中的节点进行拓展,更新其邻居节点的代价,并将发生变化的邻居节点加入优先队列。

  5. 重复步骤 3 和 4: 反复进行选择节点和拓展的过程,直至找到新的路径或者满足停止条件。

在增量搜索过程中,只有发生变化的节点和与之相邻的节点会被重新规划,其他部分的路径保持不变。这种方式有效地减少了不必要的计算,提高了算法的效率。增量搜索的核心思想是在原有路径的基础上,只关注发生变化的部分,以适应实时环境变化的需求。


总结

在D*算法的基础上还有D* Lite 算法,它对 D* 算法进行了优化,提高了算法的性能和实用性。主要改进在于使用了更灵活的数据结构,减少了对节点的重新规划的次数。之后有机会也可以试试。

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

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

相关文章

梯度爆炸梯度消失

梯度消失和梯度爆炸是深度学习中常见的问题,与神经网络的训练相关。这两个问题都涉及到梯度在反向传播过程中的传递。 梯度消失(Gradient Vanishing): 当神经网络较深时,反向传播过程中梯度可能逐层减小,最…

【FMC139】青翼科技基于VITA57.1标准的4路500MSPS/1GSPS/1.25GSPS采样率14位AD采集FMC子卡模块

板卡概述 FMC139是一款基于VITA57.1标准规范的JESD204B接口FMC子卡模块,该模块可以实现4路14-bit、500MSPS/1GSPS ADC采集功能。该板卡ADC器件采用ADI公司的AD9680芯片,全功率-3dB模拟输入带宽可达2GHz。该ADC与FPGA的主机接口通过8通道的高速串行GTX收发器进行互联…

Python模块与Linux stat 命令:双剑合璧的文件系统探索

简介:在Linux和Unix-like系统中,stat命令用于获取文件或目录的详细属性信息,包括但不限于大小、所有权、权限和时间戳。同样,在Python编程中,我们也有多个模块(例如os、pathlib等)提供了与stat类…

来CSDN一周年啦!!!

各位CSDN的uu们你们好呀,今天是小雅兰来到CSDN创作的一周年啦,时间,说长不长,说短也不短,在这一年中,我认为我也收获了一些很有价值的东西吧!! 一周年了,该创作的还得继续…

基于PAM自定义ssh登陆认证

以下是一个基于Linux PAM认证SSH登录的动态链接库&#xff08;.so&#xff09;模块的示例代码&#xff0c;使用C语言编写&#xff0c;其中包括对用户名、密码以及约定的口令的认证&#xff1a; c #include <stdio.h> #include <stdlib.h> #include <string.h&g…

【PTA-C语言】实验四-循环结构II

如果代码存在问题&#xff0c;麻烦大家指正 ~ ~有帮助麻烦点个赞 ~ ~ 实验四-循环结构II 7-1 跟奥巴马一起画方块&#xff08;分数 15&#xff09;7-2 打印九九口诀表&#xff08;分数 10&#xff09;7-3 求符合给定条件的整数集&#xff08;分数 15&#xff09;7-4 求特殊方程…

AGI智能新时代,大模型为软件开发带来范式变革

导语 | 人工智能作为新一轮科技革命和产业变革的重要驱动力量&#xff0c;尤其是在当下新一轮 AI 大模型、生成式 AI 浪潮背景下&#xff0c;重视通用人工智能&#xff08;AGI&#xff09;成为行业的共识。在当前&#xff0c; AGI 技术背后的逻辑究竟是怎样的&#xff1f;技术创…

力扣二叉树--第三十六天

前言 两天没写题了&#xff0c;期末月&#xff0c;压力有点大&#xff0c;休息一下&#xff0c;释放一下压力。焦虑常在&#xff0c;调整好心态啊&#xff01;度过这一个月。写中序遍历的时候&#xff0c;发现自己竟然对树是怎么遍历的很模糊&#xff01;&#xff01;&#xf…

CF688A Opponents

Opponents 题面翻译 问题描述 小白有 n 个对手&#xff0c;他每天都要和这些对手PK。对于每一天&#xff0c;如果 n 个对手全部到齐&#xff0c;那么小白就输了一场&#xff0c;否则小白就赢了一场。特别的&#xff0c;如果某天一个对手都没有到&#xff0c;也算小白赢。现在…

杨志丰:OceanBase助力企业应对数据库转型深水区挑战

11 月 16 日&#xff0c;OceanBase 在北京顺利举办 2023 年度发布会&#xff0c;正式宣布&#xff1a;将持续践行“一体化”产品战略&#xff0c;为关键业务负载打造一体化数据库。OceanBase 产品总经理杨志丰发表了《助力企业应对数据库转型深水区挑战》主题演讲。 以下为演讲…

【代码】基于改进差分进化算法的微电网调度研究matlab

程序名称&#xff1a;基于改进差分进化算法的微电网调度研究 实现平台&#xff1a;matlab 代码简介&#xff1a;了进一步提升差分进化算法的优化性能,结合粒子群(PSO)算法的进化机制,提出一种混合多重随机变异粒子差分进化算法(DE-PSO)。所提算法不仅使用粒子群差分变异策略和…

7.C转python

1.对字典的各种操作都是对键来进行的 2.关于字典的遍历操作 例: 还可以这样遍历 所以生成了一个固定模版来遍历字典: 例: 那两个名字可以换 例: 3.合法key的类型: 要求可哈希 在python中,专门提供了一个hash()函数来计算哈希值 例: 有的类型是不能计算哈希的,如:列表,字…

深度学习与深度迁移学习有什么区别?

深度学习包含深度迁移学习&#xff0c;它们都利用了深层神经网络&#xff08;Deep Neural Network&#xff0c;DNN&#xff09;来处理数据&#xff0c;并从中学习特征。但是&#xff0c;它们也有一些区别。 深度学习是一种机器学习方法&#xff0c;它通过多层神经网络来自动学…

分享89个节日PPT,总有一款适合您

分享89个节日PPT&#xff0c;总有一款适合您 89个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1j6Yj-7UCcUyV4V_S_eGjpQ?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

编写高质量Python (第26条) 用 functools.wraps 定义函数装饰器

第26条 用 functools.wraps 定义函数装饰器 ​ Python 中有一个特殊写法&#xff0c;可以用装饰器来封装某个函数&#xff0c;从而让函数在执行这个函数之前与执行完这个函数之后&#xff0c;分别运行某些代码。这意味着&#xff0c;调用者传给参数的参数值、函数返回给调用者…

深度学习(四):pytorch搭建GAN(对抗网络)

1.GAN 生成对抗网络&#xff08;GAN&#xff09;是一种深度学习模型&#xff0c;由两个网络组成&#xff1a;生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;。生成器负责生成假数据&#xff0c;而判别器则负责判断数据是真实的还是 f…

解决Linux的端口占用报错问题

文章目录 1 Linux报错2 解决方式 1 Linux报错 Port 6006 is in use. If a gradio.Blocks is running on the port, you can close() it or gradio.close_all(). 想起之前运行Gradio 6006&#xff0c;端口被占用 2 解决方式 输入 netstat -tpl查看当前一些端口号的占用号&a…

go第三方包发布(短精细)

1、清除其他依赖项 $ go mod tidy # 清除不必要的依赖依赖清除完成后&#xff0c;查看go.mod文件配置是否规范 module github.com/fyupeng/rpc-go-netty go 1.19 require ( )2、本地版本创建 $ git tag v0.1.0 # 本地 创建标签3、版本提交 $ git push github v0.1.0 # 推送…

Selector SelectionKey基础学习

netty技术内幕一(Selector,SelectionKey) Java Nio注意事项 # selector Selector类的使用(一) SelectionKey类的使用 /* package java.nio.channels;import java.io.Closeable; import java.io.IOException; import java.nio.channels.spi.SelectorProvider; import java.u…

面试就是这么简单,offer拿到手软(一)—— 常见非技术问题回答思路

面试系列&#xff1a; 面试就是这么简单&#xff0c;offer拿到手软&#xff08;一&#xff09;—— 常见非技术问题回答思路 面试就是这么简单&#xff0c;offer拿到手软&#xff08;二&#xff09;—— 常见65道非技术面试问题 文章目录 一、前言二、常见面试问题回答思路问…