【Matlab】根据图生成带权邻接矩阵,并求出最短路径

目录

  • 图的简介
  • 无向图(Graph)
    • 生成带权邻接矩阵
    • 求两点最短路径
  • 有向图(Digraph)
    • 生成带权邻接矩阵
    • 求最短路径

图的简介

图是拓扑学中的一个重要概念,分为无向图和有向图两种。图有两个重要属性,即点(Node)和边(Edge)。在图的概念中,我们只关心点和边的连接关系而并不关系他们在图中的相对位置。
由点和边连接的图中,将边赋予一定的权重,就可以将图转换为各种问题,例如TSP(旅行商)问题、(Shortest Path)最短路径问题。本文先介绍如何借助图以及赋予的边的权值生成带权邻接矩阵,再介绍利用图求两点之间最短路径的求法。

无向图(Graph)

生成带权邻接矩阵

先介绍根据以下无向图生成带权邻接矩阵的方法:
带权邻接矩阵
假设我们已经知道了每条边的权重(红色标定),该图中有11个点,如果挨个写出需要121个元素,对于此图已经非常繁琐。因此我给大家提供一种简单的方法,只需要写出图中标定权值的边即可达到目的。书写规则如下:
A→A:标定权值是0
若A→B没有路径可以到达,标定权值为0
若A→C有路径可以到达,根据建模需要标定权值
这样,我们在手动书写时,仅需要写出非0边的权重即可,每条边只需要书写一次,书写方式如下:

W=zeros(11);
W(1,2)=2;
W(1,4)=1;
W(1,3)=8;
W(2,3)=6;
W(2,5)=1;
W(3,4)=7;
W(3,5)=5;
W(3,6)=1;
W(3,7)=2;
W(4,7)=9;
W(5,6)=3;
W(5,8)=2;
W(5,9)=9;
W(6,7)=4;
W(6,9)=6;
W(7,9)=3;
W(7,10)=1;
W(8,9)=7;
W(8,11)=8;
W(9,10)=1;
W(9,11)=2;
W(10,11)=4;

由于本例中为无向图,因此生成的矩阵总满足W(i,j)=W(j,i),所以利用以下代码书写另一半:

n=size(W,1);
for i=1:nfor j=i:nW(j,i)=W(i,j);%次对角线分隔的下三角部分根据上三角部分对称end
end
G=graph(W,'upper');%根据带权邻接矩阵生成无向图
plot(G,'EdgeLabel',G.Edges.Weight)
title('标定权重的无向图')

自动绘图效果如下:
标定权重的无向图
带权邻接矩阵W如下:
带权邻接矩阵
(如果要将平时我们认为的不能到达的路径之间权重设定为Inf也很容易,不过在Matlab内置的函数shortestpath中,认为权重0即不设路径)

求两点最短路径

格式:[path,distance]=shortestpath(G,1,6)
path返回的是路径经过的点,distance是该路径的长度

例如在工作区输入:

>>[path,distance]=shortestpath(G,1,6)

显示如下:
在这里插入图片描述
对照我们绘制的无向图也很容易手动验证,最短路径即1→2→5→6,最短路径的距离=2+1+3=6。

有向图(Digraph)

生成带权邻接矩阵

有向图示例如下:
有向图示例
创建一个数组,每一列依次保存起始点,出发点,以及带权。按照和无向图同样的方法对每条边书写带权:

W=[1 2 10;1 4 10;1 8 1;2 3 10;2 7 1;3 4 10;3 6 1;4 5 1;5 6 12;5 8 12;6 7 12;7 8 12;];

用类似的方法生成有向图如下:

startpoints=W(:,1);%起始点集合
endpoints=W(:,2);%结束点集合
weights=W(:,3);%对应起始点和结束点的边权重
G=digraph(startpoints,endpoints,weights);%生成有向图
plot(G,'EdgeLabel',weights,'layout','force','Edgecolor','red')%画出有向图

效果如下:
在这里插入图片描述

求最短路径

在工作区求取最短路径格式如下:

格式:>> [path,distance]=shortestpath(G,s,t)

得到的结果如下:
结果
在此需要说明的和无向图的区别是,在这里我们只有起始点的点数比终点点数小才有路径,否则没有,因此如果按照如下条件调用,则会得到空集,利用这一个特点可以在程序中增加条件加以排除。
(if distance==Inf 或 if path==[])

>> [path,distance]=shortestpath(G,8,2)

在这里插入图片描述
希望本文对您有帮助,谢谢阅读

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

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

相关文章

阿里二面:为什么要分库分表?

在高并发系统当中,分库分表是必不可少的技术手段之一,同时也是BAT等大厂面试时,经常考的热门考题。你知道我们为什么要做分库分表吗?这个问题要从两条线说起:垂直方向 和 水平方向。1 垂直方向垂直方向主要针对的是业务…

Java 中 List 分片的 5 种方法!

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)前些天在实现 MyBatis 批量插入时遇到了一个问题,当批量插入的数据量比较大时,会导致程序执行报错&a…

Matlab仿真炮弹飞行轨迹——探究射弹参数对飞行轨迹的影响

目录1.分析炮弹受力2.设定参数并仿真3.通过仿真寻找最佳射弹速度3.1.射弹角度的影响3.2.射弹速率的影响3.3.炮弹属性和空气的影响3.3.1.空气阻力系数的影响3.3.2.炮弹质量的影响1.分析炮弹受力 假设炮弹在飞行过程中可以看成质点,运动时仅考虑初始速度、重力加速度…

50行代码,搞定敏感数据读写!

每天早上七点三十,准时推送干货一、介绍在实际的软件系统开发过程中,由于业务的需求,在代码层面实现数据的脱敏还是远远不够的,往往还需要在数据库层面针对某些关键性的敏感信息,例如:身份证号、银行卡号、…

【Python】导入资源管理器的文件列表(计算文件和文件夹大小)

文章目录1.按照扩展名进行分类2.导出文件的大小3.计算文件夹大小4.分类到字典5.完整代码及效果1.按照扩展名进行分类 使用Python查询一个路径下的所有文件可以借助glob模块以及os模块。 在导入文件列表之前,我们需要指定我们的操作目录,操作目录一经指定…

HashMap 中的一个“坑”!

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)最近公司新来了一个小伙伴,问了磊哥一个比较“奇怪”的问题,这个问题本身的难度并不大,但…

【Python】交互式界面创建函数

文章目录简介规则思路示例代码与运行效果简介 运行Python时,在程序运行过程中手动输入一个函数表达式,并将其作为一个函数进行后续的调用工作,类似于Matlab里面的匿名函数。这个功能使用传统语言会相当麻烦,当然,我也…

原生 js前端路由系统实现3之代码 构建工具 和 querystring功能

为什么80%的码农都做不了架构师?>>> 构建 目前前端构建工具流行的是 grunk.js 功能是大而全,但往往大而全的东西为了多样性 需要做额外的配置 我还是想要有一个专门为自己特性项目而生构建工具 我不想加载第三方的node模块,也不…

单例模式,真不简单

前言单例模式无论在我们面试,还是日常工作中,都会面对的问题。但很多单例模式的细节,值得我们深入探索一下。这篇文章透过单例模式,串联了多方面基础知识,非常值得一读。1 什么是单例模式?单例模式是一种非…

【python】最优化方法之一维搜索(黄金分割法+斐波那契法)

文章目录1.概念2.遍历搜索3.优化算法3.1.一维搜索原则3.2.黄金分割法Code Block3.3.斐波拉契法Code Block1.概念 \qquad一维搜索是最优化方法最简单的一种,即求一个在(a,b)内,连续下单峰函数f(x)f(x)f(x)的极小值。所谓下单峰函数就是只有一个极小值的函…

MySQL系列之E-1------MySQL主从复制原理

主从复制是异步复制,可以通过google的一个插件实现半同步E.1 主从复制原理1、建立主从复制的用户名和密码2、将master上主库需要进行复制的库“锁库”3、通过mysqldump备份master上主库,“解锁“,在slave端进行恢复4、更改配置文件5、在丛库上执行change…

工作中常用的 6 种设计模式!

前言 哈喽,大家好。平时我们写代码呢,多数情况都是流水线式写代码,基本就可以实现业务逻辑了。如何在写代码中找到乐趣呢,我觉得,最好的方式就是:使用设计模式优化自己的业务代码。今天跟大家聊聊日常工作中…

【Matlab/C/Python/VB/...】代码复制到word时如何变成彩色的

文章目录下载Notepad复制代码在Notepad粘贴在word中粘贴下载Notepad Notepad是一款免费的Windows软件,一般Windows10和Windows7系统都已经自带,也可以在应用商店直接搜索下载 「win10系统兼容的是7.8版本」 复制代码 在语言编辑乱码复制代码&#xff…

hadoop 2.5.0安装和配置

安装hadoop要先做以下准备: 1.jdk,安装教程在 http://www.cnblogs.com/stardjyeah/p/4640917.html 2.ssh无密码验证,配置教程在 http://www.cnblogs.com/stardjyeah/p/4641524.html 3.linux静态ip配置,教程在 http://www.cnblo…

基于双线性插值的图像旋转原理及MATLAB实现(非自带函数)

目录1.图像旋转的原理1.1.旋转矩阵1.2.双线性插值1.3.像素点匹配2.实现效果与说明1.图像旋转的原理 1.1.旋转矩阵 旋转一幅图像(假设这幅图像大小是矩形的),当然应该从像素点(pixels)开始,在直角坐标系中…

漫画:给女朋友介绍什么是 “元宇宙” ?

什么是更高的自由度呢?或许有人觉得,我们在网络游戏当中,不是也很自由吗?想怎么玩就怎么玩。但是,无论一款网络游戏的元素有多么丰富,游戏当中的角色、任务、职业、道具、场景,都是游戏设计师预…

MyBatis 中为什么不建议使用 where 1=1?

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)最近接手了一个老项目,“愉悦的心情”自然无以言表,做开发的朋友都懂,这里就不多说了&am…

【openMV与机器视觉】四旋翼飞行控制背景下的PID控制与摄像头算法简介

文章目录声明1.四旋翼飞行控制简介2.飞行控制算法2.1.接收机PWM生成2.2.PID算法位置PID速度PID3.摄像头算法3.1.图像处理3.2.霍夫曼变换3.3.巡线算法3.3.寻找目标点降落算法声明 \qquad本文的算法在openMV IDE例程的基础上进行原创,在比赛结束后予以发表&#xff1b…

聊聊sql优化的15个小技巧

前言sql优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。如果某天你负责的某个线上接口,出现了性能问题,需要做优化。那么你首先想到的很有可能是优化sql语句,因为它的改造…

【MATLAB】Parzen窗与K近邻算法原理与代码详解

文章目录1.非参数估计原理2.Parzen窗2.1.算法原理2.2.Matlab实现与参数探究3.K近邻3.1.算法原理3.2.Matlab实现与参数探究1.非参数估计原理 \qquad已知一个样本的概率分布时,我们只需要对概率分布中的参数进行估计即可得到该样本的概率密度函数。例如已知样本X服从正…