FF最大流问题算法

一、最大流问题

最大流问题(maximum flow problem),一种组合最优化问题,就是要讨论如何充分利用装置的能力,使得运输的流量最大,以取得最好的效果。

实际来源:

有一个自来水管道运输系统,起点是 s,终点是 t,途中经过的管道都有一个最大的容量,可以想象每条管道不能被水流“撑爆”。求从 s 到 t 的最大水流量是多少?

数学模型

在这里插入图片描述
性质1:容量限制(Capacity Constraints):F<x,y> ≤ C<x,y>

性质2:流量守恒(Flow Conservation):Σ F<v,x> = Σ F<x,u>
再考虑节点任意一个节点 流入量总是等于流出的量 否则就会蓄水(爆炸危险…)或者平白无故多出水(有地下水涌出?)

当然源和汇不用满足流量守恒 我们不用去关心自来水厂的水是河里的 还是江里的

性质3: 是斜对称性(Skew Symmetry): F<x,y> = - F<y,x>

这其实是完善的网络流理论不可缺少的 就好比中学物理里用正负数来定义一维的位移一样

百米起点到百米终点的位移是100m的话 那么终点到起点的位移就是-100m

同样的 x向y流了F的流 y就向x流了-F的流

二.计算最大流的基本算法

那么怎么求出一个网络的最大流呢?

Ford-Fulkerson方法 即增广路方法 简称FF方法。求最大流的标号算法最早由福特和福克逊与与1956年提出,20世纪50年代福特(Ford)、(Fulkerson)建立的“网络流理论”,是网络应用的重要组成成分。

增广路方法是很多网络流算法的基础 一般都在残留网络中实现

其思路是每次找出一条从源到汇的能够增加流的路径 调整流值和残留网络 不断调整直到没有增广路为止

FF方法的基础是增广路定理(Augmenting Path Theorem):网络达到最大流当且仅当残留网络中没有增广路

2.1 基本概念

  • 残留网络(residual capacity):容量网络 - 流量网络 = 残留网络

一个简单的例子.网络可以被想象成一些输水的管道.括号内右边的数字表示管道的容量c,左边的数字表示这条管道的当前流量f.
在这里插入图片描述

计算残差网络,加上反向边。反向边表示这条边最大被抵消的能力。
在这里插入图片描述

残量网络(如果网络中一条边的容量为0,则认为这条边不在残量网络中。

r(s,v1)=0,所以就不画出来了。另外举个例子:r(v1,s) = c(v1,s) – f(v1,s) = 0 – (-f(s,v1)) = f(s,v1) = 4.

其中像(v1,s)这样的边称为后向弧,它表示从v1到s还可以增加4单位的流量。

但是从v1到s不是和原网络中的弧的方向相反吗?显然“从v1到s还可以增加4单位流量”这条信息毫无意义。那么,有必要建立这些后向弧吗?

显然,第1个图中的画出来的不是一个最大流。

但是,如果我们把s -> v2 -> v1 -> t这条路径经过的弧的流量都增加2,就得到了该网络的最大流。

注意到这条路径经过了一条后向弧:(v2,v1)。

如果不设立后向弧,算法就不能发现这条路径。

从本质上说,后向弧为算法纠正自己所犯的错误提供了可能性,它允许算法取消先前的错误的行为(让2单位的流从v1流到v2)

注意,后向弧只是概念上的,在程序中后向弧与前向弧并无区别.

  • 增广路径(augmenting path): 这是一条不超过各边容量的从 s 到 t 的简单路径,向这个路径注入流量,可以增加整个网络的流量。我们称在一条增广路径上能够为每条边增加的流量的最大值为路径的残余容量,cf§ = min{cf(u,v) : (u,v)∈路径p}

2.2 算法过程

算法过程:

开始,对于所有结点 u, v ∈ V, f(u, v) = 0,给出的初始流值为0。

在每一次迭代中,将 G 的流值增加,方法就是在残留网络 Gf 中寻找一条增广路径(一般用 BFS 算法遍历残留网络中各个结点,以此寻找增广路径),
然后在增广路径中的每条边都增加等量的流值,这个流值的大小就是增广路径上的最大残余流量。

反向边减去流量

重复这一过程,直到残余网络中不再存在增广路径为止。最大流最小切割定理将说明在算法终结时,该算法获得一个最大流。

伪代码:
在这里插入图片描述
FORD-FULKERSON(G,t,s)

1 for each edge(u,v) 属于 E(G)

2     f[u,v]=0

3     f[v,u]=0

4 while there exists a path p from s to t in the residual network Gf // 根据最大流最小切割定理,当不再有增广路径时,流 f 就是最大流

5       cf(p)=min{cf(u,v):(u,v)is in p}  // cf(p)为该路径的残余容量

6        for each edge (u,v) in p

7               f[u,v]=+cf(p)  //为该路径中的每条边中注入刚才找到到的残余容量

8               f[v,u]=-cf(p)   //反向边注入反向流量

Ford-Fulkerson算法的运行时间取决与寻找增广路径的方法,这也是Edmonds-Karps算法对基础Ford-Fulkerson算法做改进的理论基础。

我们在残存网络中选择的增广路径是一条从源结点s到汇点t的最短路径,其中每条边的权重为单位距离,我们称如此实现的Ford-Fulkerson算法为Edmonds-Karp算法。

4 算法的效率及其优化—— Edmonds-Karp 算法

如果使用广度优先来寻找增广路径,那么可以改善 FORD-FULKERSON 算法的效率,也就是说,每次选择的增广路径是一条从 s 到 t 的最短路径,其中每条边的权重为单位距离(即根据边的数量来计算最短路径),我们称如此实现的 FORD-FULKERSON 方法为 Edmonds-Karp 算法。其运行时间为 O(VE^2)。

ref
https://www.jianshu.com/p/efb2d79e2b0f

https://blog.csdn.net/weixin_30104533/article/details/80659364

猜你喜欢

转载自blog.csdn.net/qq_35608277/article/details/84380181