路径规划——搜索算法详解(二):Floyd算法详解与MATLAB代码

上次总结了Dijkstra算法的案例原理与代码,本文分享第二种比较基础且易懂的方法为Floyd算法,该算法可以有效正确地处理有向图的最短路径问题,与Dijkstra算法不同,Floyd算法是一种动态规划算法,对于稠密图效果显著。原理简单高效,其可以计算任意两个节点的最小距离,时间复杂度为O(n3)。

一、Floyd算法讲解:

本文讲解案例来自于古月学院,该篇也是对笔者学习内容的总结,有需要的朋友可以直接跳转到课程。其算法流程图如下,可能刚开始看着有点懵(笔者也是),没事听着笔者讲解下很容易可以理解的。

1. 初始化:

如上图所示,假如有稠密图如上,共有ABCDEFG总共7个节点,故此时上述流程图的n=7,初始化一个7*7的矩阵,记录每两个节点的距离,如第一行第一列的元素代表A到A的距离,为0,看图将矩阵填好,有直接连接的节点填的就是其距离,如BC直接相连,距离如上图记为10,同理CB也为10。无直接连接关系的记为inf代表无穷大的范围。

2. 循环更新代价矩阵(第一个循环):

初始化完成后我们进入第一个循环,此时i=1(按顺序排序,i=1234567分别为ABCDEFG为中介点的情况),此时我们需要以A为中间点,此时选取除A外的任一节点,并计算该节点与除开A点与该点以外的任一点的距离,如此时选取B点,计算B点到除A外的任一点的距离,如计算B到C的距离,经过A到达C的距离为AC距离加上BA距离,此时为inf+10>10不更新;下一个计算B到D的距离,B与D不直接连接故为inf,而B经过A到C的距离为AC距离+BD距离为inf+12=inf,故不用更新,同理可以更新B到E、F的距离,当B通过A到达E、F点的距离<B直接连接E、F的距离时,更新矩阵中的距离值。如上述所示,计算B经过A连接到G的距离为BA+AG=12+14=26 < inf(B直接连接G的距离,因为没有直接连接所以为inf),此时更新B到G的距离。

更新完A点为中介点时B到达其他点的距离后,更新以A为中介点C到达其他任意点的距离,以此类推,计算D、E、F、G以A为中介点到达其他节点的距离。上述过程相当于三层循环,此时结束了A点作为中介点的情况。

描述很绕,笔者画了一个图方便大家理解:

3. 循环更新代价矩阵(第二个循环):

此时以A点为中介点的遍历结束,i+1=2,此时中介点为B,更新A、C、D、E、F、G以B为中介点到达彼此的距离,并与直接相连接的距离进行比较,当经过中介点B的距离<直接连接的距离时,更新该值。

4. 循环更新代价矩阵(第三个循环):

以C点为中介点,更新A、B、D、E、F、G以C为中介点到达彼此的距离,以此类推

5.不断循环,直到以G为中介点更新彼此距离,最终得到以下矩阵:

通过该图,我们可以读取任一两点之间的最短距离,如BC最小距离为10,FG为9,很直观,但是具有比较高的时间复杂度,第一层循环为选取中介点有n个节点,第二层循环有n-1个节点,计算与除开第一第二层所选取的两个节点外的n-2个节点的距离,故为O(n3)。

二Floyd*算法核心代码*(原理比较简单,直接用MATLAB仿真了):

已经上传到github上了,注释很详细

GitHub - Adamaser/Path-Planning

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

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

相关文章

安达发|APS计划排产系统帮助纺织业实现企业数字化管理

APS&#xff08;高级计划排产系统&#xff09;是一种基于供应链管理和约束理论的计划排产工具&#xff0c;它通过模拟和优化企业的生产、物流等运作过程&#xff0c;帮助企业实现精细化管理。在纺织业中&#xff0c;APS的应用可以极大地推动企业数字化管理的进程&#xff0c;具…

武汉星起航:各大企业力挺亚马逊,共筑跨境电商新生态

亚马逊电商平台作为全球领先的跨境电商巨头&#xff0c;一直以来都备受各大企业的青睐与支持。这些企业通过与亚马逊合作&#xff0c;共同拓展市场、提升品牌影响力&#xff0c;实现了互利共赢的局面。武汉星起航将浅析各大企业对亚马逊电商平台的支持&#xff0c;展现其共筑强…

Linux之时间子系统(四): tick 层模块(broadcast )

一、前言 在内核中&#xff0c;有cpuidle framework可以控制cpu的节电&#xff1a;当没有进程调度到该cpu上执行的时候&#xff0c;swapper进程粉墨登场&#xff0c;将该cpu会被推入到idle状态。当然CPU的idle状态有深有浅&#xff0c;当CPU睡的比较深入的时候&#xff0c;有可…

嵌入式C语言中头文件计设规则方法

我是阿梁,最近在负责的项目代码,也算是祖传代码了,里面有很多头文件嵌套的情况,即a.h包含b.h,b.h又包含c.h,c.h又包含d.h......遂找到一份华子的C语言编程规范学习一下,并结合自己的理解写成这篇文章,以规范自己的代码。 1. 头文件嵌套的缺点 依赖:若x.h包含了y.h,则…

组蛋白脱乙酰酶介导的胃癌肿瘤微环境特征及协同免疫治疗(多组学文献学习)

目录 ①HDAC转录组多数据NMF一次聚类 ②ACRG队列中HDAC单独NMF聚类 ③HDS评分在胃癌中的临床特征和基因组特征 ④高 HDS 可能提示胃癌的“热”肿瘤状态 ⑤HDS是胃癌免疫治疗效果的有力预测指标 ⑥单细胞转录组测序揭示了高HDS和低HDS患者的TME ⑦内皮细胞和成纤维细胞可…

Unity LineRenderer的基本了解

在Unity中&#xff0c;LineRenderer组件用于在场景中绘制简单的线条。它通常用于绘制轨迹、路径、激光等效果。 下面来了解下它的基本信息。 1、创建 法1&#xff1a;通过代码创建 using UnityEngine;public class CreateLineRenderer : MonoBehaviour {void Start(){// 创…

接口自动化框架搭建(四):pytest的使用

1&#xff0c;使用说明 网上资料比较多&#xff0c;我这边就简单写下 1&#xff0c;目录结构 2&#xff0c;test_1.py创建两条测试用例 def test_1():print(test1)def test_2():print(test2)3&#xff0c;在pycharm中执行 4&#xff0c;执行结果&#xff1a; 2&#xff0…

Taskflow:子流任务(Subflow Tasking)

创建Subflow DAG任务中&#xff0c;有一种常见的场景&#xff0c;一个任务可能在执行期间产生新的任务&#xff0c;然后紧接着执行新任务。 之前提到的静态图就没有办法实现这样一个功能了&#xff0c;所以Taskflow提供了另一种流的节点&#xff1a;Subflow&#xff0c;Subflo…

node.js学习(2)

版权声明 以下文章为尚硅谷PDF资料&#xff0c;B站视频链接&#xff1a;【尚硅谷Node.js零基础视频教程&#xff0c;nodejs新手到高手】仅供个人学习交流使用。如涉及侵权问题&#xff0c;请立即与本人联系&#xff0c;本人将积极配合删除相关内容。感谢理解和支持&#xff0c;…

ttkbootstrap界面美化系列之Notebook(四)

在简单的界面设计中&#xff0c;Notebook也是常用的组件之一&#xff0c;Notebook组件的引入可以根据标签来切换不同的界面。使得界面更有层次感&#xff0c;不必都挤在一个界面上。在tkinter中就有Notebook组件&#xff0c;在ttkbootstrap中&#xff0c;同样也对Notebook进行了…

Linux+ARM 简单环境检测---软件部分

1、前言 这个是我学习linuxARM的在做的第一个软硬件结合项目&#xff0c;以往的类似这种整体类项目还是光单片机的时候&#xff0c;linux软件部分学习了差不多快一年了&#xff0c;因为各种事情耽搁&#xff0c;这个项目一直没有静下心来完成&#xff0c;不过终于哈哈哈哈搞完了…

代码随想录——移除元素(Leetcode27)

题目链接 暴力&#xff1a;&#xff08;没有改变元素相对位置&#xff09; class Solution {public int removeElement(int[] nums, int val) {int len nums.length;for(int i 0; i < len; i){if(nums[i] val){for(int j i 1; j < len; j){nums[j-1] nums[j];}i…

VS2019连接MySQL

VS2019连接MySQL 下载MySQL Connector/C配置头文件&#xff0c;库文件路径配置头文件路径配置库的路径复制dll文件 MySQL的用户设置将权限赋值给新用户 编写代码往数据库写入 老师布置的作业让我们用VS2019连接MySQL实现一个小型的日志系统&#xff0c;中间踩了很多的坑&#x…

springboot婚庆系统

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于婚庆系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了婚庆系统&#xff0c;它彻底改变了过去传统的管理方式…

【Gitea的介绍】

&#x1f525;博主&#xff1a;程序员不想YY啊&#x1f525; &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f4ab; &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 &#x1f308;希望本文对您有所裨益&#xff0c;如有…

在同一个网站上自动下载多个子页面内容

一、问题现象 第一次遇到这样的问题&#xff0c;如下图&#xff1a; 即在同一个网站上下载多个内容时&#xff0c;第一个内容明明已经正常get到了&#xff0c;但开始第二个页面的查询 以后&#xff0c;原来已经查出的内容就找不到了。 二、解决办法 我不知道大家是不是遇到…

配置vsftpd服务

服务简介 1、FTP协议概览 FTP&#xff08;File Transfer Protocol&#xff09;⽂件传输协议&#xff0c;在TCP/IP协议族中属于应⽤层协议&#xff0c;是运⾏于 TCP协议之上是⼀种可靠的传输协议&#xff0c;主要功能⽤于实现⽤户间⽂件分发共享&#xff0c;以及⽹络管理 者在进…

Flutter开发之objectbox

Flutter开发之objectbox 在之前进行iOS开发的时候使用WCDB去进行管理数据库很方便&#xff0c;它支持ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;&#xff0c;用于实现面向对象编程语言里不同类型系统的数据之间的转换。 那么在Flutter开发…

代码随想录(day10)——栈和队列

Leetcode.1047 删除字符串中所有相邻重复项&#xff1a; 1047. 删除字符串中的所有相邻重复项 - 力扣&#xff08;LeetCode&#xff09; 本题可以利用栈的思想进行解答。但是此处并不是真正的去使用一个栈&#xff0c;而是利用来替代栈在本题中的作用。具体如下&#xff1a; …

【Vue】动态样式

内联样式的动态样式 body(){ boxASelect:false, } v-bind:style"{borderColor:boxASelect ? red : #ccc}" <body><header><h1>Vue Dynamic Styling</h1></header><section id"styling"><div class"demo&quo…