建议先看上一篇基本概念篇 https://blog.csdn.net/weixin_45755332/article/details/106899147

最小生成树

基本概念和方法

树:没有圈的连通图
图一是,图二有圈,图三灭有连通

生成子图:对于无向图 G =(V,E) ,保留G的所有点,而删掉G的边或者保留部分 G 的边,所获得的图称为 G 的生成子图。
如左图去了那两条边,剩下的那个图就是生成子图

生成树:若图 G 的一个生成子图是一个树,则称这个生成子图为生成树。上面右图就是一个最小生成树

最小生成树问题:在一个赋权的连通的无向图 G 中找出一个生成树,并使得这个生成树的所有边的权数之和为最小。

最小生成树的常用方法:

  1. 破圈法:任取一圈,去掉圈中最长边,直到无圈。
  • 把这些圈的权值最大的去掉,剩下的那个生成树就是最小生成树
  • 注:当一个圈中有多个相同的最长边时,不能同时都去掉,只能去掉其中任意一 条边。最小生成树有可能不唯一,但最小生成树的长度相同



2. 加边法(避圈法):2.加边法(避圈法) :取图G的n个孤立点{v1,v2,…, vn}作为一个支撑图,从最短边开始往支撑图中添加,见圈回避,直到连通(有n-1条边)

  • 开始是六个顶点,然后根据那张赋权图,按权值从小到大的顺序来进行连接


连接完第四条线时,v1→v2和v3→v6权值都是5,但v1→v2连接的话就是圈了,所以只能是v3→v6

  1. prim算法构造最小生成树:
    设置两个集合P和Q,其中P用于存放的最小生成树G中的顶点,集合Q存放的最小生成树G中的边。令集合P的初值为 P=v1P={v_1}P=v1​ (假设构造最小生成树时从顶点v1v_1v1​ 出发),集合Q的初值为Q=θQ=\thetaQ=θ 。
    prim算法的思想是,从所有 p∈P,v∈V−Pp\in P,v \in V-Pp∈P,v∈V−P ,的边中,选取具有最小权值的边 pv ,将顶点v加入集合P中,将边pv加入集合Q中,如此不断重复,直到 P=V 时,最小生成树构造完毕,这时集合Q中包含了最小生成树的所有边。

下面用代码来解下面最小生成树
用result 3*n 的第一、二、三行分别表示生成树边的起点、终点、权集合。

clc;clear;
a=zeros(7);
a(1,2)=50; a(1,3)=60;
a(2,4)=65; a(2,5)=40;
a(3,4)=52;a(3,7)=45;
a(4,5)=50; a(4,6)=30;a(4,7)=42;
a(5,6)=70;
a=a+a';a(a==0)=inf;
result=[];p=1;tb=2:length(a);
while size(result,2)~=length(a)-1temp=a(p,tb);temp=temp(:);d=min(temp);[jb,kb]=find(a(p,tb)==d,1); %找第1个最小值j=p(jb);k=tb(kb);result=[result,[j;k;d]];p=[p,k];tb(find(tb==k))=[];
end
resultresult =1     2     5     4     4     72     5     4     6     7     350    40    50    30    42    45

下面用避圈算法的MATLAB程序计算上题,结果一样

clc;clear;
a(1,[2,3])=[50,60]; a(2,[4,5])=[65,40]; %这里给出邻接矩阵的另外一种输入方式
a(3,[4,7])=[52,45]; a(4,[5,6])=[50,30];
a(4,7)=42; a(5,6)=70;
[i,j,b]=find(a);
data=[i';j';b'];index=data(1:2,:);
loop=length(a)-1;
result=[];
while length(result)<looptemp=min(data(3,:));flag=find(data(3,:)==temp);flag=flag(1);v1=index(1,flag);v2=index(2,flag);if v1~=v2result=[result,data(:,flag)];endindex(find(index==v2))=v1;data(:,flag)=[];index(:,flag)=[];
end
resultresult =4     2     4     3     1     46     5     7     7     2     530    40    42    45    50    50

某大学准备对其所属的7各学院办公室计算机联网,这个网络的可能联通的途径如图11- -14所示,图中V1,——,V7表示7个学院办公室,图中的边为可能联网的途径,边上所赋的权数为这条路线的长度,单位为百米。请设计一个网络能联通7个学院办公室,并使总的线路长度为最短。

:这是一个最小生成树问题,不是最短路问题,因为他所有的都要连接上。

clc;clear;
a=zeros(7);
a(1,7)=3; a(1,6)=10;
a(2,7)=3; a(2,3)=1;
a(3,4)=7; a(3,5)=2;a(3,7)=4;
a(4,5)=8;
a(5,6)=4; a(5,7)=5;
a(6,7)=3;
a=a+a';a(a==0)=inf;
result=[];p=1;tb=2:length(a);
while size(result,2)~=length(a)-1temp=a(p,tb);temp=temp(:);d=min(temp);[jb,kb]=find(a(p,tb)==d,1); %找第1个最小值j=p(jb);k=tb(kb);result=[result,[j;k;d]];p=[p,k];tb(find(tb==k))=[ ];
end
resultresult =1     7     2     3     7     37     2     3     5     6     43     3     1     2     3     7

最大流问题

基本概念

最大流问题(maximum flow problem),一种组合最优化问题,就是要讨论如何充分利用装置的能力,使得运输的流量最大,以取得最好的效果。
如图所示的网络图中定义了一个发点v1,定义了一个收点v7,其余点v2,v3,…,v6为中间点,称为转运点。如果有多个发点和收点,则虚设发点和收点转化成一个发点和收点。图中的权是该弧在单位时间内的最大通过能力,称为弧的容量(capacity)。最大流问题是在单位时间内安排一个运送方案,将发点的物质沿着弧的方向运送到收点,使总运输量最大。

设cijc_{ij}cij​为弧(i,j)的容量,fijf_{ij}fij​为弧(i,j)的流量。
容量是弧(i,j)单位时间内的最大通过能力,流量是弧(i,j)单位时间内的实际通过量,流量的集合f=fijf={f_{ij}}f=fij​称为网络的流。发点到收点的总流量记为v=val(f),v也是网络的流量。
注意:流量只是发出点的发出量或流入点的流入量,中间点的流入量和流出量是一样的。
概念区分
:从发点到收点的一条路线(弧的方向不一定都同向)称为链。从发点到收点的方向规定为链的方向。
前向弧:与链的方向相同的弧称为前向弧。
后向弧:与链的方向相反的弧称为后向弧。
增广链: 设 f 是一个可行流,如果存在一条从vs到vt的链,满足:
1.所有前向弧上fij<Cijf_{ij}<C_{ij}fij​<Cij​
2.所有后向弧上fij>0

Ford-Fulkerson标号算法

  • 第一步: 找出第一个可行流,例如所有弧的流量fij =0;

  • 第二步:对点进行标号找一条增广链。

    • (1)发点标号(∞)
    • (2)选一个点viv_ivi​ 已标号并且另一端未标号的弧沿着某条链向收点检查:
      • A.如果弧的方向向前(前向弧)并且有cij<fijc_{ij} < f_{ij}cij​<fij​,则vj标号:θj=cij-fij(容量−流量)θ_j=c_{ij}-f_{ij}(容量-流量)θj​=cij​-fij​(容量−流量)
      • B.如果弧的方向指向vi(后向弧)并且有fjif_{ji}fji​>0,则vj标号: θj=fjiθ_j=f_{ji}θj​=fji​
        当收点已得到标号时,说明已找到增广链,依据vi 的标号反向跟踪得到一条增广链。当收点不能得到标号时,说明不存在增广链,计算结束。
  • 第三步:调整流量

    • (1)求增广链上点vi 的标号的最小值,得到调整量 θ=min⁡jθj\theta=\min_j{\theta_j}θ=minj​θj​
    • (2)调整流量

      得到新的可行流f1,去掉所有标号,返回到第二步从发点重新标号寻找增广链,直到收点不能标号为止.

定理1 可行流f是最大流的充分必要条件是不存在发点到收点的增广链 .

求图中的发点v1到收点v7的最大流.

先假设已经给定了这个可行流,可以检查一下,发点和接收点的流量是相同的,都是16;每个点的流入量和流出量也是相同的。


然后进行第一轮标号

  • 先看{1→21→21→2}正向弧,8-6=2,圈2上就标号为2;
  • {2→42→42→4}{2→62→62→6}都是正向弧,但流量已经到达最大流了,所以不能增加了
  • {2→52→52→5}反向弧,所以圈3直接标3-0=3
  • {3→43→43→4}正向弧,圈4标3,当然也可以{3→6→4}这样多一条路径但结果一样就不用这个了
  • {4→7}正向弧,圈7标号10-3=7

增广链μ={(1,2),(3,2),(3,4),(4,7) },μ+={(1,2),(3,4),(4,7)},μ-={(3,2)},调整量为增广链上点标号的最小值 θ=min{∞,2,3,3,7}=2,对其进行调整


这里有反向弧,调整后是正向弧+2,反向弧-2

第二轮
与第一轮是一样的,要说的就是{3→2}虽然没有到最大容量,但圈2往后不能增加了,所以直接不用看

增广链μ=μ+={(1,3),(3,4),(4,7) },调整量为 θ=min{∞,4,1,5}=1
这里没有反向弧,经过的弧流量都加1

第三轮

增广链μ=μ+={(1,3),(3,6),(6,4),(4,7) },调整量为 θ=min{∞,3,1,2,4}=1
全是正向弧,都加1

经过排查只有这些增广链了,所以可以下结论了
最大流量v=f12+f13=8+12=20=f67+f47+f57=6+2+7+7\color{Blue}v=f12+f13=8+12=20=\color{Red}f67+f47+f57=6+2+7+7v=f12+f13=8+12=20=f67+f47+f57=6+2+7+7
上面是有向图,无向图就更简单了,直接全是加就完了。

截集-截量法

将图G=(V,E)的点集分割成两部分V1,V1‾V_1,\overline{V_1}V1​,V1​​并且vs∈V1v_s\in{V_1}vs​∈V1​以及vt∈V1‾v_t\in\overline{V_1}vt​∈V1​​,则箭尾在V_1箭头在 V1‾\overline{V_1}V1​​ 的弧集V1,V1‾V_1,\overline{V_1}V1​,V1​​称为一个截集,截集中所有弧的容量之和称为截集的截量。

下图所示的截集为V1,V1‾V_1,\overline{V_1}V1​,V1​​={(1,2),(3,4),(3,5)},截量C=6+2+2=10;

为什么没有{2,3}呢?是因为弧内的① ③ 要指向弧外的 ② ④ ⑤ ⑥ ,{2,3}是弧外的指向弧内的了。

又如下图所示的截集为V1,V1‾V_1,\overline{V_1}V1​,V1​​= {(2,4),(3,(5,4)(5,0)}
截量C(V1,V1‾)C(V_1,\overline{V_1})C(V1​,V1​​)=4+2+6+9=21


下图所示的截集为V1,V1‾V_1,\overline{V_1}V1​,V1​​= {(2,4),(2,5),(3,4),(3,5)}
截量C=4+1+2+2=9

所有截量中此截量最小且等于最大流量,此截集称为最小截集。经过计算这个图最小截量就是9,所以最大流量就是9;
定理2最大流量等于最小截集的截量。\color{Red}定理2 最大流量等于最小截集的截量。定理2最大流量等于最小截集的截量。

数学建模之图论——图与网络模型(二)(最小生成树问题、最大流问题)相关推荐

  1. 数学建模之图论——图与网络模型(一)(基本概念和最短路问题,附MATLAB源码)

    图与网络的基本概念与数据结构 一.图与网络的基本概念 图论中图是由点和边构成的,可以反映一些对象之间的关系. 无向图 无向图(简称图):没有方向,由点和边构成的图,记做G =(V , E),点是V,边 ...

  2. 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (二)

    本文属于图神经网络的系列文章,文章目录如下: 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一) 从图(Graph)到图卷积(Graph Convolutio ...

  3. 【转载】从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (二)

    从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (二) 作者: SivilTaram 出处:https://www.cnblogs.com/SivilTaram/ ...

  4. 数据挖掘机器学习[七]---2021研究生数学建模B题空气质量预报二次建模求解过程:基于Stacking机器学习混合模型的空气质量预测{含码源+pdf文章}

    相关文章: 特征工程详解及实战项目[参考] 数据挖掘---汽车车交易价格预测[一](测评指标:EDA) 数据挖掘机器学习---汽车交易价格预测详细版本[二]{EDA-数据探索性分析} 数据挖掘机器学习 ...

  5. 2021年数学建模国赛C题问题二详细思路和代码

    2021年数学建模国赛C题问题一详细思路和代码 说明: 本思路仅为小编个人思路,其中关于本文中给出的AdaBoost回归预测模型于今年的 国赛参考评分标准有所出入,所以本题思路为个人创新思路,不一定符 ...

  6. 数学建模快速入门(6)二维图和三维图

    二维图 要创建二维线图,请使用 plot 函数. 例如,绘制从 0 到 5π 的正弦函数值: 三维图 三维图通常显示一个由带两个变量的函数(即 z = f (x,y))定义的曲面图. 要计算 z,请首 ...

  7. matlab中离开网格的流量,数学建模【数据处理方法(一维、二维插值方法;数据拟合方法;插值and拟合的MATLAB实现)】...

    [学习网址:MOOC---郑州轻工业大学---数学建模与实验]数学建模专栏 笔记01[第1.2章][概述.软件介绍] 笔记02[第3章][数据处理方法] 笔记03[第4章][规划模型] 笔记04[第5 ...

  8. 数学建模神经网络应用,构建神经网络模型方法

    数学模型的建立与求解 . 8.3.2.1数学模型的求解本次研究采用地下水数值模拟软件ProcessingModflow,利用美国地质调查局所开发的三维有限差分地下水流模型Modflow(Modular ...

  9. 【数学建模】图论模型-Floyd算法(最优化)

    文章目录 一.算法介绍 二.适用问题 三.算法总结 1. 步骤 四.应用场景举例 五.MATLAB代码 六.实际案例 七.论文案例片段(待完善) Floyd算法主要针对数学建模问题中的一些小的子问题进 ...

最新文章

  1. 看完你也想编写自己的 react 插件
  2. Git reset , revert, checkout的区别和联系
  3. 手把手教你建github技术博客
  4. liblapack.so.3: undefined symbol: gotoblas错误及解决办法
  5. 【Linux】linux服务器下的帮助命令总结
  6. Mate 50系列首发?曝鸿蒙3.0用户版5月内测
  7. 为什么你的种子磁力下载很慢?
  8. Blockchain -Corda框架研究一 sendfile-Attachments学习笔记
  9. 微信小程序转码机器人
  10. Linux修改网卡地址(临时/永久)
  11. Python图书商城(可运行代码)有说明文档
  12. Python 实现三维建模工具(上)
  13. deep learning in NLP
  14. linux换屏快捷键,Linux系统快捷键最全合集
  15. 一键式免费借还的智能充电宝租赁
  16. 陌陌推出点赞匹配功能,动了谁的蛋糕?
  17. thinkphp5使用容联发送短信验证码
  18. Graphite介绍
  19. 旧笔记本装linux系统
  20. 教你几招亚马逊促销旺季爆单选品攻略技巧

热门文章

  1. synchronized()_深入理解synchronized
  2. python高手能做什么_python高手们、能不能给新手写点心得,迷茫过、好方法、过渡期等等...
  3. 租赁笔记本电脑哪里有_广东哪里有离心鼓风机优势-长沙鼓风机厂
  4. android5.1 投影显示器,5.1.1投影—投影与中心投影(一).ppt
  5. 东财网络学校计算机统考真题,东北财经大学网络教育学院高中起点计算机基础入学测试模拟题(一)...
  6. swiftui 跳转_酷!苹果推出 SwiftUI,提高编程效率
  7. 如何打开linux内核选项APIC选项,非标准BIOS启动裁减后的Linux内核的一些问题?
  8. c# 中对于每次修改的程序 都必须重新手动生成 才能编译的问题
  9. python日记(四)字典的常见用法
  10. System.Diagnostics.Process.Star的用法