图论最短路径问题与matlab实现
上一次我们讨论了如何进行图论可视化,这一次我们通过matlab来找出图论中距离最小路径
一、迪杰斯特拉算法(Dijkstra)
迪杰斯特拉算法是由荷兰计算机科学家在1956年发现的算法,此算法使用类似广度优先搜索的方法解决了带权图的单源最短路径问题。它是一个贪心算法。
核心思想:罗列出一个表,其行标题代表着(1)是否经历过(2)距离初始点的距离(3)父节点;列标题则为每个节点的标号
通过不断更新距离和父节点,用贪心算法的思想找到路径最短点
除了迪杰斯特拉算法外,比较著名的找最短路径的方法还有Floyd(弗洛伊德)算法,Bellman‐Ford(贝尔曼‐福特)算法。。
其中,贝尔曼‐福特算法不再将节点区分为是否已访问的状态,因为贝尔曼‐福特模型是利用循环来进行更新权重的,且每循环一次,贝尔曼福特算法都会更新所有的节点的信息。因此,后者解决了迪杰斯特拉算法无法处理但不能处理负权重的问题。
但是他们都解决不了负权回路的图
二、shortestpath函数用法
matlab中提供了上面三种算法的函数包,现在我们来介绍一下这个函数的语法
1.基本语法
2.参数设计
3.应用实例
(1)输入图论信息
信息的输入在上一讲已经详细叙述过,基本思想是将信息用graph函数储存的一个G中。这时G作为一个数据结构,可以用Plot画图,shortestpath寻优
(2)输入参数进行求解
此处,我们需要寻找节点9到节点4的最短路径
[P,d] = shortestpath(G, 9, 4)
得到的P是一个向量,表示节点9到节点4所经历的所有节点
得到的d是一个数,表示从9到4的所经历的距离
(3)最短路径可视化
首先将图赋给一个变量,此时的myplot即为一个包含着图论信息的一个数据结构,之后可以通过对这个数据结构进行处理
之后用Highlight函数对这个变量进行高亮处理(给边加上r红色),P为得到的路径点。而后面的参数则表示对图的边进行红色高亮处理。效果如图所示
三、distances函数————求出任意两点的最短路径矩阵
对于已经储存的图论信息的变量G来说,matlab中的distance函数可以输出其任意两点的最短路径矩阵
用法:D = distances(G)
效果:
另外,我们可以直接通过D(i,j)
,找到节点i到节点j的距离,他返回值不像矩阵一样返回的是第i行第j列的元素
四、nearest函数————找出给定范围内的所有点
nearest函数可以返回图形 G 中与节点 s 的距离在 d 之内的所有节点
[nodeIDs,dist] = nearest(G, 2, 10)
nodeIDs返回的是与节点2距离小于等于10的所有节点,是一个节点向量
而dist是一个向量,对应着节点2与每一个nodeIDs节点的距离
图论最短路径问题与matlab实现的更多相关文章
- 图论-最短路径<Dijkstra,Floyd>
昨天: 图论-概念与记录图的方法 以上是昨天的Blog,有需要者请先阅读完以上再阅读今天的Blog. 可能今天的有点乱,好好理理,认真看完相信你会懂得 分割线 第二天 引子:昨天我们简单讲了讲图的概念 ...
- 第16次CCF CSP认证-第5题-317 号子任务(subtask317)-图论最短路径
[题目背景]“你在平原上走着走着,突然迎面遇到一堵墙,这墙向上无限高,向下无限深,向左无限远,向右无限远,这墙是什么?”——<流浪地球>原著我们带着地球去流浪了,为了处理流浪过程中可能会发 ...
- 图论最短路径算法总结(Bellman-Ford + SPFA + DAGSP + Dijkstra + Floyd-Warshall)
这里感谢百度文库,百度百科,维基百科,还有算法导论的作者以及他的小伙伴们...... 最短路是现实生活中很常见的一个问题,之前练习了很多BFS的题目,BFS可以暴力解决很多最短路的问题,但是他有一定的 ...
- 图论——最短路径 Dijkstra算法、Floyd算法
1.弗洛伊德算法(Floyd) 弗洛伊算法核心就是三重循环,M [ j ] [ k ] 表示从 j 到 k 的路径,而 i 表示当前 j 到 k 可以借助的点:红色部分表示,如果 j 到 i ,i 到 ...
- 图论-最短路径--3、SPFA算法O(kE)
SPFA算法O(kE) 主要思想是: 初始时将起点加入队列.每次从队列中取出一个元素,并对所有与它相邻的点进行修改,若某个相邻的点修改成功,则将其入队.直到队列为空时算法结束. 这个算 ...
- 图论-最短路径 2.Dijkstra算法O (N2)
2.Dijkstra算法O (N2) 用来计算从一个点到其他所有点的最短路径的算法,是一种单源最短路径算法.也就是说,只能计算起点只有一个的情况. Dijkstra的时间复杂度是O (N2),它不能处 ...
- 图论最短路径算法——Dijkstra
说实在的,这算法很简单,很简单,很简单--因为它是贪心的,而且码量也小,常数比起SPFA也小. 主要思想 先初始化,dis[起点]=0,其它皆为无限大. 还要有一个bz数组,bz[i]表示i是否确定为 ...
- [图论]最短路径问题 :Floyed-Warshall
最短路径问题 目录 最短路径问题 Description Input Output Sample Input Sample Output 解析 了解Floyed算法 Floyed算法的核心思想: 代码 ...
- 图论最短路径算法——SPFA
为了不要让太多人被害,我还是说一下这种算法,它实际上很简单,但被人讲着讲着绕晕了. 主要思想 有人说,SPFA是Bellman-Ford的队列优化.这个算法我也懂了,但是还没试过.我不管是什么算法的优 ...
- 图论-最短路径 floyd/dijkstra-Find the City With the Smallest Number of Neighbors at a Threshold Distance
2020-01-30 22:22:58 问题描述: 问题求解: 解法一:floyd 这个题目一看就是floyd解最合适,因为是要求多源最短路,floyd算法是最合适的,时间复杂度为O(n ^ 3). ...
随机推荐
- java的jdbc插入的时候,遇到null情况报错问题
分析原因: 在执行SQL时MyBatis会自动通过对象中的属性给SQL中参数赋值,它会自动将Java类型转换成数据库的类型.而一旦传入的是null它就无法准确判断这个类型应该是什么,就有可能将类型转换 ...
- UE4 绘制Gizmo
Unity的Gizmos可以很方便的在编辑器下进行调试,Unreal中也有一些办法可以达到效果. 本文主要参考:https://zhuanlan.zhihu.com/p/363625037,进行了一些 ...
- jpype-python调用java的方法
环境准备: 部署环境准备: sed -i.ori '$a export JAVA_HOME=/opt/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bi ...
- 关于EF Core 更新速度随时间越来越慢的解决办法
关于EF Core更新速度随时间越来越慢的解决办法 概要 本篇主要介绍使用 context.ChangeTracker.Clear() 方法,在通过循环进行批量更新时,通过手动清除跟踪实体以提高性能的 ...
- Unicode 14 标准发布
本文为翻译,原文地址Unicode 博客: 宣布 Unicode 标准, 版本 14.0 Unicode 标准版本 14.0 现已可用,包括核心规范.附件和数据文件.此版本增加了 838 个字符,总共 ...
- AI实战 | 手把手带你打造校园生活助手
大家好,我是努力的小雨.最近,我开始将我的经验逐渐分享到B站,希望能够帮助大家通过扣子助手真正解决一些问题.最近有粉丝提出了一个需求,为了满足大家的期待,我已经制作了视频,详细介绍了这个助手的搭建思路 ...
- itest(爱测试)开源接口测试&敏捷测试&极简项目管理 8.0.0 发布,测试重大升级
(一)itest 简介及更新说明 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试,接口Mock 6合1,又有丰富的统计分析.可按测试包 ...
- java检测当前CPU负载状态的方法
1.java检测当前CPU负载状态 在Java中,直接检测CPU负载状态并不像在操作系统命令行中那样简单,因为Java标准库并没有直接提供这样的功能.但是,我们可以通过几种方法间接地获取CPU负载信息 ...
- Lru在Rust中的实现, 源码解析
LRU(Least Recently Used)是一种常用的页面置换算法,其核心思想是选择最近最久未使用的页面予以淘汰. LRU算法原理 基本思想:LRU算法基于一个假设,即如果一个数据在最近一段时间 ...
- 一款.NET开源、免费、实用的多功能原神工具箱(改善桌面端玩家的游戏体验)
前言 今天大姚给大家分享一款.NET开源(MIT License).免费.实用的多功能原神工具箱,旨在改善桌面端玩家的游戏体验:胡桃工具箱. 工具箱介绍 胡桃工具箱是一款.NET开源(MIT Lice ...