1. 程式人生 > >FF最大流問題演算法

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