用MATLAB求最短路径(graphshortestpath)和求最小生成树(minspantree),代码演示

求最短路径(graphshortestpath),求最小生成树(minspantree)

文章目录

1、最短路径问题

最短路径:从图中的某个顶点出发,到达另外一个顶点的所经过的边的权重之和最小的一条路径。

  • 图:边和节点组成的结构,在数学建模中例如本题中道路和城市。
  • 边:带有方向的是有向图,否则为无向图。
  • 权重:每条边都有与之对应的值,本题中边道路,边的权重就是道路长度,当然是越小越好。

MATLAB求解最短路径:**Dijkstra算法,或MATLAB的 graphshortestpath**函数

例:

matlab 复制代码
%sparse生成稀疏矩阵,也就是除了注明的几个元素外,其余都是0
%spare里第一个和第二个矩阵相同位置的元素值就是非零元素的索引
%非零元素的值
%w是每条边的权值
w=[10,5,2,1,4,6,7,3,9,2]
DG = sparse([1,1,2,2,3,4,4,5,5,5],[2,5,5,3,4,3,1,2,3,4],w)
% 没有就默认为零,这样快速生成一个稀疏矩阵

生成

matlab 复制代码
% dist是最短路径的值, path是最短路径的节点顺序
% pred是到每一个节点的最短路径的终点前一个节点
% 如果求节点1到其他所有节点的最短路径呢?
[dist,path,pred] = graphshortestpath(DG,1,3)  %后面的数字参数是起点和终点,然后计算最短路径

显示

matlab 复制代码
% biograph生成图对象; view显示该图
point_name =["城市1", "城市2", "城市3","城市4", "城市5"]
h = view(biograph(DG,point_name, 'Showweights', 'on'))

优化

matlab 复制代码
% 将最短路径的节点和边缘标记为红色并增加线宽
% getedgesbynodeid得到图h的指定边的句柄
% 第一个参数是图,第二个是边的出点,第三个是边的入点%句柄确保能找到对应的东西
% get查询图的属性,h.Nodes(path), 'ID'得到图h中最短路径的
% set函数设置图形属性
edges = getedgesbynodeid(h,get(h.Nodes(path),'ID')); %选取最短路径,并找到ID 
set(edges,'LineColor', [1 0 0])% RGB数值,红绿蓝
set(edges,'Linewidth',2)

最终结果:

2、最小生成树

  • 最短路径的区别:最短路径是针对某一顶点 作为起点 而言的,最小生成树是所有顶点连通总路径最小

  • 最小生成树的求解:

    MATLAB的minspantree函数求解最小生成树,还有克鲁斯卡尔(Kruskal)算法,和普利姆(Prim)算法。

minspantree函数演示:

matlab 复制代码
s = [1,1,2,2,3,3,4,4,4,5];
t = [2,3,4,5,4,7,5,6,7,6];
weights = [50,60,65,40,52,45,50,30,42,70];
%生成无向图,其中s和t对应元素代表着边,weights是权值
G= graph(s,t,weights);
%求出最小生成树,得到的T包含最小生成树的节点和对应边的权
T= minspantree(G);

% p = plot(G)就能把图片展现出来,后面是为了美观设置字体等
p = plot(G, 'EdgeLabel ',G.Edges.weight,"MarkerSize",8,'NodeFontSize',16,'EdgeFontSize',16)

%highlight突出显示绘制的图中的节点和边
highlight(p,T,'EdgeColor','red',"Linewidth",3)  

在上述的代码中,T里面存的就是最小的生成树,而后续的操作只是为了更加的美观。

运行结果:

相关推荐
future14121 小时前
C#学习日记
开发语言·学习·c#
king_harry1 小时前
Java程序-OceanBase Connector/J 示例
开发语言
傻啦嘿哟2 小时前
Python 办公实战:用 python-docx 自动生成 Word 文档
开发语言·c#
翻滚吧键盘2 小时前
js代码09
开发语言·javascript·ecmascript
FF-Studio2 小时前
【硬核数学 · LLM篇】3.1 Transformer之心:自注意力机制的线性代数解构《从零构建机器学习、深度学习到LLM的数学认知》
人工智能·pytorch·深度学习·线性代数·机器学习·数学建模·transformer
q567315232 小时前
R语言初学者爬虫简单模板
开发语言·爬虫·r语言·iphone
rzl023 小时前
java web5(黑马)
java·开发语言·前端
时序数据说3 小时前
为什么时序数据库IoTDB选择Java作为开发语言
java·大数据·开发语言·数据库·物联网·时序数据库·iotdb
jingling5553 小时前
面试版-前端开发核心知识
开发语言·前端·javascript·vue.js·面试·前端框架
m0_687399843 小时前
写一个Ununtu C++ 程序,调用ffmpeg API, 来判断一个数字电影的视频文件mxf 是不是Jpeg2000?
开发语言·c++·ffmpeg