第10章 图与网络优化
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。本文鏈接:https://blog.csdn.net/weixin_30104533/article/details/80659364
一、流網(wǎng)絡(luò)
G=(V,E)是一個有向圖,其中每條邊(u,v)有一個非負(fù)的容量值c(u,v),而且如果E中包含一條邊(u,v),那么圖中就不存在它的反向邊。在流網(wǎng)絡(luò)中有兩個特殊的結(jié)點,源結(jié)點s和匯點t。
流網(wǎng)絡(luò)的形式化定義
令G=(V,E)為一個流網(wǎng)絡(luò),其容量函數(shù)為c,設(shè)s為網(wǎng)絡(luò)的源點,t為匯點。G中的流是一個實值函數(shù)f,滿足以下兩條性質(zhì):
容量限制(capacity contraint):對于所有的結(jié)點u,v,要求0≤f(u,v)≤c(u,v)0\leq f(u,v)\leq c(u,v)0≤f(u,v)≤c(u,v)
流量守恒(flow conservation):對于所有的非源點和匯點的結(jié)點u,要求∑v∈Vf(v,u)=∑v∈Vf(u,v)\sum_{v\in V}f(v,u)=\sum_{v\in V}f(u,v)∑v∈V?f(v,u)=∑v∈V?f(u,v)
流網(wǎng)絡(luò)的示例圖
其中的“/”只是分隔符而不是運(yùn)算符,“/”前代表的是流的值,后則是該條邊的容量(capacity)
運(yùn)輸問題
(1)需要將貨物從s運(yùn)輸?shù)絫,途經(jīng)幾個中轉(zhuǎn)站,每次運(yùn)輸?shù)矫總€中轉(zhuǎn)站的貨物的數(shù)量是有限制的。在實際應(yīng)用中我們可能會在某條邊上雙向運(yùn)輸,這樣便違反了我們之前對流網(wǎng)絡(luò)的定義,但是我們可以將包含反平行邊的 圖(a) 來改造成 流網(wǎng)絡(luò) 圖(b),具體的方法是引入一個是虛構(gòu)的中轉(zhuǎn)結(jié)點,方法如下圖。
(2)考慮另外一種特殊情形,從多個工廠發(fā)出貨物最終運(yùn)輸?shù)絼e的多個工廠,這時候我們具有了多個源點和多個匯點,這也很好解決,解決的方法就是人為添加超級源點(supersource)和超級匯點(supersink),具體方法見下圖。
二、Ford-Fulkerson方法
將實際問題轉(zhuǎn)化成流網(wǎng)絡(luò)后,我們就可以來解決最大流問題了。理解這個方法需要先理解幾個關(guān)于流網(wǎng)絡(luò)的基礎(chǔ)概念。
1. 殘存網(wǎng)絡(luò)(residual network)
假定有一個流網(wǎng)絡(luò)G=(V,E),其源點為s,匯點為t,f為G中的一個流。即對點u,v,定義殘存容量(residual capacity)cf(u,v)c_f(u,v)cf?(u,v),有:
殘存網(wǎng)絡(luò)可能包含圖G中不存在的邊,殘存網(wǎng)絡(luò)中的反向邊允許算法將已經(jīng)發(fā)送出來的流量發(fā)送回去。一個殘存網(wǎng)絡(luò)示例圖如下:
圖a是一個流網(wǎng)絡(luò),b是a對應(yīng)的殘存網(wǎng)絡(luò),注意每條邊上的值,殘存網(wǎng)絡(luò)中針對每條正向邊計算出該條邊在存在流的情況下的剩余容量,并畫出一條反向邊,反向邊的容量即是發(fā)出流的大小,方便將發(fā)出的流運(yùn)輸回發(fā)送地,并將權(quán)重為0的邊省略。
殘存網(wǎng)絡(luò)是如何增大原始流網(wǎng)絡(luò)中的流的一種指示。如果f是G的一個流,對應(yīng)的有一個殘存網(wǎng)絡(luò),殘存網(wǎng)絡(luò)中我們可以定義一個流 f′f^{'}f′。此時我們可以定義一個函數(shù)f↑f′f\uparrow f^{'}f↑f′,我們將其稱作流f′f^{'}f′對f的增量(augmentation)。
2. 增廣路徑(augmenting paths)
給定流網(wǎng)絡(luò)G和流f,增廣路徑p是殘存網(wǎng)絡(luò)中一條從源結(jié)點s到匯點t的簡單路徑。根據(jù)殘存網(wǎng)絡(luò)的定義,對于一條增廣路徑上的邊(u,v),我們可以增加其流量的幅度最大為cf(u,v)c_f(u,v)cf?(u,v),即我們之前定義的殘存容量(residual capacity)。我們將這里討論的情形總結(jié)成一條引理:
引理 設(shè)G為一個流網(wǎng)絡(luò),設(shè)f為圖G中的一個流,設(shè)p為殘存網(wǎng)絡(luò)中的一條增廣路徑。定義一個函數(shù) fpf_pfp? 如下:
其中fpf_pfp?是殘存網(wǎng)絡(luò)中的一個流,其值∣fp∣=cf(p)>0|f_p|=c_f(p)>0∣fp?∣=cf?(p)>0。
推論?設(shè)G為一個流網(wǎng)絡(luò),設(shè)f為G中的一個流,設(shè)p為殘存網(wǎng)絡(luò)中的一條增廣路徑。設(shè) fpf_pfp? 如上述引理所定義,假定將f增加fpf_pfp?的量,則函數(shù)f↑f′f\uparrow f^{'}f↑f′是圖G中的一個流,其值為∣f↑fp∣=∣f∣+∣fp∣>∣f∣|f\uparrow f_p|=|f|+|f_p|>|f|∣f↑fp?∣=∣f∣+∣fp?∣>∣f∣。
3. 流網(wǎng)絡(luò)的切割(cuts of networks)
流網(wǎng)絡(luò)G中的一個切割(S,T)(S,T)(S,T)將結(jié)點集合V劃分為SSS和T=V?ST=V-ST=V?S兩個集合,使得s∈S,t∈Ts\in S,t\in Ts∈S,t∈T。若f是一個流,則定義橫跨切割(S,T)(S,T)(S,T)的凈流量f(S,T)f(S,T)f(S,T)如下:
切割(S,T)的容量是:
一個網(wǎng)絡(luò)的最小切割是整個網(wǎng)絡(luò)中容量最小的切割。
舉例說明切割的計算方法:
橫跨該切割的凈流量:
該切割的容量:
引理 設(shè)f為流網(wǎng)絡(luò)G的一個流,該流網(wǎng)絡(luò)的源結(jié)點為s,匯點為t,設(shè)(S,T)為流網(wǎng)絡(luò)G的任意切割,則橫跨切割(S,T)的凈流量為f(S,T)=∣f∣f(S,T)=|f|f(S,T)=∣f∣。
推論 流網(wǎng)絡(luò)G中任意流f的值不能超過G的任意切割的容量。
定理(最大流最小切割定理) 設(shè)f為流網(wǎng)絡(luò)G=(V,E)中的一個流,該流網(wǎng)絡(luò)的源結(jié)點為s,匯點為t,則下面的條件是等價的:
1. f是G的一個最大流。
2. 殘存網(wǎng)絡(luò)不包含任何增廣路徑
3. |f|=c(S,T),其中(S,T)是流網(wǎng)絡(luò)G的某個切割。
4. 基本的Ford-Fulkerson算法
在Ford-Fulkerrson方法的每次迭代中,尋找某條增廣路徑ppp,然后使用p來對流f進(jìn)行修改(增加)。我們不斷地在圖中尋找增廣路徑,并依據(jù)fpf_pfp?來增大f的值,直到圖中不含增廣路徑。偽代碼實現(xiàn)如下:
Ford-Fulkerson算法的運(yùn)行時間取決與尋找增廣路徑的方法,這也是Edmonds-Karps算法對基礎(chǔ)Ford-Fulkerson算法做改進(jìn)的理論基礎(chǔ)。
我們在殘存網(wǎng)絡(luò)中選擇的增廣路徑是一條從源結(jié)點s到匯點t的最短路徑,其中每條邊的權(quán)重為單位距離,我們稱如此實現(xiàn)的Ford-Fulkerson算法為Edmonds-Karp算法。
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的第10章 图与网络优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第10章* 网络 幂律分布
- 下一篇: 8. An Introduction t