数模学习第七天---最大流问题(含MATLAB求解)

设有向网络N(V,A),在发点Vs 有一批货,要通过网络上的弧运输到收点Vt 去,受运输条件限制,每条弧aij在单位时间内通过的车辆数不能超过cij 辆,分析:如何组织运输才能使从Vs到Vt 在单位时间内通过的车辆达到最多?
上面描述的这类问题,称为最大流问题。
例:如图10.3.1中,有一批物资需要用汽车尽快从发点①运到收点⑦,弧(i,j)上所标的数字表示该条道路在单位时间内最多能通过的车辆数(单位:百辆),问如何调运,才能使单位时间里有最多的车辆从①调到⑦。
在这里插入图片描述
点①出发的车辆数应该与点⑦到达的车辆数相同,除①和⑦以外的各中间点,进的车辆数应该与离去的车辆数应该相同。
在这里插入图片描述

求解方法,弧标号法

首先需要将最大流问题重新改画成为如下形式
在这里插入图片描述
如① 5 ②0 表示从①到②的最大通过量是5(百辆),从②到①的最大通过量是0;
第1次修改:
①从发点s到收点t找一条路,使得这条路上的所有弧前面的约束量。从图中可以看出,显然,①—③—⑥—⑦就是满足这样的条件的一条路。
②在路①—③—⑥—⑦中,c13=6 , c36=7, c67=7 ,所以取
p=c13=6;
在这里插入图片描述
在这里插入图片描述
同理,进行第2次修改:
选定①—②—⑤—⑦、
在这里插入图片描述
同理,进行第三次修改:
取①—②—③—⑤—⑦
在这里插入图片描述
①—④—⑥—⑦
①—④—⑥—⑤—⑦
①—④—⑥—③—⑤—⑦
一直修改到从发点①到收点⑦,再也不存在连通的起点容量都大于零的弧了
在这里插入图片描述
依这样的调度方式,可以从发点s调运14(百辆)汽车到收点t。
在这里插入图片描述

最大流算法讨论

①一个图成为最大流图的条件是从发点到收点的每一条路上总存在某个起点容量为零的弧,我们称这样的路为饱和路;如果从s到t有一条路,它上面每条路的起点容量都大于零,则称为非饱和路。
由此可以得到一个结论:一个图是最大流图的充分必要条件是不存在从s到t的非饱和路。
②将网络中的点分成两组,一组包括发点s ,称为发集 V1,一组包括收点t,称为收集 V2 ,连接 s 到 t 的所有弧称为截集,截集中各弧在 V1 旁的容量和称为截集的容量。
在这里插入图片描述
在这里插入图片描述
设f是网络N的一个可行流,那么,网络N的最小截集的容量(μ)等于网络最大流 fmax 与f 的差。
那么,f是最大流的充分必要条件是网络N的最小截集的容量为零。要获得最大流量,必须在最小截集的各弧上达到满载。
③最大流fmax的大小是确定的,但最大流的路线可以不唯一。

MATLAB

在这里插入图片描述
MATLAB图论工具箱求解最大流的函数:graphmaxflow( )
适用条件:权值都为正,且任意两个顶点之间不能有两条弧。顶点3和4之间有两条弧,删弧(4,3),加入虚拟的顶点9。

clc,clear
a=zeros(9);%创立矩阵
%填写数据
a(1,2)=6; a(1,3)=4; a(1,4)=5;
a(2,3)=3; a(2,5)=9; a(2,6)=9;
a(3,4)=4; a(3,5)=6; a(3,6)=7; a(3,7)=3;
a(4,7)=5; a(4,9)=2;
a(5,8)=12;
a(6,5)=8; a(6,8)=10;
a(7,6)=4; a(7,8)=15;
a(9,3)=2;
b=sparse(a);%通过挤出任何零元素将满矩阵转换为稀疏格式。
[x,y,z]=graphmaxflow(b,1,8)
h = view(biograph(a,[ ],'ShowWeights','on'))%原始容量
view(biograph(y,[],'ShowWeights','on'))  %计算最大流后
hold on

%%%
[MaxFlow, FlowMatrix, Cut] = graphmaxflow(G, SNode, TNode)
最大流      流矩阵                 G为n*n稀疏矩阵        节点

由MATLAB解得图像如下图所示:

在这里插入图片描述
在这里插入图片描述

最小费用流

如果在考虑网络上流量的同时,还要使得所安排流量的费用或者代价达到最小,就是所谓的最小费用流问题
在这里插入图片描述
在这里插入图片描述
求最小费用流的步骤和求最大流的步骤几乎完全一致,只是在步骤(1)中,选一条非饱和路时,应选代价和最小的路,即最短路。
例如,在图10.3.11中,从①到⑦的最短路是①—③—⑤—⑦,代价为7,在这条最短非饱和路上取 P=3 后,③—⑤变成容量为零,在下一次选择最短路时应将③—⑤视为断路来选取最短非饱和路。另外,选取①—③—⑤—⑦路后,③—①,⑤—③,⑦—⑤的弧成为容量大于零的弧,可分别标上它们的代价值为-3,-3,-1,是①—③,③—⑤,⑤—⑦的相反数。
在求最小费用流过程中,可以依上述方法不断重复求最大流的步骤来进行,当流量达到f0时就可以停止,这时求出的是最小费用流。当然,就需要将步骤进行到最后,直到不存在非饱和路存在为止。
在这里插入图片描述

  • 7
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
MATLAB教学视频数模资料及源程序代码下载及说明-MATLAB教学视频,数模资料及源程序代码下载及说明.pdf MATLAB源程序代码、免费视频、教学课件及付费视频的预览版下载,请直接看此贴的附件PDF文档! 如果下载有问题,请加QQ群:467976437 免费视频、教学课件及付费视频的预览版,已上传至QQ群共享,直接下载! MATLAB原创付费教学视频说明 每一期的教学内容均包教学视频(硬件加密,绑定电脑),教学课件,MATLAB源代码。每期视频的售价均为十元,授权一台电脑播放,不限播放次数。有需要MATLAB付费教学视频的同学,请加视频作者的QQ:993878382 随时恭候! MATLAB教学视频的教学内容说明(第1期免费分享,2至11期为付费视频) 第一期:MATLAB GUI中uitable的使用方法详解(免费分享) 本期视频时长约65分钟,配合多个实例,全方位地介绍了GUI中uitable的使用方法,包 uitable的设置(两种设置方法),数据及类型初始化,数据的调用等。 第二期:详解快速傅里叶变换FFT在MATLAB中的实现 本期视频时长约65分钟,首先,从FFT的由来开始讲起,然后在MATLAB中实现了FFT的计算,并给大家详细地解读了FFT的变换结果,最后还介绍了FFT的一个应用实例。 第三期:MATLAB十个基础入门实例详解 本期视频时长约110分钟,精选了十个基础的实例,帮助初学者快速入门MATLAB。十个实例中,前五个实例为MATLAB中的一些基本的操作,后五个实例为MATLAB中的一些简单的应用。 第四期:非线性方程(组)在MATLAB中的求解方法 本期视频时长约100分钟,配合多个非线性方程(组)实例,全方位地讲解了非线性方程(组)在MATLAB里的求解方法。主要内容包括:图解法,solve符号求解法,以及fsolve数值求解方法,并对各种求解方法进行了总结。 第五期:MATLAB数字图像处理基础入门 本期视频时长约75分钟,从数字图像的获取和表示方法开始讲起,详细地介绍了MATLAB中四种类型图像的数据结构,以及不同类型图像之间的转换,帮助初学者,快速建立数字图像处理的基本概念。 第六期:傅里叶变换的频域滤波详解 本期视频时长约80分钟,通过实例讲解和MATLAB代码的编写,详细解释了频域滤波的基本方法和实施步骤,让同学们加深理解时域和频率之间的转换,同时,建立起系统对输入信号响应的概念。 第七期:MATLAB二维图形的绘制及句柄操作 本期视频时长约110分钟,通过具体的实例,充分结合MATLAB自动生成的绘图代码,循序渐进地讲解二维图形的绘制,以及对象属性的设置方法,进而引导出图形句柄的概念,然后采用句柄操作的方法,对各种对象的属性进行设置。 第八期:详解数据插值的MATLAB实现 本期视频时长约120分钟,通过三个具体的数学建模案例,详细地讲解了MATLAB中一维插值和二维插值的应用和实现方法。另外,还通过自编程的方式,实现拉格朗日插值方法。视频的最后,还对多维插值做了基本的介绍。 第九期:空间域图像增强之灰度变换和直方图均衡匹配 本期视频时长约105分钟,通过大量的图片增强案例,从图像的显示效果和灰度直方图分析入手,通过自编程,详细地讲解了图像的四种灰度变换;使用MATLAB自带的imadjust函数;以及直方图均衡化和规定化(匹配)处理的图像增强方法。 第十期:MATLAB实现连续时间系统的时域分析 本期视频时长约70分钟,通过具体的系统分析案例,详细地讲解了连续系统的三种时域分析方法:系统微分方程求解法,基于传递函数的lsim求解方法,基于冲激响应的卷积积分求解法。视频的最后,还对各种方法进行了总结和展望。 第十一期:MATLAB实现离散时间系统的时域分析 本期视频时长95分钟,通过具体的案例解析,详细地讲解了离散时间系统的三种时域分析方法:递归法(迭代法),filter函数求解法,基于单位样值响应的卷积求解法;并深入探讨了离散时间系统的初始状态与初始条件之间的关系。 MATLAB原创教学视频,持续更新中……
最大流问题是网络流模型中的一个重要问题,它的目标是求出网络中一点到另一点的最大流量。在MATLAB中,可以使用图论工具箱提供的函数graphmaxflow()来解决最大流问题。这个函数适用于权值都为正,且任意两个顶点之间不能有两条弧的情况。在求解最大流问题时,需要将网络表示为一个矩阵,并填写对应的数据。然后可以调用graphmaxflow()函数来计算最大流,并得到最大流量以及对应的流矩阵。最后,可以通过可视化工具biograph()来展示网络的容量和计算结果。通过这些步骤,可以在MATLAB中解决最大流问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MATLAB 网络流](https://blog.csdn.net/qq_63585949/article/details/128907663)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [数模学习第七天---最大流问题MATLAB求解)](https://blog.csdn.net/fcxgfdjy/article/details/119797486)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看星河的兔子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值