1 概述
设有向网络N(V,A),V顶点,A是边,其中,Vs是源, Vt 是汇。网络中有通过边aij从源到汇的流,但边流量不超过cij ,问该网络的最大流量为多少? 这个问题,称为最大流问题。它是网络流中最经典的问题之一。最大流问题广泛地应用在交通运输、供水、油管供油、邮电通讯,也可以用在生产安排,管理优化等实际问题上。
2. 求最大流的方法
这里介绍最大流问题有两种解法。一是通过线性规划,二是弧标号法(图上作业法)。
图1
2.1用线性规划求解最大流问题
我们把每条边的流量当作一个变量xij。我们记最大流量的流量为f。
另外,0<=xij<=cij。
2.2弧标号法(图上作业法)
用线性规划求解最大流问题显然很繁琐,这里介绍的弧标号法会简单一些。弧标号法本质上就是一种穷举法,不断地增加流量,直到不能增加为止。
第一步,初始化。在每一边的两端进行标号,标号记录允许通过的流量,即容量。
如图2所示。边a12的两边分别为5,0,表示c12=5,而c21=0。
图2
第二步,寻找增益路。
从1出发,发现到2的容量为5,到3的容量为6,到4的容量为5,所以到3的容量最大;而在3这一点,3到6容量最大,为7;6到7容量最大,为7。这样就找到了一条增益路
1——3——6——7,在这条路上,最大的流量为6。
图3
第三步,调整标号。
在增益路上,边的左端减去流量,边的右端加上流量。如图4所示。
图4
第四步,重复。
图5
第五步,最大流量。
通过连通1的边算出最大流量。如图5中第6小图,有最大流量为
(5-0)+(6-0)+(5-2)=14。
3matlab代码
有关网络流的matlab代码需要matlab_bgl工具箱,在网上可以下载。
cm = sparse([1 1 1 2 2 3 3 3 4 5 5 6 6],[2 3 4 3 5 2 5 66 6 7 5 7],...
[5 6 5 2 3 2 3 7 5 1 8 17],7,7)%构建图
[flowval cut R F] =max_flow(cm,1,7)
view(biograph(F,[],'ShowWeights','on'))
matlab算出的结果也为14.