当前位置: 首页 > news >正文

【数学建模】用Matlab玩转图论:从画图到求最短路径

文章目录

    • 先画个带权重的图:从数据到图形的转化
    • 给节点加字符串标签:让图“说人话”
    • 邻接矩阵和图的转换:矩阵与图形的“互译”
    • 用Dijkstra算法求最短路径:从“试错”到“一键计算”
    • 有向图也能搞定:带箭头的“单向路”

平时处理图论问题时,Matlab是个好帮手——既能直观画出图形,又能快速计算路径。不管是学生做课程设计,还是工程师分析网络结构,这些技巧都能用得上。今天就用简单例子,带你一步步解锁Matlab的图论功能。

先画个带权重的图:从数据到图形的转化

图论里的“图”由节点和边组成,边的权重可以表示距离、成本或时间。用Matlab画图,第一步是把这些关系变成数据。比如我们有14条边,先列出起点s、终点t和对应的权重w

s = [1 1 2 2 8 8 3 9 3 3 7 4 4 6];  % 起点列表(编号+1是为了避开0,符合Matlab索引习惯)
t = [2 8 8 3 9 7 9 7 4 6 6 6 5 5];  % 终点列表
w = [4 8 3 8 1 6 2 6 7 4 2 14 9 10];% 权重数据

有了数据,用graph(s,t,w)就能生成图对象G,这一步相当于告诉Matlab“这些节点和边要关联起来”。绘图时加几个参数让图更清晰:'EdgeLabel'显示权重,'linewidth'加粗线条,再用set去掉坐标轴数字,避免干扰视线。

画出来的图就像一张清晰的地图,每条边的“成本”一目了然,比如节点1到2要走4单位,1到8要走8单位,一眼就能看清:

给节点加字符串标签:让图“说人话”

默认节点是数字1、2、3……但实际场景里,节点可能代表城市、设备或网站。这时把数字换成字符串标签,图会更易懂。比如用A-I代表9个节点,只需在绘图时加个参数:

plot(G, 'EdgeLabel', G.Edges.Weight, 'NodeLabel', {'A','B','C','D','E','F','G','H','I'});

瞬间,节点就从冰冷的数字变成了直观的字母,比如A到B对应原来的1到2,分析时不用反复对照数字表,效率高多了:

邻接矩阵和图的转换:矩阵与图形的“互译”

有时候数据是用邻接矩阵给的——一个n×n的矩阵,A(i,j)表示节点i到j的权重(0或无穷大表示没有边)。但拿到的矩阵可能不完整,比如只填了上三角部分,这时候用A = A + A'就能补全下三角,让矩阵对称。

另外,节点自己到自己的权重通常是0,要是矩阵对角线有其他值,用A(logical(eye(size(A)))) = 0一键修正。改好后,graph(A)直接转成图对象,轻松画出矩阵对应的图形:

用Dijkstra算法求最短路径:从“试错”到“一键计算”

求两点间的最短路径,手动算容易出错,尤其节点多的时候。Matlab的shortestpath函数直接调用Dijkstra算法,比如算从节点1到4的最短路径:

[P,d] = shortestpath(G, 1, 4);  % P是路径节点,d是总距离

运行后,P会返回具体路径(比如1→2→8→9→3→6→5),d给出总距离。更方便的是,结果会自动在图上高亮显示,哪条路最短一眼看穿:

有向图也能搞定:带箭头的“单向路”

如果边有方向(比如水流方向、数据传输方向),就用digraph替代graph

G = digraph(s,t,w);  % 有向图对象

画出来的边会带箭头,清晰区分“从A到B”和“从B到A”是不是同一条路。比如在网络拓扑中,这能直观展示数据的发送和接收方向:

从数据整理到图形展示,再到路径计算,Matlab把图论问题变得简单直观。不管是做学术研究还是实际项目,这些技巧都能帮你快速理清节点关系,找到最优解。试着用自己的数据改改代码,很快就能上手啦~

http://www.dtcms.com/a/366766.html

相关文章:

  • 想要给文档加密?2025年顶尖文件加密软件分享
  • C++并发编程-23. 线程间切分任务的方法
  • uniapp vue页面传参到webview.nvue页面的html或者另一vue中
  • Web应用:返回图片URL
  • Python快速入门专业版(一):Windows/macOS/Linux 系统环境搭建(附常见报错解决)
  • 【连接器专题】案例:带屏蔽膜FPC出现概率性短路,真是供应商的锅?
  • EasyVoice与cpolar:构建私域有声平台的本地化方案
  • Spring线程池ThreadPoolTaskExecutor‌详解
  • 隔空盗刷、AI钓鱼、代理劫持…金融黑产竟进化至此?
  • Elasticsearch 8 中 Nested 数据类型的使用方法
  • 【iOS】 懒加载
  • 一文吃透 CSS 伪类:从「鼠标悬停」到「斑马纹表格」的 30 个实战场景
  • 中值滤波、方框滤波、高斯滤波、均值滤波、膨胀、腐蚀、开运算、闭运算
  • HTML图片标签及路径详解
  • Python开篇撬动未来的万能钥匙 从入门到架构的全链路指南
  • 工厂模式总结
  • C++知识
  • C 盘清理技巧分享:释放磁盘空间,提升系统性能
  • 将 PDF 转换为 TIFF 图片:简单有效的 Java 教程
  • 数据传输,数据解析与写数据库
  • django全国小米su7的行情查询系统(代码+数据库+LW)
  • 阿瓦隆 A15 Pro 221TH/S:SHA-256 算力与高效能耗
  • 大模型部署全攻略:Docker+FastAPI+Nginx搭建高可用AI服务
  • Linux 编译 Android 版 QGroundControl 软件并运行到手机上
  • 一天涨幅2000倍的期权有吗?
  • (JVM)四种垃圾回收算法
  • ArcGIS学习-15 实战-建设用地适宜性评价
  • Node.js轻松生成动态二维码
  • Windows+Docker一键部署CozeStudio私有化,保姆级
  • 【Docker】P1 前言:容器化技术发展之路