移动机器人运动规划 | 基于图搜索的Dijkstra 和 A*算法详解

Dijkstra 算法

Dijkstra 算法与BFS算法的区别就是 : 从容器中弹出接下来要访问的节点的规则不同

BFS 弹出: 层级最浅的原则,队列里最下方的元素

Dijkstra 弹出: 代价最小的节点g(n)

g(n) :表示的是从开始节点到当前n节点的代价累加
Dijkstra在扩展的时候,同时考虑从n节点扩展所有可扩展节点的代价g(),如果某个节点m的代价g(m)比g(n)要小,则更新当前代价为g(m)
Dijkstra的最优性保证:图运行的过程中,任何一个被扩展或者访问的节点,保证存储的代价g()值是从起点节点开始到当前节点的最小值

Dijkstra 算法 伪代码流程

维护一个优先级队列,存储所有被扩展的节点,且节点按g()值的大小自动按从小到大排列。

-优先级队列首先为空,以起始节点Xs进行初始化-起始节点g(Xs)=0,并且初始化其它节点的代价为无穷大-循环:1、如果队列是空的,返回false,跳出循环2、弹出优先级队列中代价最小的节点n3、标记节点n为被扩展节点4、如果节点n为目标节点,返回true,跳出循环5、找到n节点周围可以扩展的所以节点(没被扩展过)m6、进行判断 如果g(m)为无穷大(说明其它节点也没发现过m),7、则计算 真正的g(m)=g(n)+Cnm,然后将m节点加入到优先级队列中8、进行判断 如果g(m)不为无穷大,有值了(说明其它节点发现过m,m已经在优先级队列中)9、再次进行判断 如果之前发现m时计算的g(m)比g(n)+Cnm大的话10、更新g(m)=g(n)+Cnm。11、重复循环至步骤1-结束循环

Dijkstra 算法步骤示例

以这个图将Dijkstra 算法运行的步骤进行一个示例:

1、首先初始化队列,将起始节点放入优先级队列中
 


2、弹出起始节点
 


3、扩展弹出节点周围的节点
起始节点S可以扩展到子节点d\e\p,并且计算各节点的g值
 


4、将扩展的节点加入到优先级队列中,并且进行排序
g(p)最小,放到队列最前面,也就是图中的最下面,然后是d,最后是e。
 


5、弹出最小的g值节点
也就是p节点
 


然后循环至步骤3,直至结束

Dijkstra算法的优劣分析

  • 优点:完备的(如果问题有解,一定能找到解);最优的(找到的解一定是最优的)
  • 缺点:没有目标终点方向的,只是比广度搜索多了一个代价值判断,如果每个边的代价都是1的话,那么就变成了广度搜索。

针对该缺点,与之对应的就是启发式搜索,例如贪心算法,根据到目标的进行一个启发式搜索。

如果Dijkstra的最优性与启发式搜索结合,使搜索具有方向性时,也就是 A*算法了。

A*算法

A_算法与Dijkstra算法的框架是完全一样的,**A_算法就是有启发性的Dijkstra算法**

代价函数:g(n) 表示的是从开始节点到当前n节点的代价累加

启发函数:h(n) 表示当前节点到目标节点估计所花的代价

优先级队列:维护的是 代价函数+启发函数的 节点从小到大排序 f(n)=g(n)+h(n)

每次弹出的节点就是最小的f(n)值的节点。

A*算法伪代码

维护一个优先级队列,存储所有被扩展的节点,且节点按f()值的大小自动按从小到大排列。

-所以节点的启发值h(n)是为被定义的,是不知道的,到具体的节点再计算-优先级队列首先为空,以起始节点Xs进行初始化-起始节点g(Xs)=0,并且初始化其它节点的代价为无穷大-循环:1、如果队列是空的,返回false,跳出循环2、**弹出优先级队列中f(n)最小的节点n** [唯一与djikstra不同的地方]3、标记节点n为被扩展节点4、如果节点n为目标节点,返回true,跳出循环5、找到n节点周围可以扩展的所以节点(没被扩展过)m6、进行判断 如果g(m)为无穷大(说明其它节点也没发现过m),7、则计算 真正的g(m)=g(n)+Cnm,然后将m节点加入到优先级队列中8、进行判断 如果g(m)不为无穷大,有值了(说明其它节点发现过m,m已经在优先级队列中)9、再次进行判断 如果之前发现m时计算的g(m)比g(n)+Cnm大的话10、更新g(m)=g(n)+Cnm。11、重复循环至步骤1-结束循环

A* 算法步骤示例

下面是一个A_算法的演示图,每个边有个预先设置的代价g,每个节点有提前估计好的启发f
 


以这个图将A_ 算法运行的步骤进行一个示例:

1、首先初始化队列,将起始节点放入优先级队列中
 


2、弹出起始节点
可扩展的节点仅有a节点,计算f(a)=g(a)+h(a)=1+5=6
 


3、将扩展的节点放入优先级队列
 


4、弹出f最小节点,扩展周围节点
弹出a节点,a节点周围可以扩展的节点为 b\d\e 。并且根据g与h值计算f值
 


5、根据f值大小,压入队列中
d节点的f(d)=6最小,它在最下方。
 

点击移动机器人运动规划 | 基于图搜索的Dijkstra 和 A*算法详解 - 古月居可查看全文

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

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

相关文章

利用native的方式实现跨线程调用

简介 在OpenHarmony应用开发实践中,经常会遇到一些耗时的任务,如I/O操作、域名解析以及复杂计算等。这些任务如果直接在主线程中执行,将会严重阻塞主线程,影响后续任务的正常流程,进而导致用户界面响应延迟甚至卡顿。…

【鸿蒙 HarmonyOS】获取设备的地理位置

一、背景 获取移动设备的地理位置,包含:经度、维度、具体地理位置等,地理位置信息能在许多业务场景中被应用,如导航、地图服务、位置服务、社交媒体等。 下面以一个Demo例子,来实现获取设备地理位置的功能 官方文档…

软件测试下的AI之路(4)

😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:【Austin_zhai】 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。…

实时计算平台设计方案:913-基于100G光口的DSP+FPGA实时计算平台

基于100G光口的DSPFPGA实时计算平台 一、产品概述 基于以太网接口的实时数据智能计算一直应用于互联网、网络安全、大数据交换的场景。以DSPFPGA的方案,体现了基于硬件计算的独特性能,区别于X86GPU的计算方案,保留了高带宽特性&…

Ceph学习 - 1.存储知识

文章目录 1.存储基础1.1 基础知识1.1.1 存储基础1.1.2 存储使用 1.2 文件系统1.2.1 简介1.2.2 数据存储1.2.3 存储应用的基本方式1.2.4 文件存储 1.3 小结 1.存储基础 学习目标:这一节,我们从基础知识、文件系统、小节三个方面来学习。 1.1 基础知识 1.…

UART设计

一、UART通信简介 通用异步收发器, 特点:串行、异步、全双工通信 优点:通信线路简单,传输距离远 缺点:传输速度慢 数据传输速率:波特率(单位:baud,波特) …

如何高效学习Python编程语言

理解Python的应用场景 不同的编程语言有不同的发展历史和应用场景,了解Python主要应用在哪些领域对于学习它会有很大帮助。Python最初是一种通用脚本语言,主要用于系统级任务自动化。随着时间的推移,它逐步成为数据处理、科学计算、Web开发、自动化运维等众多领域的主要编程语…

Navicat设置mysql权限

新建用户: 注意:如果不生效执行刷新命令:FLUSH PRIVILEGES; 执行后再重新打开查看; 查询权限命令:1234为新建的用户名,localhost为访问的地址 SHOW GRANTS FOR 1234localhost;如果服务器设置服务器权限后可能会出现权…

潜伏三年,核弹级危机一触即发,亚信安全深度分析XZ Utils后门事件

2024年3月29日星期五上午8点,有研究人员称xz/liblzma中的后门导致SSH服务器内存泄露,使得SSH服务异常(https://www.openwall.com/lists/oss-security/2024/03/29/4)。github中“xz”压缩工具主要由Larhzu和Jia Tan共同负责维护&am…

力扣25. K 个一组翻转链表

Problem: 25. K 个一组翻转链表 文章目录 题目描述思路复杂度Code 题目描述 思路 1.创建虚拟头节点dummy并将其next指针指向head,创建指针pre、end均指向dummy; 2.编写反转单链表的函数reverse 3.当end -> next 不为空时: 3.1.每次k个一组…

Bigtable [OSDI‘06] 论文阅读笔记

原论文:Bigtable: A Distributed Storage System for Structured Data (OSDI’06) 1. Introduction Bigtable 是一种用于管理结构化数据的分布式存储系统,可扩展到非常大的规模:数千台服务器上的数据量可达 PB 级别,同时保证可靠…

阿里巴巴拍立淘API新功能揭秘:图片秒搜商品,实现智能化个性化购物新体验

在数字化快速发展的今天,智能化和个性化已经成为购物体验中不可或缺的元素。为了满足消费者日益增长的购物需求,阿里巴巴中国站不断推陈出新,其中拍立淘API的新功能——图片秒搜商品,无疑为智能化个性化购物体验开创了新的篇章。 …

【机器学习入门】使用YOLO模型进行物体检测

系列文章目录 第1章 专家系统 第2章 决策树 第3章 神经元和感知机 识别手写数字——感知机 第4章 线性回归 第5章 逻辑斯蒂回归和分类 第5章 支持向量机 第6章 人工神经网络(一) 第6章 人工神经网络(二) 卷积和池化 第6章 使用pytorch进行手写数字识别 文章目录 系列文章目录前…

八股面试速成—计算机网络部分

暑期实习面试在即,这几天八股和算法轮扁我>_ 八股部分打算先找学习视屏跟着画下思维导图,然后看详细的面试知识点,最后刷题 其中导图包含的是常考的题,按照思维导图形式整理,会在复盘后更新 细节研究侧重补全&a…

基于单片机冬季供暖室温调节控制系统

**单片机设计介绍,基于单片机冬季供暖室温调节控制系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的冬季供暖室温调节控制系统是一种集温度检测、控制和显示功能于一体的智能化系统。该系统以单片机为…

C++ 指针与结构

三种存取结构成员的方式: ① 通过结构变量名; ②通过指向结构的指针和间接运算符(*); ③通过指向结构的指针和指向成员运算符(->);

【已解决】ZIP压缩文件如何设置密码?

ZIP是常用的压缩格式之一,对于重要的ZIP文件,我们还可设置密码保护,那ZIP压缩文件怎么设置密码呢?不清楚的小伙伴一起来看看吧! 给ZIP文件设置密码,我们需要用到支持ZIP格式的解压缩软件,比如7…

2024HW-->Wireshark攻击流量分析

在HW中,最离不开的,肯定是看监控了,那么就要去了解一些wireshark的基础用法以及攻击的流量!!!! 1.Wireshark的基本用法 比如人家面试官给你一段流量包,你要会用 1.分组详情 对于我…

UE4_如果快速做出毛玻璃效果_假景深

UE4_如果快速做出毛玻璃效果_假景深 2022-08-20 15:02 一个SpiralBlur-SceneTexture材质节点完成效果,启用半透明材质通过修改BlurAmount数值大小调整效果spiralBlur-SceneTexture custom节点,HLSL语言float3 CurColor 0;float2 BaseUV MaterialFloa…

pytest的时候输出一个F后面跟很多绿色的点解读

使用pytest来测试pyramid和kotti项目,在kotti项目测试的时候,输出一个F后面跟很多绿色的点,是什么意思呢? 原来在使用pytest进行测试时,输出中的“F”代表一个失败的测试(Failed),而…