数模学习第七天---最大流问题(含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时就可以停止,这时求出的是最小费用流。当然,就需要将步骤进行到最后,直到不存在非饱和路存在为止。
在这里插入图片描述

  • 9
    点赞
  • 124
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
最大流问题是网络流模型中的一个重要问题,它的目标是求出网络中一点到另一点的最大流量。在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、付费专栏及课程。

余额充值