若米知识 > 百科 > 最小费用流和最小费用最大流

最小费用流和最小费用最大流

导读网络流的最小费用流算法优质回答一.Ford和Fulkerson迭加算法.基本思路:把各条弧上单位流量的费用看成某种长度,用求解最短路问题的方法确定一条自V1至Vn的最短路;在将这条最短路作为...

今天若米知识就给我们广大朋友来聊聊最小费用流算法,以下关于观点希望能帮助到您找到想要的答案。

网络流的最小费用流算法

优质回答一.Ford和Fulkerson迭加算法.

基本思路:把各条弧上单位流量的费用看成某种长度,用求解最短路问题的方法确定一条自V1至Vn的最短路;在将这条最短路作为可扩充路,用求解最大流问题的方法将其上的流量增至最大可能值;而这条最短路上的流量增加后,其上各条弧的单位流量的费用要重新确定,如此多次迭代,最终得到最小费用最大流.

迭加算法:

1) 给定目标流量F或∞,给定最小费用的初始可行流=0

2) 若V(f)=F,停止,f为最小费用流;否则转(3).

3) 构造 相应的新的费用有向图W(fij),在W(fij)寻找Vs到Vt的最小费用有向路P(最短路),沿P增加流f的流量直到F,转(2);若不存在从Vs到Vt的最小费用的有向路P,停止.f就是最小费用最大流.

具体解题步骤:

设图中双线所示路径为最短路径,费用有向图为W(fij).

在图(a)中给出零流 f,在图(b)中找到最小费用有向路,修改图(a)中的可行流,δ=min{4,3,5}=3,得图(c),再做出(c)的调整容量图,再构造相应的新的最小费用有向路得图(d), 修改图(c)中的可行流, δ=min{1,1,2,2}=1,得图(e),以此类推,一直得到图(h),在图(h)中以无最小费用有向路,停止,经计算:

图(h)中 最小费用=1*4+3*3+2*4+4*1+1*1+4*2+1*1+3*1=38

图(g)中 最大流=5

最大流问题仅注意网络流的流通能力,没有考虑流通的费用。实际上费用因素是很重要的。例如在交通运输问题中,往往要求在完成运输任务的前提下,寻求一个使总运输费用最省的运输方案,这就是最小费用流问题。如果只考虑单位货物的运输费用,那么这个问题就变成最短路问题。由此可见,最短路问题是最小费用流问题的基础。现已有一系列求最短路的成功方法。最小费用流(或最小费用最大流)问题 ,可以交替使用求解最大流和最短路两种方法,通过迭代得到解决。

二.圈算法:

1) 利用Ford和Fulkson标号算法找出流量为F(<=最大流)的流f.

2) 构造f对应的调整容量的流网络N'(f).

3) 搜索N'(f)中的负费用有向图C(Floyd算法),若没有则停止,否则转(4).

4) 在C上找出最大的循环流,并加到N上去,同时修改N'(F)中C的容量,转(3).

三,ZKW费用流

费用流是网络流的一个很重要的组成部分,也是非常有用的一种图论模型,关于费用流的算法,流传比较广的主要是消圈和增广路算法,而近来炒得沸沸扬扬的ZKW算法也是一种非常优秀的算法,这里我就谈谈我对此算法的一些理解。

此算法是由ZKW大牛创立,主要思想仍然是找增广路,只是有了一些优化在里边。原来我们找增广路主要是依靠最短路算法,如SPFA。因此此算法的时间复杂度主要就取决于增广的次数和每次增广的耗费。由于每一次找增广路是都是重新算一遍,这样似乎显得有些浪费,如果我们能够缩短找增广路的时间,那必定会大大地优化算法。

值得注意的是,在寻求最短路得过程中,设dis[i]为i到起点的距离,对于每一条由i引向j的边,必有dis[j]<=dis[i]+map[i][j];既然满足这样的恒等式,我们就可以借用KM算法的调整思想来寻求最短路,每次只走dis[j]=dis[i]+map[i][j]的路径,一旦不存在到达终点的路径,就扫描每一条边,找到最小的距离增加值,使得有至少一条新边被加入相等子图。

算法流程如下:

1.将dis数组清零,表示当前的相等子图内只有起点。

(如果存在负权边,必须要用spfa跑一遍,初始化出dis数组,下面的第二题就是这样的例子)。

2.深搜,如果到达终点,全部回退更改流量,再进行步骤2;否则,转3。

3.修改dis的值,如果无法修改,结束程序,已经找到的答案,反之转2。

有上下界

v上面讨论的网络流都只对每条弧都限定了上界(其实其下界可以看成0),现在给每条弧<Vi, Vj>加上一个下界限制Aij (即必须满足Aij≤fij)。

v弧上数字对第一个是上界,第二个是下界。若是撇开下界不看,此图的最大流如图(a)所示,流量是6;但若是加入了下界的限制,它的最大流量就只有5了。

网络算法

一、网络流的基本概念

先来看一个实例。

现在想将一些物资从S运抵T,必须经过一些中转站。连接中转站的是公路,每条公路都有最大运载量。如下图:

每条弧代表一条公路,弧上的数表示该公路的最大运载量。最多能将多少货物从S运抵T?

这是一个典型的网络流模型。为了解答此题,我们先了解网络流的有关定义和概念。

若有向图G=(V,E)满足下列条件:

1、 有且仅有一个顶点S,它的入度为零,即d-(S) = 0,这个顶点S便称为源点,或称为发点。

2、 有且仅有一个顶点T,它的出度为零,即d+(T) = 0,这个顶点T便称为汇点,或称为收点。

3、 每一条弧都有非负数,叫做该边的容量。边(vi, vj)的容量用cij表示。

则称之为网络流图,记为G = (V, E, C)

譬如图5-1就是一个网络流图。

1.可行流

对于网络流图G,每一条弧(i,j)都给定一个非负数fij,这一组数满足下列三条件时称为这网络的可行流,用f表示它。

(1) 每一条弧(i,j)有fij≤cij。

(2) 除源点S和汇点T以外的所有的点vi,恒有:

该等式说明中间点vi的流量守恒,输入与输出量相等。

(3) 对于源点S和汇点T有:

这里V(f)表示该可行流f的流量。

例如对图5-1而言,它的一个可行流如下:

流量V(f) = 5。

2.可改进路

给定一个可行流f=。若fij = cij,称<vi, vj>为饱和弧;否则称<vi, vj>为非饱和弧。若fij = 0,称<vi, vj>为零流弧;否则称<vi, vj>为非零流弧。

定义一条道路P,起点是S、终点是T。把P上所有与P方向一致的弧定义为正向弧,正向弧的全体记为P+;把P上所有与P方向相悖的弧定义为反向弧,反向弧的全体记为P-。

譬如在图5-1中,P = (S, V1, V2, V3, V4, T),那么

P+ = {<S, V1>, <V1, V2>, <V2, V3>, <V4, T>}

P- = {<V4, V3>}

给定一个可行流f,P是从S到T的一条道路,如果满足:

那么就称P是f的一条可改进路。(有些书上又称:可增广轨)之所以称作“可改进”,是因为可改进路上弧的流量通过一定的规则修改,可以令整个流量放大。具体方法下一节会重点介绍,此不赘述。

3.割切

要解决网络最大流问题,必须先学习割切的概念和有关知识。

G = (V, E, C)是已知的网络流图,设U是V的一个子集,W = VU,满足S U,T W。即U、W把V分成两个不相交的集合,且源点和汇点分属不同的集合。

对于弧尾在U,弧头在W的弧所构成的集合称之为割切,用(U,W)表示。把割切(U,W)中所有弧的容量之和叫做此割切的容量,记为C(U,W),即:

例如图5-1中,令U = {S, V1},则W = {V2, V3, V4, T},那么

C(U, W) = <S, V2> + <V1, V2> + <V1, V3>+<V1, V4>=8+4+4+1=17

定理:对于已知的网络流图,设任意一可行流为f,任意一割切为(U, W),必有:V(f) ≤ C(U, W)。

通俗简明的讲:“最大流小于等于任意割”。这是“流理论”里最基础最重要的定理。整个“流”的理论系统都是在这个定理上建立起来的,必须特别重视。

下面我们给出证明。

网络流、可改进路、割切都是基础的概念,应该扎实掌握。它们三者之间乍一看似乎风马牛不相干,其实内在联系是十分紧密的。

二、求最大流

何谓最大流?首先它必须是一个可行流;其次,它的流量必须达到最大。这样的流就称为最大流。譬如对图5-1而言,它的最大流如下:

下面探讨如何求得最大流。

在定义“可改进路”概念时,提到可以通过一定规则修改“可改进路”上弧的流量,可以使得总流量放大。下面我们就具体看一看是什么“规则”。

对可改进路P上的弧<vi, vj>,分为两种情况讨论:

第一种情况:<vi, vj>∈P+,可以令fij增加一个常数delta。必须满足fij + delta ≤ cij,即delta ≤ cij – fij。

第二种情况:<vi, vj>∈P-,可以令fij减少一个常数delta。必须满足fij - delta ≥ 0,即delta ≤ fij

根据分析可以得出delta的计算公式:

因为P+的每条弧都是非饱和弧,P-的每条弧都是非零流弧,所以delta > 0。

容易证明,按照如此规则修正流量,既可以使所有中间点都满足“流量守恒”(即输入量等于输出量),又可以使得总的流量有所增加(因为delta > 0)。

因此我们对于任意的可行流f,只要在f中能找到可改进路,那么必然可以将f改造成为流量更大的一个可行流。我们要求的是最大流,现在的问题是:倘若在f中找不到可改进路,是不是f就一定是最大流呢?

答案是肯定的。下面我们给出证明。

定理1 可行流f是最大流的充分必要条件是:f中不存在可改进路。

证明:

首先证明必要性:已知最大流f,求证f中不存在可改进路。

若最大流f中存在可改进路P,那么可以根据一定规则(详见上文)修改P中弧的流量。可以将f的流量放大,这与f是最大流矛盾。故必要性得证。

再证明充分性:已知流f,并且f中不存在可改进路,求证f是最大流。

我们定义顶点集合U, W如下:

(a) S∈U,

(b) 若x∈U,且fxy<cxy,则y∈U;

若x∈U,且fyx>0,则y∈U。

(这实际上就是可改进路的构造规则)

(c) W = V U。

由于f中不存在可改进路,所以T∈W;又S∈U,所以U、W是一个割切(U, W)。

按照U的定义,若x∈U,y∈W,则fxy = cxy。若x∈W,y∈U,则fxy = 0。

所以,

又因 v(f)≤C(U,W)

所以f是最大流。得证。

根据充分性证明中的有关结论,我们可以得到另外一条重要定理:

最大流最小割定理:最大流等于最小割,即max V(f) = min C(U, W)。

至此,我们可以轻松设计出求最大流的算法:

step 1. 令所有弧的流量为0,从而构造一个流量为0的可行流f(称作零流)。

step 2. 若f中找不到可改进路则转step 5;否则找到任意一条可改进路P。

step 3. 根据P求delta。

step 4. 以delta为改进量,更新可行流f。转step 2。

step 5. 算法结束。此时的f即为最大流。

三、最小费用最大流

1.问题的模型

流最重要的应用是尽可能多的分流物资,这也就是我们已经研究过的最大流问题。然而实际生活中,最大配置方案肯定不止一种,一旦有了选择的余地,费用的因素就自然参与到决策中来。

图5-8是一个最简单的例子:弧上标的两个数字第一个是容量,第二个是费用。这里的费用是单位流量的花费,譬如fs1=4,所需花费为3*4=12。

容易看出,此图的最大流(流量是8)为:fs1 = f1t = 5, fs2 = f2t = 3。所以它的费用是:3*5+4*5+7*3+2*3 = 62。

一般的,设有带费用的网络流图G = (V, E, C, W),每条弧<Vi, Vj>对应两个非负整数Cij、Wij,表示该弧的容量和费用。若流f满足:

(a) 流量V(f)最大。

(b) 满足a的前提下,流的费用Cost(f) = 最小。

就称f是网络流图G的最小费用最大流。

2.算法设计

我们模仿求最大流的算法,找可改进路来求最小费用最大流。

设P是流f的可改进路,定义 为P的费用(为什么如此定义?)。如果P是关于f的可改进路中费用最小的,就称P是f的最小费用可改进路。

求最小费用最大流的基本思想是贪心法。即:对于流f,每次选择最小费用可改进路进行改进,直到不存在可改进路为止。这样的得到的最大流必然是费用最小的。

算法可描述为:

step 1. 令f为零流。

step 2. 若无可改进路,转step 5;否则找到最小费用可改进路,设为P。

step 3. 根据P求delta(改进量)。

step 4. 放大f。转step 2。

step 5. 算法结束。此时的f即最小费用最大流。

至于算法的正确性,可以从理论上证明。读者可自己思考或查阅有关运筹学资料。

2.最小费用可改进路的求解

求“最小费用可改进路”是求最小费用最大流算法的关键之所在,下面我们探讨求解的方法。

设带费用的网络流图G = (V, E, C, W),它的一个可行流是f。我们构造带权有向图B = (V’, E’),其中:

1、 V’ = V。

2、 若<Vi, Vj>∈E,fij<Cij,那么<Vi, Vj>∈E’,权为Wij。

若<Vi, Vj>∈E,fij>0,那么<Vj, Vi>∈E’,权为-Wij。

显然,B中从S到T的每一条道路都对应关于f的一条可改进路;反之,关于f的每条可改进路也能对应B中从S到T的一条路径。即两者存在一一映射的逻辑关系。

故若B中不存在从S到T的路径,则f必然没有可改进路;不然,B中从S到T的最短路径即为f的最小费用可改进路。

现在的问题变成:给定带权有向图B = (V’, E’),求从S到T的一条最短路径。

考虑到图中存在权值为负数的弧,不能采用Dijkstra算法;Floyd算法的效率又不尽如人意——所以,这里采用一种折衷的算法:迭代法。

设Short[k]表示从S到k顶点的最短路径长度;从S到顶点k的最短路径中,顶点k的前趋记为Last[k]。那么迭代算法描述如下:(为了便于描述,令n = |V’|,S的编号为0,T的编号为n+1)

step 1. 令Short[k]  +∞(1≤k≤n+1),Short[0]  0。

step 2. 遍历每一条弧<Vk, Vj>。若Short[k] + <k, j> < Short[j],则令Short[j]  Short[k] + <k, j>,同时Last[j]  k。倘不存在任何一条弧满足此条件则转step 4。

step 3. 转step 2.

step 4. 算法结束。若Short[n + 1]= +∞,则不存在从S到T的路径;否则可以根据Last记录的有关信息得到最短路径。

一次迭代算法的时间复杂度为O(kn2),其中k是一个不大于n的变量。在费用流的求解过程中,k大部分情况下都远小于n。

3.思维发散与探索

1)可改进路费用:“递增!递增?”

设f从零流到最大流共被改进了k次,每i次选择的可改进路的费用为pi,那么会不会有p1≤p2≤p3≤……≤pk呢?

2)迭代法:“小心死循环!嘿嘿……”

迭代法会出现死循环吗?也就是说,构造的带权有向图B中会存在负回路吗?

3)费用:“你在乎我是负数吗?”

网络流图中的费用可以小于零吗?

4)容量:“我管的可不仅是弧。”

网络流图中的“容量”都是对弧而言的,但若是给每个顶点也加上一个容量限制:即通过此顶点的流量的上限;任务仍然是求从S到T的最小费用最大流。你能解决吗?

4.C++代码实现 #include<cstdio>#include<cstring>#include<algorithm>#include<queue>usingnamespacestd;intH[105],X[40005],P[40005],from[40005],flow[40005],cost[40005],tot;inlinevoidadd(intx,inty,intz,intk){P[++tot]=y;X[tot]=H[x];H[x]=tot;flow[tot]=z;from[tot]=x;cost[tot]=k;}intf,c;intn,m;intS,T;intd[105],a[105],p[105];structN{intx,w;friendbooloperator<(Na,Nb){returna.w>b.w;}N(inta=0,intb=0){x=a,w=b;}};priority_queue<N>q;boolspfa(){memset(d,0x3f,sizeof(d));d[S]=0;a[S]=inf;p[S]=0;intx;q.push(N(S,0));while(!q.empty()){x=q.top().x;q.pop();if(x==T)continue;for(inti=H[x];i;i=X[i]){if(flow[i]>0&&d[P[i]]>d[x]+cost[i]){d[P[i]]=d[x]+cost[i];a[P[i]]=min(a[x],flow[i]);p[P[i]]=i;q.push(N(P[i],d[P[i]]));}}while(!q.empty()&&d[q.top().x]!=q.top().w)q.pop();}if(d[T]==inf)return0;f+=a[T];c+=a[T]*d[T];x=T;while(x!=S){flow[p[x]]-=a[T];flow[p[x]^1]+=a[T];x=from[p[x]];}return1;}intmain(){#ifdefLOCALfreopen(in.txt,r,stdin);freopen(out.txt,w,stdout);#endifInput();while(spfa());maxflow=f,mincost=c;return0;}四、有上下界的最大流

上面讨论的网络流都只对每条弧都限定了上界(其实其下界可以看成0),现在给每条弧<Vi, Vj>加上一个下界限制Aij(即必须满足Aij≤fij)。

例如图5-9:

弧上数字对第一个是上界,第二个是下界。若是撇开下界不看,此图的最大流如图5-10(a)所示,流量是6;但若是加入了下界的限制,它的最大流量就只有5了,具体方案见图5-10(b)。

那么有上下界的网络最大流怎么求呢?

一种自然的想法是去掉下界,将其转化为只含上界的网络流图。这种美好的愿望是可以实现的。具体方法如下:

设原网络流图为G = (V, E, C, A),构造不含下界的网络流图G’ = (V’, E’, C’):

1、 V’ = V∪{S’, T’}

2、 对每个顶点x,令 ,若h-(x)≠0,就添加一条弧<S’, x>,其上界为h-(x)。

3、 对每个顶点x,令 ,若h+(x)≠0,就添加一条弧<x, T’>,其上界为h+(x)。

4、 对于任何<Vi, Vj>∈E,都有<Vi, Vj>∈E’,其上界C’ij = Cij – Aij。

5、 新增<T, S>∈E’,其上界CTS = +∞。

在G’中以S’为源点、T’为汇点求得最大流f’。若f’中从S’发出的任意一条弧是非饱和弧,则原网络流图没有可行流。否则可得原图的一个可行流f = f’ + A,即所有的fij = f’ij + Aij。(其正确性很容易证明,留给读者完成)

然后再求可改进路(反向弧<Vi, Vj>必须满足fij≥Aij,而非fij≥0),不断放大f,直到求出最大流。

我们看到,上几节所讨论的一种可行网络流实际上是{Aij = 0}的一种特殊网络流,这里提出的模型更一般化了。解决一般化的复杂问题,我们采取的思路是将其转化为特殊的简单问题,加以研究、推广,进而解决。这是一种重要的基本思想:化归——简单有效。基于这种思想,请读者自行思考解决:

1、 有上下界的最小流。

2、 有上下界的最小费用最大流。

五、多源点、多汇点的最大流

已知网络流图有n个源点S1、S2、……、Sn,m个汇点T1、T2、……、Tm,,求该图的最大流。这样的问题称为多源点、多汇点最大流。

它的解决很简单:

1、 增设一个“超级源”S’,对每个源点Si,新增弧<S’, Si>,容量为无穷大。

2、 增设一个“超级汇”T’,对每个汇点Ti,新增弧<Ti, T’>,容量为无穷大。

3、 以S’为源点、T’为汇点求最大流f。

4、 将f中的S’和T’去掉,即为原图的最大流。

算法正确性显然。

六、顶点有容量限制的最大流

上一节已经提出了这个问题,即对于进出每个顶点的流量也规定一个上限,这样的最大流如何求?

既然我们已经解决了“边限制”问题,现在何不把“点限制”问题转化为“边限制”呢?具体办法如下:

1、 对除源点和汇点之外的每个顶点i拆分成两个顶点i’和i’’。新增一条弧<i’, i’’>,其容量为点i的流量限制。

2、 对于原图中的弧<i, j>,我们将其变换成<i’’, j’>。

3、 对变换后的图求最大流即可。

这里我们又一次运用到了化归的思想:将未知的“点限制”问题转化为已知的“边限制”问题。

七、网络流与二部图的匹配

{二部图和匹配的定义可参见本书专门介绍二部图匹配的章节}

设二部图为G = (X, Y, E)。

增设点S’,对于所有i∈X,新增弧<S’, Xi>,容量为1;增设点T’,对于所有i∈Y,新增一条弧<Yi, T’>,容量也为1。原图中所有的弧予以保留,容量均为+∞。对新构造出来的网络流图以S’为源点、T’为汇点求最大流:流量即为最大匹配数;若弧<Xi, Yj>(i∈X,j∈Y)的流量非零,它就是一条匹配边。

二部图最大匹配问题解决。

那么二部图的最佳匹配问题又如何?

仍然按照上述方法构图。同时令原图中弧的费用保持不变;新增弧的费用置为0。然后以S’为源点、T’为汇点求最小费用最大流即可。最大流的费用即为原二部图最佳匹配的费用。

网络应用

将一连串的水管绘画成一个网络。每条水管有一特定的阔度,因此只可以保持一特定的水流量。当任何水管汇合,流入汇流点的总水量必须等于流出的水量,否则我们会很快地缺水,或者我们会团积水。我们有一个作为源点的入水口,和一个作为汇点的出水口。一道流便是一条由源点到汇点而使从出水口流出的总水量一致的可能路径。直观地,一个网络的总流量是水从出口流出的速率。

流可以关于在交通网络上的人或物质,或电力分配系统上的电力。对于任何这样的实物网络,进入任何中途结点的流需要等于离开那结点的流。Bollobás以基尔霍夫电流定律描绘这限制的特性,同时较迟的作者(即 Chartrand)提及它在某些守恒方程的普遍化。

在生态学中也可找到流网络的应用:当考虑在食物网中不同组织之间养料及能量的流,流网络便自然地产生。与这些网络有联繋的数学问题和那些液体流或交通流网络中所产生的难题有很大分别。由 Robert Ulanowicz 及其他人发展的生态系统网络分析领域包含使用信息论及热力学的概念去研究这些网络随时间的演变。

网络流理论的理论创建

优质回答最大流理论是由福特和富尔克森于1956年创立的,他们指出最大流的流值等于最小割(截集)的容量这个重要的事实,并根据这一原理设计了用标号法求最大流的方法,后来又有人加以改进,使得求解最大流的方法更加丰富和完善。最大流问题的研究密切了图论和运筹学,特别是与线性规划的联系,开辟了图论应用的新途径。

最大流问题仅注意网络流的流通能力,没有考虑流通的费用。实际上费用因素是很重要的。例如在交通运输问题中,往往要求在完成运输任务的前提下,寻求一个使总运输费用最省的运输方案,这就是最小费用流问题。如果只考虑单位货物的运输费用,那么这个问题就变成最短路问题。由此可见,最短路问题是最小费用流问题的基础。现已有一系列求最短路的成功方法。最小费用流(或最小费用最大流)问题,可以交替使用求解最大流和最短路两种方法,通过迭代得到解决。网络最大流问题和它的对偶问题——最小截问题,是一对经典组合优化问题,它们在许多工程领域和科学领域有重要的应用,是计算机科学和运筹学重要的内容,最大流问题已经有40多年的研究历史,近年来,随着各种网络的飞速发展,最大流问题的研究也取得了很大的进展,对最大流问题研究做了详细的总结,并对下一步研究趋势进行了预测。

最小费用最大流问题的解决方法

优质回答解决最小费用最大流问题,一般有两条途径。一条途径是先用最大流算法算出最大流,然后根据边费用,检查是否有可能在流量平衡的前提下通过调整边流量,使总费用得以减少?只要有这个可能,就进行这样的调整。调整后,得到一个新的最大流。

然后,在这个新流的基础上继续检查,调整。这样迭代下去,直至无调整可能,便得到最小费用最大流。这一思路的特点是保持问题的可行性(始终保持最大流),向最优推进。另一条解决途径和前面介绍的最大流算法思路相类似,一般首先给出零流作为初始流。这个流的费用为零,当然是最小费用的。然后寻找一条源点至汇点的增流链,但要求这条增流链必须是所有增流链中费用最小的一条。如果能找出增流链,则在增流链上增流,得出新流。将这个流做为初始流看待,继续寻找增流链增流。这样迭代下去,直至找不出增流链,这时的流即为最小费用最大流。这一算法思路的特点是保持解的最优性(每次得到的新流都是费用最小的流),而逐渐向可行解靠近(直至最大流时才是一个可行解)。

由于第二种算法和已介绍的最大流算法接近,且算法中寻找最小费用增流链,可以转化为一个寻求源点至汇点的最短路径问题,所以这里介绍这一算法。

在这一算法中,为了寻求最小费用的增流链,对每一当前流,需建立伴随这一网络流的增流网络。例如图 1 网络G 是具有最小 费用的流,边旁参数为c(e),f(e),w(e),而图 2 即为该网络流 的增流网络G′。增流网络的顶点和原网络相同。按以下原则建 立增流网络的边:若G中边(u,v)流量未饱,即f(u,v) < e(u,v),则G ' 中建边(u,v),赋权w ' (u,v)=w(u,v);若G中边(u,v)已有流量,即f(u,v)〉0,则G′中建边(v,u),赋权w′(v,u) =-w(u,v)。建立增流网络后,即可在此网络上求源点至汇点的最短路径,以此决定增流路径,然后在原网络上循此路径增流。这里,运用的仍然是最大流算法的增流原理,唯必须选定最小费用的增流链增流。

计算中有一个问题需要解决。这就是增流网络G ′中有负权边,因而不能直接应用标号法来寻找x至y的最短路径,采用其它计算有负权边的网络最短路径的方法来寻找x至y的最短路径,将 大大降低计算效率。为了仍然采用标号法计算最短路径,在每次建立增流网络求得最短路径后,可将网络G的权w(e)做一次修正,使再建的增流网络不会出现负权边,并保证最短路径不至于因此而改变。下面介绍这种修改方法。当流值为零,第一次建增流网络求最短路径时,因无负权边,当然可以采用标号法进行计算。为了使以后建立增流网络时不出现负权边,采取的办法是将 G中有流边(f(e)>0)的权w(e)修正为0。为此, 每次在增流网络上求得最短路径后,以下式计算G中新的边权w (u,v):

w (u,v)=L(u)-L(v)+w(u,v) (*)

式中 L(u),L(v) -- 计算G′的x至y最短路径时u和v的标号值。第一次求最短径时如果(u,v)是增流路径上的边, 则据最短 路径算法一定有 L(v)=L(u)+w ' (u,v)=L(u)+w(u,v), 代入(*)式必有

w″(u,v)=0。

如果(u,v)不是增流路径上的边,则一定有:

L(v)≤L(u)+w(u,v), 代入(*)式则有 w ”(u,v)≥0。

可见第一次修正w(e)后,对任一边,皆有w(e)≥0, 且有流 的边(增流链上的边),一定有w(e)=0。以后每次迭代计算,若 f(u,v)>0,增流网络需建立(v,u)边,边权数w ' (v,u)=-w(u,v) =0,即不会再出现负权边。 此外,每次迭代计算用(*)式修正一切w(e), 不难证明对每一条x至y的路径而言,其路径长度都同样增加L(x)-L(y)。因此,x至y的最短路径不会因对w(e)的修正而发生变化。

【计算步骤】

⒈ 对网络G=[V,E,C,W],给出流值为零的初始流。

⒉ 作伴随这个流的增流网络G′=[V′,E′,W′]。G′的顶点同G:V′=V。若G中f(u,v)<c(u,v),则G′中建边(u,v),w(u,v)=w(u,v)。若G中f(u,v)>0,则G′中建边(v,u),w′(v,u)=-w(u,v)。

⒊ 若G′不存在x至y的路径,则G的流即为最小费用最大流, 停止计算;否则用标号法找出x至y的最短路径P。

⒋ 根据P,在G上增流:对P的每条边(u,v),若G存在(u,v),则(u,v)增流;若G存在(v,u),则(v,u)减流。增(减)流后,应保证对任一边有c(e)≥ f(e)≥0。

⒌ 根据计算最短路径时的各顶点的标号值L(v),按下式修 改G一切边的权数w(e):

L(u)-L(v)+w(e)→w(e)。

⒍ 将新流视为初始流,转2。

最小费用最大流问题的介绍

优质回答最小费用最大流问题是经济学和管理学中的一类典型问题。在一个网络中每段路径都有“容量”和“费用”两个限制的条件下,此类问题的研究试图寻找出:流量从A到B,如何选择路径、分配经过路径的流量,可以在流量最大的前提下,达到所用的费用最小的要求。如n辆卡车要运送物品,从A地到B地。由于每条路段都有不同的路费要缴纳,每条路能容纳的车的数量有限制,最小费用最大流问题指如何分配卡车的出发路径可以达到费用最低,物品又能全部送到。

看完本文,相信你已经对最小费用流算法有所了解,并知道如何处理它了。如果之后再遇到类似的事情,不妨试试若米知识推荐的方法去处理。

本文来自网络,不代表本站立场,转载请注明出处:https://www.rm2g.com/baike/166146.html

作者: 若米知识

若米知识为您提供最全面的生活百科网站大全,主要为您提供数码、汽车、财经、美食、财经、科技、健康、教育、创业、电商、影视、百科等资讯信息,在这里可以找到您所需的答案,解决您所困惑的问题。
语言教学方法--语言方法有哪些
秦皇岛中专技校哪个好!秦皇岛技术中专费用
联系我们

联系我们

0898-88881688

在线咨询: QQ交谈

邮箱: email@wangzhan.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部