美赛BOOM数学建模2-3最小生成树

注明:本文根据数学建模BOOM网课简单整理,自用

❑ 模型简介

❑ 什么是树

连通无环路的无向图称为树

图G1为树

图G2不是树,因为不连通。连通是指任意两点间都存在路径,而这图中顶点1无法到达顶点6

图G3不是树,因为存在环路。环路是指可经过一段不重复的路径回到顶点本身。

❑ 简单例子

• 张三承包了一个项目,要给6个岛屿铺设海底电缆,使其相互之间能够通信

• 由于地理因素限制,仅有固定的几条线路可以选择,每条线路的铺设费用如图所示

• 请制定计划,实现所有岛屿之间能够通信,且铺设电缆的总费用最低

• 生成树:连通图的一个子图,且是一个树,并且包含图的所有顶点

• 最小生成树:所有生成树中,边的权值之和最小的生成树

• 一个图,可能有多个生成树

• 一个图的所有生成树中,可能有多个最小生成树(有些边长权值相等)

❑ 适用赛题

❑ 通信建设、管道铺设规划

• 已知有X个城市,其相互之间的路径距离已知

• 要求以最小的成本建设通信线路或铺设管道,使得城市之间能够相互连通

• 对应图论,重点在于所有顶点两两之间都存在路径(连通),且总路径(权重之和)最小

❑ 基本特点

• 最小生成树是一个连通图,即任意两点间都存在相互到达的路径

最小生成树是从全局角度考虑,使两两之间连通且总路径最短,没有起点和终点的概念

最短路径是针对指定源点(起点)和指定终点,求两点间最短路径

• 究竟是考虑全局最短,还是指定的起点与终点最短,是两者的根本区别

• (此外图论还有还有连通、强连通、极小连通子图、顶点与生成树个数关系等等概念,属于

数据结构的内容,在此不多讲)

典型例题与原理讲解

❑Prim算法

❑ 以简单例子讲解Prim算法

• 始终围绕顶点来操作

基本思路:随便从某顶点开始,不断将权值最小的直接相连的边及相连顶点添加到树中

• 适合边多点少的图

❑Kruskal算法

• 始终围绕边来操作

基本思路先构造只有顶点的图,按权重对所有边排序(升序),不断将不构成回路的边添加到树中

• 适合点多边少的图(与prim算法得出结果相同)

❑ 架设通信线路

• 一个乡镇有9个村,其间道路与道路长度如图所示,边上标的权重代表距离

• 要在村之间架设通信线路,如何拉线才能使总用线最短?

❑ 题目分析

• 通信线路需要连通所有村任意两个顶点间,一定存在可以互相到达的路径

• 总用线最短:权值之和最小

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

代码求解

❑ MATLAB的minspantree函数

• 官方讲解: https://ww2.mathworks.cn/help/matlab/ref/graph.minspantree.html?searchHighlight=minspantree&_tid=srchtitle_minspantree_1#d123e515429

• 求得的最小生成树就是图中红线部分

• 按最小生成树架设通信线路可使总用线最短,最短为13

❑ 注意事项

• 代码求解很简单,写出邻接矩阵,调用函数即可

• 对于做数模来说已经足够了

• 本期课程未讲解Prim算法和Kruskal算法实际代码实现(可以自行百度,能搜到很多现成的)

❑ matlab代码

clc,clear
% matlab中,不存在的边设置成0
% 9个顶点,初始化定义9x9的全零矩阵作为邻接矩阵
a = zeros(9);

% 注意,最小生成树是针对无向图的,每条边权重只需要设一次。1到2和2到1是同一条边
% 因此,可仅使用邻接矩阵的上三角矩阵来构造图G
a(1,[2:9])=[2 1 3 4 4 2 5 4];       % 顶点1到其他顶点的边的权重
a(2,[3 9])=[4 1];   % 顶点2到顶点3、顶点9的边的权重
a(3,4)=1;       % 同上。因为写过1到3,和2到3的边的权重,无需重复设
a(4,5)=1;       
a(5,6)=5;
a(6,7)=2; 
a(7,8)=3; 
a(8,9)=5;

% cellstr和graph在最短路径课程中讲过
s=cellstr(strcat('v',int2str([1:9]')));
G=graph(a,s,'upper');  % upper表示仅使用 A 的上三角矩阵来构造图G。
p=plot(G,'EdgeLabel',G.Edges.Weight);   % 绘制出图G

% minspantree函数求解最小生成树
% T=minspantree(G)是默认使用Prim算法
T=minspantree(G,'Method','sparse');      % method选择sparse表示指定使用Kruskal算法

L = sum(T.Edges.Weight)     % 对最小生成树的边的权重求和
highlight(p,T,"EdgeColor","red",'LineWidth',2.5)

猜你喜欢

转载自blog.csdn.net/yangxo2002/article/details/128678460
今日推荐