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