欢迎访问文稿网!

解决网络最大流问题

范文之家 分享 时间: 加入收藏 我要投稿 点赞

解决网络最大流问题

    子任务5.2 解决网络最大流问题

    5.2.1 任务引入

    【任务5-2】 求图5-11所示的网络最大流,弧旁的权数表示(cij,fij)。

    img350

    

    图5-11

    5.2.2 任务分析

    参看后面的知识建构,则我们可以得出以下结论:

    ①一个网络D中,任何一个可行流f的流量v(f)都小于或等于这个网络中任何一个截集img351的截量。并且,如果网络上的一个可行流f*和网络中的一个截集img352,满足条件v(f*)=Cimg353,那么f*一定是D上的最大流,而img354)一定是D的所有截集中截量最小的一个(即最小截集)。

    ②网络中的一个可行流f*是最大流的充分必要条件是,不存在关于f*的增广链。

    ③在一个网络D中,最大流的流量等于分离vs和vt的最小截集的截量。

    由上面的结论可知,我们可以得出一个寻求网络系统最大流的方法:如果网络D中有一个可行流f,只要判断网络是否存在关于可行流f的增广链。如果没有增广链,那么f一定是最大流;如有增广链,那么可以按照上述结论③,不断改进和增大可行流f的流量,最终可以得到网络中的一个最大流。

    下面一起来了解求解网络最大流问题的方法:标号法。

    从网络中的一个可行流f出发(如果D中没有f,可以令f是零流),运用标号法,经过标号过程和调整过程,可以得到网络中的一个最大流。

    用给顶点标号的方法来定义img355。在标号过程中,有标号的顶点是img356中的点,没有标号的点不是img357中的点。如果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的第二个标号,

    令

    img358

    非增广矩阵上的各弧流量不变。

    再去掉所有的标号,对新的可行流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)截集容量

    设一个截集img363,则截集img364中所有弧的容量之和,称为这个截集的容量,记为Cimg365,即Cimg366=∑cij

    [示例]如图5-14所示。

    img367

    

    图5-14

    则:S=(vs,v2img368

    (S,S)=img369(vs,v1),(v2,v4),(v2,v3img370 Cimg371= cs1+ c24+ c23= 7+6+5=18

    [示例]如图5-15所示。

    

    图5-15

    img373

    img374

    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,得到

    img376

    其他的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的最小截集img378,其中S*={vs,v1}是标号的集合,img379{v,v,23v4,vt}是未标号的集合。

221381
领取福利

微信扫码领取福利

微信扫码分享