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

发布于:2025-09-05 ⋅ 阅读:(17) ⋅ 点赞:(0)

平时处理图论问题时,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把图论问题变得简单直观。不管是做学术研究还是实际项目,这些技巧都能帮你快速理清节点关系,找到最优解。试着用自己的数据改改代码,很快就能上手啦~


网站公告

今日签到

点亮在社区的每一天
去签到