子任务5.2 解决网络最大流问题
5.2.1 任务引入
【任务5-2】 求图5-11所示的网络最大流,弧旁的权数表示(cij,fij)。
图5-11
5.2.2 任务分析
参看后面的知识建构,则我们可以得出以下结论:
①一个网络D中,任何一个可行流f的流量v(f)都小于或等于这个网络中任何一个截集的截量。并且,如果网络上的一个可行流f*和网络中的一个截集,满足条件v(f*)=C,那么f*一定是D上的最大流,而)一定是D的所有截集中截量最小的一个(即最小截集)。
②网络中的一个可行流f*是最大流的充分必要条件是,不存在关于f*的增广链。
③在一个网络D中,最大流的流量等于分离vs和vt的最小截集的截量。
由上面的结论可知,我们可以得出一个寻求网络系统最大流的方法:如果网络D中有一个可行流f,只要判断网络是否存在关于可行流f的增广链。如果没有增广链,那么f一定是最大流;如有增广链,那么可以按照上述结论③,不断改进和增大可行流f的流量,最终可以得到网络中的一个最大流。
下面一起来了解求解网络最大流问题的方法:标号法。
从网络中的一个可行流f出发(如果D中没有f,可以令f是零流),运用标号法,经过标号过程和调整过程,可以得到网络中的一个最大流。
用给顶点标号的方法来定义。在标号过程中,有标号的顶点是中的点,没有标号的点不是中的点。如果vt有了标号,表示存在一条关于f的增广链。如果标号过程无法进行下去,并且vt未被标号,则表示不存在关于f的增广链。这样,就得到了网络中的一个最大流和最小截集。
(1)标号过程
在标号过程中,网络中的点分为标号点(分为已检查和未检查两种)和未标号点。每个标号点的标号包括两部分:第一个标号表示这个标号是从哪一点得到的,以便找出增广链;第二个标号是为了用来确定增广链上的调整量θ。
标号过程开始,先给vs标号(0,+∞)。这时,vs是标号未检查的点,其他都是未标号点。一般地,取一个标号未检查点vi,对一切未标号点vj:
①如果在弧(vi,vj)上,fij<cij,那么给vj标号[vi,l(vj)]。其中l(vj)=min[l(vi),cij-fij]。这时,vj成为标号未检查点。
②如果在弧(vj,vi)上,fji>0,那么给vj标号[-vi,l(vj)]。其中l(vj)= min[l(vi),fij]。这时,vj成为标号未检查点。
于是vi成为标号已检查的点。重复以上步骤,如果所有的标号都已经检查过,而标号过程无法进行下去,则标号法结束,这时的可行流就是最大流。但是,如果vt被标上号,表示得到一条增广链μ,转入下一步调整过程。
(2)调整过程
首先按照vt和其他点的第一个标号,反向追踪,找出增广链μ。例如,令vt的第一个标号是vk,则弧(vk,vt)在μ上。再看vk的第一个标号,若是vi,则弧(vi,vk)都在μ上。依次类推,直到vs为止。这时,所找出的弧就成为网络D的一条增广链μ。取调整量θ=l(vt),即vt的第二个标号,
令
非增广矩阵上的各弧流量不变。
再去掉所有的标号,对新的可行流f′={fi′j},重新进行标号过程,直到找到网络D的最大流为止。
5.2.3 知识建构
1)网络流基本概念
(1)网络与网络流
网络:设一个赋权有向图D=(V,A),在V中指定一个发点vs和一个收点vt,其他的点叫做中间点。对于D中的每一个弧(vi,vj)∈A,都有一个权cij称为弧的容量。我们把这样的图D叫做一个网络系统,简称网络,记做D=(V,A,C)。
网络流:指在一定条件下渡过一个网络的某种流在各边上的流量的集合。定义在弧集合A上的一个函数:F={f(vi,vj)}={fij},则f(vi,vj)=fij叫做弧在(vi,vj)上的流量,简记为fij。
如图5-12所示,图(a)上数字为弧容量,图(b)上括号内数字为弧流量。
图5-12
网络系统上流的特点:
①发点的总流出量和收点的总流入量必相等;
②每一个中间点的流入量与流出量的代数和等于零;
③每一个弧上的流量不能超过它的最大通过能力(即容量)。
(2)可行流
可行流:是指满足以下条件的一个网络流。
①容量条件:对于每一个弧(vi,vj)∈A,有0≤fij≤cij
②平衡条件:对于发点vs,有∑fsj-∑fjs=v(f)
对于收点vt,有∑ftj-∑fjt=-v(f)
对于中间点,有∑fij-∑fji=0
其中发点的总流量(或收点的总流量)v(f)称为这个可行流的流量。
(3)最大流
最大流:是指在一个网络中,流量最大的可行流。
图5-13
可行流中fij=cij的弧称为饱和弧,fij<cij的弧称为非饱和弧。fij>0的弧为非零流弧,fij=0的弧叫做零流弧。
如图5-13所示,(v4,v3)是饱和弧,其他的弧是非饱和弧,并且都是非零流弧。
设μ是网络D中连接发点vs和收点vt的一条链。定义链的方向是从vs到vt,于是链μ上的弧被分为两类:一是弧的方向与链的方向相同,称为前向弧,前向弧的集合记做μ+;二是弧的方向与链的方向相反,称为后向弧,后向弧的集合记做μ-。如图5-13所示,则在链(vs,v1,v2,v3,v4,vt)中,μ+={(vs,v1),(v1,v2),(v2,v3),(v4,vt)},μ-={(v4,v3)}。
增广链:f是一个可行流,如果链μ满足以下条件:
①在弧(vi,vj)∈μ+上,有0≤fij<cij,即μ+中的每一条弧是非饱和弧。
②在弧(vi,vj)∈μ-上,有0<fij≤cij,即μ-中的每一条弧是非零流弧。则称μ为从vs到vt的关于f的一条增广链。
例如在图5-13中,链μ=(vs,v1,v2,v3,v4,vt)就是一条增广链。
2)网络的截集和截集容量
(1)网络的截集
(2)截集容量
设一个截集,则截集中所有弧的容量之和,称为这个截集的容量,记为C,即C=∑cij。
[示例]如图5-14所示。
图5-14
则:S=(vs,v2)
(S,S)=(vs,v1),(v2,v4),(v2,v3) C= cs1+ c24+ c23= 7+6+5=18
[示例]如图5-15所示。
图5-15
5.2.4 任务实施
用标号法对任务5-2进行任务实施。
步骤一 标号过程
(1)首先给vs标号(0,+∞)。
(2)看vs:在弧(vs,v2)上,fs2=cs3=3,不具备标号条件。在弧(vs,v1)上,fs1=1<cs1=5,故给v1标号[vs,l(v1)],其中l(v1)=min[l(vs),(cs1-fs1)]=min[+∞,5-1]=4。
(3)看v1:在弧(v1,v3)上,f13=c13=2,不具备标号条件。在弧(v2,v1)上,f21=1>0,故给v2标号[-v1,l(v2)],其中l(v2)=min[l(v1),f21]=min[4,1]=1。
(4)看v2:在弧(v2,v4)上,f24=3<c24=4,故给v4标号[v2,l(v4)])。其中:l(v4)=min[l(v2),(c24-f24)]=min[1,1]=1。在弧(v3,v2)上,f32=1>0,故给v3标号[-v2,l(v3)]。其中:l(v3)=min[l(v2),f32]=min[1,1]=1。
(5)在v3,v4中任意选一个,比如v3,在弧(v3,vt)上,f3t=1<c3t=2,故给vt标号[v3,l(vt)],其中:l(vt)=min[l(v3),(c3t-f3t)]=min[1,1]=1。因为vt被标上号,根据标号法,转入调整过程。
步骤二 调整过程
从vt开始,按照标号点的第一个标号,用反向追踪的方法,找出一条从vs到vt的增广链μ,如图5-16中双箭线所示。
图5-16
不难看出,μ+={(vs,v1),(v3,vt)},μ-={(v2,v1),(v3,v2)},取θ=1,在μ上调整f,得到
其他的fij不变。
调整后的可行流,如图5-17所示,再对这个可行流重新进行标号过程,寻找增广链。
图5-17
首先给vs标号(0,+∞),给v1标号(vs,3)。看v1,在弧(v1,v3)上,f13=c13,弧(v2,v1)上,f21=0,均不符合标号条件。因此标号过程无法进行下去,不存在从vs到vt的增广链,算法结束。
这时,网络中的可行流f′即是最大流,最大流的流量v(f′)=fs1+fs2=5。同时,也找出D的最小截集,其中S*={vs,v1}是标号的集合,{v,v,23v4,vt}是未标号的集合。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。