从实例出发,让你一文实现Floyd算法
目录
- 看完必会的Folyd算法!
- 前言
- Floyd实现原理
- 从实例出发理解
- 概念理解一:距离矩阵
- 概念理解二:路径矩阵
- 举个例子
- 代码实现
看完必会的Folyd算法!
前言
最近在学习算法的过程中,接触了最短路径这一专题,又由于在数模比赛中,此算法出现的概率较为频繁,所以记下这篇,希望对大家有所帮助
Floyd实现原理
假设说,我们从A点到达B点的距离为10,但是从A先到C,再到B的距离为9,那么我们选择的路径是不是应该选择A->C->B呢,这其实就是Floyd中的最简单的实例,也就是说,我们在两个位置之间,选择一个中转点进行判断,如果,经过了中转点的路径比直接到达的路径更短,则选择具有中短点的这条线。
可能单纯的文字有些苍白,最主要的是我们通过实例进行理解!
从实例出发理解
概念理解一:距离矩阵
- 距离矩阵正如名字所说,其记录的便是两个点之间的最短距离,这个所谓的最短距离便是在不断的选取中转点来进行更新的。
- 我们假设我们选取的中转点为K,第一个点为i,第二个点为j
- 那么D(i,j)则表示的是第i个点到j个点的距离,D(i,k)表示的是第i个点到中转点K的距离
- 那么:距离矩阵更新的条件可以用下面不等式表示
其中D(i,K)+D(K,j)表示i到j从K中转的距离,D(i,j)表示从i到j的最短距离,如果前者比后者小,那么就D(i,j)进行更新:D ( i , j ) = D ( i , K ) + D ( K , j ) ,这样就更新了距离矩阵。
那么我们该如何记录这条路线呢?
这个时候便需要用到我们的路径矩阵了!
概念理解二:路径矩阵
- 路径矩阵所表示的是,两个点之间所需要经过的中转点,假设说我们从A点到B点需要经过C点才是最短路径,那么我们可以表示为R(A,B)=C,这个时候,如果说R(C,B)=D,这个表示什么呢?说明C点到B点需要经过一个D点,如果D点到B点没有经过中转点,那么此时最短路径那显然就是A->C->D->B。
- 那么路径矩阵一开始的值是多少呢?比如R(I,J)的值应该为多少呢?对了,答案为J,因为一开始我们所认为的路径是直接从I到J点,那么不就相当于中转点就是J点了吗?
举个例子
- 初始化矩阵,这里有个需要注意的点是,**如果没有从i点直接到达j点的路线,那么D(i,j)记为无穷大,例如从V2->V1没有直接的线路,所以记为无穷大。**从i到i,即从自己出发到自己,那么最短的路径自然而然的就为0了,初始化时这两点需要大家清楚。
而初始化后,我们所需要做的便是遍历中转点,然后判断每个i到每个j的距离是否应该更新。
- 什么意思呢?简而言之就是三重循环,首先我们先判断第几个点作为中转点,然后在选择起始点,再选定好起始点后,再遍历终点。
- 举个例子:我们先选择第一个点作为中转点,**然后选择第一个点作为起点,那么我们选定好起点后,是不是要从第一个点遍历到最后一个点作为终点,**判断从起点(第一个点)到终点是否需要根据中转点来进行更新矩阵。
- 当第一个起点选定后,其终点从第一个点到最后一个点都遍历完后,再选择第二个点作为起点。从第一个点到最后一个点作为终点,即判断(2,1)(2,2)…的距离是否需要根据第一个中转点进行跟新
- 当起点全部选完后,我们应该再选择第二个点作为中转点,这时,我们比较的便是是通过第一个中转点更近呢还是第二个中转点更近呢,我们只要重复上面选定起点和终点的操作就行。
- 当我们三重循环下来,所得到的每两个点之间的距离便是最短了,并且与此同时我们也得到了,每两个点之间需要经过哪个中转点距离才最短。
首先由V1进行中转那么V1到到各个点的距离还是不变。
V2没有到达V1的路径,所以也就不存在从V1中转的情况,所以V2到各个点的距离还是不变。
V3可以经由V1中转,那么这个时候判断一下中转前和中转后的距离大小,将最小距离留存下来如:
V3->V1 = 7 不变
V3->V2 = inf,经由V1中转之后V3->V1->V2 = 9, 于是V3到V2的最短距离变化为9,更新路由矩阵R(3,2) = R(3,1) = 1
V3->V4 = 1,经由V1中转之后V3->V1->V4 = 11, 于是V3到V4的最短距离就还是1
同理:
V4->V2 = inf, 经由V1中转之后V4->V1->V2 = 7, 于是V4到V2的最短距离变化为7,更新路由矩阵R(4,2) = R(4,1) = 1
V4->V3 = 12,经由V1中转之后V4->V1->V3 = 11, 于是V4到V2的最短距离变化为11,更新路由矩阵R(4,3) = R(4,1) = 1
- 那么我们经过第一个中转点后,所得到的距离矩阵和路径矩阵就如下:
接下来在V1中转后的距离矩阵和路径矩阵下,来进行V2中转:
V1->V2 = 2
V1->V3 = 6,经由V2中转之后V1->V2->V3 = 5, 于是V1到V3的最短距离变化为5,更新路由矩阵R(1,3) = R(1,2) = 2
V1->V4 = 4
V2->V1 = inf
V2->V3 = 3
V2->V4 = inf
V3->V1 = 7
V3->V2 = 9
V3->V4 = 1
V4->V1 = 5
V4->V2 = 7
V4->V3 = 11,经由V2中转之后V4->V2->V3 = 10, 于是V4到V3的最短距离变化为10,更新路由矩阵R(4,3) = R(4,2) = 1。
- 于是现在的距离矩阵和路由矩阵可以变为:
同理,加下来进行V3中转和V4中转,由于过程类似,这里就不再赘述了,最后得到的矩阵应该是如下
这样我们就得到了最终的每两个点之间的最短距离和路线矩阵了?
- 这边给大家举个表示出路径的例子:
例如从V4->V3我们应该怎么走呢,从路径矩阵可以看到R(4,3)=1,也就是说4到3首先需要经过1作为中转点,那么加下来就是看1到3怎么走了,R(1,3)=2,从1到3需要经过2作为中转点,加下来再看2到3该怎么走,R(2,3)=3,说明2到3可以直接到达3,不需要中转
最后我们所得到的路径应该是:V4->V1->V2->V3
代码实现
我们通过代码会更好的理解算法的实现过程
% floyd.m% 采用floyd算法计算图a中每对顶点最短路% d是矩离矩阵% r是路由矩阵% a是初始化距离矩阵的值function [d,r]=floyd(a)n=size(a,1);%size(a,1)所计算的是a矩阵的列数% 初始化距离矩阵d=a;% 初始化路由矩阵for i=1:nfor j=1:nr(i,j)=j;end end r;% Floyd算法开始for k=1:nfor i=1:nfor j=1:nif d(i,k)+d(k,j)<d(i,j)d(i,j)=d(i,k)+d(k,j);r(i,j)=r(i,k);end end endend
路径打印代码实现十分简单,主要就是判断R(i,j)是否等于j,假如不等,则先打印中转点,然后判断R(k,j)是否等于j,等于直接打印出来就行,这里可以用一个while循环来重复判断
% DisplayPath.m 打印路径函数function DisplayPath(route, start, dest)% 打印出任意两点之间的最短路径 % route : 路由表 % start : 起点index% dest : 终点indexi = 1;while 1if(route(start, dest) ~= dest)fprintf('V%s -> ', num2str(start));start = route(start, dest);elsefprintf('V%s -> ', num2str(start));fprintf('V%s\n', num2str(dest));break;endend
注意:这边的function函数都应该另外用一个m文件写,并且文件名要和函数名一样,千万不要直接写在主函数里!
本文例子参考:最短路径-Floyd算法的matlab实现.md
从实例出发,让你一文实现Floyd算法相关推荐
- 实例讲解如何绕过 Office 文档的反分析技术
本文讲的是实例讲解如何绕过 Office 文档的反分析技术,今天我们来试着分析一个使用Word文档的恶意VBA项目.该文档的作者对文件中的VBA项目进行了密码保护,以防止对恶意代码的检查,同时也使用了 ...
- HihoCode1032 最长回文子串 manacher算法
求最长回文子串的算法比较经典的是manacher算法 转载自这里 首先,说明一下用到的数组和其他参数的含义: (1)p[i] : 以字符串中下标为的字符为中心的回文子串半径长度: 例如:abaa字符串 ...
- 一文了解贪心算法和回溯算法在前端中的应用
一文了解贪心算法和回溯算法在前端中的应用 一.贪心算法 1.贪心算法是什么? 2.应用场景 3.场景剖析:零钱兑换 二.回溯算法 1.回溯算法是什么? 2.什么问题适合选用回溯算法解决? 2.应用场景 ...
- 2020年文档相似性算法:初学者教程
作者|Masatoshi Nishimura 编译|VK 来源|Towards Data Science 如果你想知道2020年文档相似性任务的最佳算法,你来对了地方. 在33914篇<纽约时报 ...
- 一文掌握SPFA算法
一文掌握SPFA算法 何为SPFA(Shortest Path Faster Algorithm)算法: **给定一个加权连通图,选取一个顶点,称为起点,求取起点到其它所有顶点之间的最短距离,其显著特 ...
- 一文掌握Bellman-Ford算法
一文掌握Bellman-Ford算法 方法1:朴素版 Bellman-Ford算法思想 Bellman-Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向) ...
- 实例:近似点梯度法、 Nesterov 加速算法求解 LASSO 问题
实例:近似点梯度法. Nesterov 加速算法求解 LASSO 问题 实例:近似点梯度法. Nesterov 加速算法求解 LASSO 问题 考虑 LASSO 问题 构建 LASSO 优化问题 求解 ...
- 03 最短路 dijkstra算法spfa算法floyd算法(附带实例代码) 图论-1
文章目录 最短路 邻接表的图如下 邻接矩阵如下图 链表实现邻接表实现代码 单源最短路径 Dijkstra 算法 朴素版本 Dijkstra 实现代码 堆优化的dijkstra算法代码实现 Bellma ...
- 文档相似算法_2020年最佳文档相似性算法入门指南
文档相似算法 If you want to know the best algorithm on document similarity task in 2020, you've come to th ...
最新文章
- python判断远程文件是否存在
- 发表的原创文章还希望大家多提宝贵意见!
- 【网络安全】ollvm反混淆学习
- 关于real210开发板linux系统可能无法解析域名的问题解决方法
- ActiveMQ学习总结(8)——消息队列设计精要
- Freeview%20Play是什么
- 省市县乡村五级行政区域数据2021(国家统计局)
- win10 无法识别x64dbg 插件
- 抖音App四神算法分析
- 验证银行卡卡号是否符合规则
- Spectral matting
- 【ICML2021】 9篇RL论文作者汪昭然:构建“元宇宙”和理论基础,让深度强化学习从虚拟走进现实...
- 看完这篇AI算法和笔记,跟面试官扯皮没问题了 | 基于深度学习和传统算法的人体姿态估计
- 供应商质量工程师(SQE)是做什么的?
- 服务器上跑的很慢-已解决
- [研究方向]什么是深度学习?它到底有多火?
- 【Django | 开发】权限划分(行为数据集)集成钉钉消息(案例:面试招聘信息网站)
- VMware Cloud Foundry –见解
- PLECS的基本介绍
- 成都大数据语言培训:改变人们的生活的大数据趋势
热门文章
- 单片机控制舵机matlab仿真,单片机舵机控制程序教程及proteus仿真原理图
- 【CGAL+Python】安装CGAL的Python绑定
- “目前没有可用的登录服务器处理登录请求”解决方案
- 一个专科生学习JAVA目标月薪2万是否不切实际? 1
- 计算机信息系统集成高级工程师,2020系统集成项目管理工程师(高级系统集成项目管理工程师)...
- oracle怎样导入文件,oracle导入文本文件
- 编译内核模块出现 include/linux/autoconf.h or include/config/auto.conf are missing.解决方法
- READ-2204 FL-WBC Enhancing Robustness against Model Poisoning Attacks in Federated Learning
- SQL Server修改字段修改描述语句
- SuperMap三维专题之倾斜摄影——倾斜摄影数据介绍篇