Meisai BOOM 数理モデリング 2-3 最小全域木

注: この記事は、個人利用を目的として、数理モデリング BOOM オンライン コースに従って単純に構成されています。

❑ モデルの紹介

❑ 木とは何ですか

サイクルを持たずに接続された無向グラフをツリーと呼びます。

グラフ G1 はツリーです

•グラフ G2 は接続されていないため、ツリーではありません接続性とは、任意の 2 点間にパスがあり、このグラフの頂点 1 が頂点 6 に到達できないことを意味します。

グラフ G3 はサイクルがあるためツリーではありません。サイクルは、頂点自体に戻る非反復パスです。

❑ 簡単な例

• 張三は6つの島に海底ケーブルを敷設し、島同士が通信できるようにするプロジェクトを契約した。

• 地理的制約のため、少数の固定回線のみを選択でき、各回線の敷設コストは図に示されています。

• ケーブル敷設の総コストを最小限に抑えて、すべての島間の通信を可能にする計画を立てます。

• スパニング ツリー: 接続されたグラフのサブグラフ。ツリーであり、グラフのすべての頂点が含まれます。

• 最小スパニング ツリー: すべてのスパニング ツリーの中で、エッジの重みの合計が最小のスパニング ツリー。

• 複数のスパニング ツリーを含むグラフ

• グラフのすべてのスパニング ツリーには、複数の最小スパニング ツリーが存在する場合があります (一部の辺の長さは同じ重みを持ちます)。

❑ 該当するコンテストの質問

❑ 通信工事およびパイプライン敷設の計画

• 相互間の経路距離が既知の既知の X 都市

• 都市間を接続するための通信回線の建設やパイプラインの敷設に最小限のコストが必要

• グラフ理論に対応し、重要な点は、すべての頂点間にパスが(接続されて)存在し、パスの合計 (重みの合計) が最小になることです。

❑ 基本機能

• 最小スパニング ツリーは接続されたグラフです。つまり、任意の 2 点間に相互到達パスが存在します。

最小スパニングツリーは、始点と終点の概念を持たず、両者が接続され、合計のパスが最短になるようにグローバルな観点から考慮されます。

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

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

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

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

典型例题与原理讲解

❑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