理论教育 运筹学方法与模型:最大流算法

运筹学方法与模型:最大流算法

时间:2023-11-18 理论教育 版权反馈
【摘要】:现在我们关心的问题是,当网络N给定后,如何求得它的一个最大流.定理6-8为我们提供了寻求运输网络中最大流的一个方法.若给网络N上一个初始流(例如零流),我们判别一下N中有无f增流链:若无f增流链,则f即为最大流;若有f增流链Q,则可得f基于Q的修改流,有再将视为f,继续迭代.但是,到此算法还不能说已经建立成功了,因为如何寻求f的增流链这个问题还没有解决.故下面我们先讨论寻求f增流链的方法,然后建立

运筹学方法与模型:最大流算法

现在我们关心的问题是,当网络N给定后,如何求得它的一个最大流.

定理6-8为我们提供了寻求运输网络中最大流的一个方法.若给网络N上一个初始流(例如零流),我们判别一下N中有无f增流链:若无f增流链,则f即为最大流;若有f增流链Q,则可得f基于Q的修改流,有

再将视为f,继续迭代.

但是,到此算法还不能说已经建立成功了,因为如何寻求f的增流链这个问题还没有解决.故下面我们先讨论寻求f增流链的方法,然后建立求最大流的算法.我们采用标号的方法来寻求x至y的f增流链.

若f为网络N的一个流,N中满足下列条件的树T称为以x为根的f不饱和树:

①x∈V(T);

②任v∈V(T),v≠x,T内有唯一的一条初等链Q=x…v为f不饱和链,l(Q)>0.

每个点v∈V(T),都按下述方法给以标记:

若T中x至v的初等链为Qv=x…uv:

①如果(u,v)为N中边,则给v以标号(u,+,l(v)),其中第一个标号u表明在链Qv中u为v的紧前顶点;第二个标号表明(u,v)在Qv中为前向边;第三个标号l(v)=l(Qv)(l(Qv)由式(6-23)给出).显然,有

②如果(v,u)为N中边,则给v以标号(u,-,l(v)),其中第一个标号u表明在链Qv中u为v的紧前顶点,第二个标号表明(v,u)在Qv中为后向边,第三个标号l(v)=l(Qv)(l(Qv)由式(6-23)给出).显然,此时有

例如,图6-63为图6-61的一棵f不饱和树.

图6-63

我们通过以x为根的f不饱和树T的不断“生长”以及“标记法”来探寻N中f增流链.

初始时,先给x以标号(0,+,∞).

一般地,若已得以x为根的f不饱和树T(如图6-63),T中每个顶点都有标号,而yV(T).可将S=V(T)中点分成两部分:一部分点已查视过,即已生长了枝的点(例如图6-63中的点x,v2和v5),或判定不能生长枝的点(如图6-63中的点v1).另一部分点未查视过(如图6-63中的点v4).我们将T中全部未查视过的点记为A(A为有顺序的集合,先标记的点排在前.本算法的特点为:先标记的点先查视,即先生长枝).

我们查视A中第一个顶点u能否生长枝?关心下列边:

若M(u)及M(u)都为空集,则u点不能生长枝,u点查视完毕,将点u从A中取出.若M(u)或M(u)非空,则将M(u)中所有的点v及有向边e=(u,v)都生长在点u上而成为T的枝;将M(u)中所有的点v及有向边e=(v,u)都生长在点u上而成为T的枝.同时,对这些M(u)及M(u)中的点都按我们在上面介绍过的方法给以标号.至此,点u查视完毕,从A中删去.而M(u)及M(u)中的点v按标号前后顺序先后进入A,此时,S∪M(u)∪M(u)成为新的点集S.

倘若u在生长过程中得到边(u,y),则我们求得了x至y的f增流链Qy.我们用逆向追踪法来求f增流链Qy:首先根据点y的标号(u,+,l(y)),可得Qy中y的紧前顶点u,再根据点u的标号,依次逆向追踪,直至回溯到点x,即可得一条f增流链Qy(由Qy中各点标号的第二部分知链中各边是为前向边还是后向边),且l(y)=l(Qy).

若y未进入T,重复上述步骤继续运算.

若T不能再生长(即A=∅,T中点已全部查视完毕),而yV(T),则N中无增流链,f即为最大流,算法即可终止.此时,S=V(T)为全部已标号的点为全部未标号的点,可知S即为定理6-8(1)充分性证明中的顶点集合S,于是,(S,)即为最小割.所以我们说,最大流算法不仅可求得网络N的一个最大流,同时也可求得一个最小割.

为了运算上的方便,我们可将T的生长过程列成表格形式.例如对图6-61,寻找f增流链的过程可列成表6-26(表的第一行为查视某个顶点能否生长枝,第二、三行为被生长的顶点及其标号).

表6-26

对表6-26的运算过程我们作如下说明:

(1)给x以标号(0,+,∞),x置入S和A中.查视x:可知M(x)={v1,v2},M(x)=∅.给v1和v2分别以标号(x,+,l(v1))和(x,+,l(v2)),其中

其他以此类推.最后,我们运用逆向追踪法,由表6-29得到一条x至y的f不饱和链

基于Qy的修改流f如图6-62所示.

下面我们给出求N中流值为指定值λ的流f的算法(若要求N的最大流,则只要在这一算法中将事先给定的数值λ取为+∞即可):

①取N的一个初始流f(例如零流),计算Valf.(www.daowen.com)

②Valf=λ?

若是,则f即为所求之流,算法终止;

若否,则给x以标号l(x)=+∞,S={x},=V-S,A={x}.

③A=∅?

若是,则N中无f增流链,f即为最大流,算法终止;

若否,则取A中第一元素u,作

(M(u)中点按标号的先后给以顺序).按式(6-29)取M-(u),转步骤⑤.

若运用上述算法求N的最大流,则算法终止时的顶点集合S与对应的割(S,),即为最小割.

例6-32 求运输网络图6-64的最大流及最小割.

图6-64

图6-65

解 第一步,给初始流f如图6-65所示.对其寻找f增流链,标号过程如表6-27所示.

表6-27

由表6-27得N的f增流链Qy=xv2v3v4y(在图6-65中用双线示之),l(Qy)=l(y)=1.Qy中边(x,v2),(v3,v4)和(v4,y)为前向边,边(v3,v2)为后向边.得基于Qy的修改流如图6-66所示.

图6-66

图6-67

第二步,对图6-66寻找f增流链,标号过程如表6-28所示.

表6-28

由表6-28得f增流链Qy=xv2v5v4y(在图6-66中用双线示之).得基于Qy的修改流如图6-67所示.

表6-29

第三步 对图6-67寻找f增流链,标号过程如表6-29所示.

由表6-29可知,图6-67中不存在f增流链,故图6-67中流f即为最大流f,有

由表6-29知,已标号的点集S={x,v2,v3},未标号的点集={v1,v4,v5,v6,y},故最小割

可见,最小割的容量的大小影响最大流的流值.因此,为提高图6-67中最大流的流值,就必须提高最小割(S)中边的容量.另一方面,一旦最小割中边的容量被降低,则最大流的流值也同时降低.

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈