算法导论之最大流
最大流是圖應(yīng)用,將有向圖理解為一個(gè)流網(wǎng)絡(luò),可模型化流經(jīng)管道的液體、通過裝配線的部件、電網(wǎng)中的電流、通訊網(wǎng)絡(luò)傳送的信息等,源點(diǎn)以固定能量產(chǎn)生,而匯點(diǎn)則消耗同等能量,保持守恒。最大流問題追求的就是在流網(wǎng)絡(luò)中,物質(zhì)從源點(diǎn)傳到匯點(diǎn)的最大能量是多少?對于流網(wǎng)絡(luò),算法導(dǎo)論中給出了形式化定義。
流網(wǎng)絡(luò)G=(V,E)是一個(gè)有向圖,其中每條邊(u,v)∈E均有一個(gè)非負(fù)能量c(u,v)≥0。如果(u,v)?E,則假定c(u,v)=0。流網(wǎng)絡(luò)中有兩個(gè)特點(diǎn)的頂點(diǎn),源點(diǎn)s和匯點(diǎn)t,假定每個(gè)頂點(diǎn)均處于從源點(diǎn)到匯點(diǎn)的某條路徑上,就是說,對每個(gè)頂點(diǎn)v∈V,存在一條路徑s->v->t,因此圖G是連通圖,且|E|≥|V|-1。
設(shè)G=(V,E)是一個(gè)流網(wǎng)絡(luò),其能量函數(shù)為c。設(shè)s為網(wǎng)絡(luò)的源點(diǎn),t為匯點(diǎn)。G的流是一個(gè)實(shí)值函數(shù)f:VXV->R,且滿足下列三個(gè)性質(zhì):
容量限制:對所有u,v∈V,要求f(u,v)≤c(u,v)
反對稱性:對所有u,v∈V,要求f(u,v)=-f(v,u)
容量限制性質(zhì)說明從一個(gè)頂點(diǎn)到另一個(gè)頂點(diǎn)的網(wǎng)絡(luò)流不能超過設(shè)定的容量;反對稱性說明從頂點(diǎn)u到頂點(diǎn)v的流是其反向流求負(fù)所得。流手恒性說明從非源頂點(diǎn)或非匯點(diǎn)的頂點(diǎn)出發(fā)的總網(wǎng)絡(luò)流為0。
最大流問題,就是給出一個(gè)具有源點(diǎn)s和匯點(diǎn)t的流網(wǎng)絡(luò)G,希望找出從s到t的最大值流。
頂點(diǎn)總的凈流量:離開頂點(diǎn)的總的正流量,減去進(jìn)入頂點(diǎn)的總的正流量。流守恒性的另一個(gè)說法,進(jìn)入某個(gè)非源點(diǎn)非匯點(diǎn)的頂點(diǎn)的正網(wǎng)絡(luò)流,必須等于離開該頂點(diǎn)的正網(wǎng)絡(luò)流,即流進(jìn)等于流出。注意是正網(wǎng)絡(luò)流。
存在多個(gè)源點(diǎn)和匯點(diǎn)的最大流問題中,將建立超級源點(diǎn)和超級匯點(diǎn)。
流函數(shù)f以流網(wǎng)絡(luò)中的兩個(gè)頂點(diǎn)作為自變量,并隱含求和記號(hào)的數(shù)學(xué)定義如下:
設(shè)G=(V,E)是一個(gè)流網(wǎng)絡(luò),f是G中的一個(gè)流:
對所有X?V,f(X,X)=0
對所有X,Y?V,f(X,Y)=-f(Y,X)
對所有X,Y,Z?V,其中X∩Y=?,有f(XUY,Z)=f(X,Z)+f(Y,Z)且f(Z,XUY)=f(Z,X)+f(Z,Y)
應(yīng)用隱含求和記法,可以證明一個(gè)流的值為進(jìn)入?yún)R點(diǎn)的全部網(wǎng)絡(luò)流:
|f|=f(V,t),根據(jù)流守恒性,對所有頂點(diǎn)(非源點(diǎn)非匯點(diǎn)),進(jìn)入頂點(diǎn)的總的正流量等于離開頂點(diǎn)的總的正流量。根據(jù)上面的數(shù)學(xué)定義,證明:
|f|=f(s,V)
? =f(V,V)-f(V-s,V)
? =-f(V-s,V)
? =f(V,V-s)
? =f(V,t)+f(V,V-s-t)
? =f(V,t)
1)Ford-Fulkerson方法
Ford-Fulkerson方法用流網(wǎng)絡(luò)的割求解最大流的值,依賴三個(gè)主要思想:殘留網(wǎng)絡(luò)、增廣路徑、割。
?? 殘留網(wǎng)絡(luò)形式化定義
假定一個(gè)流網(wǎng)絡(luò)G=(V,E),源點(diǎn)為s,匯點(diǎn)為t;設(shè)f是G中的一個(gè)流,并考察一對頂點(diǎn)u,v∈V,在不超過容量c(u,v)的條件下,從u到v之間可以壓入的額外網(wǎng)絡(luò)流量,就是(u,v)的殘留容量,定義為:cf(u,v)=c(u,v)-f(u,v)。
如果c(u,v)=16且f(u,v)=11,那么在不超過16的情況下,可以在增加cf(u,v)=5的流來增加f(u,v)。
給定一個(gè)流網(wǎng)絡(luò)G=(V,E)和流f,由f壓得的G的殘留網(wǎng)絡(luò)Gf=(V,Ef),其中:
Ef={(u,v)∈VXV: cf(u,v)>0}
在殘留網(wǎng)絡(luò)中,每條殘留邊都能夠容納一個(gè)嚴(yán)格為正的網(wǎng)絡(luò)流。Ef中的邊可以是E中的也可以是反向邊。在f(u,v)<0情況下,即反向變邊,Ef中的邊不在E中。
設(shè)G=(V,E)是源點(diǎn)為s、匯點(diǎn)為t的一個(gè)流網(wǎng)絡(luò),且f為G中的一個(gè)流。設(shè)Gf是由f導(dǎo)出的G的殘留網(wǎng)絡(luò),且f’為Gf中的一個(gè)流。那么f+f’之和也是G中的一個(gè)流,|f+f’|=|f|+|f’|。
?? 增廣路徑的形式化定義
已知一個(gè)流網(wǎng)絡(luò)G=(V,E)和流f,增廣路徑p為殘留網(wǎng)絡(luò)Gf中從s到t的一條簡單路徑。
沿一條增廣路徑p的每條邊傳輸?shù)木W(wǎng)絡(luò)流的最大量為p的殘留容量,定義為:
cf(p)=min{cf(u,v):(u,v)在p上}
設(shè)G=(V,E)是一個(gè)流網(wǎng)絡(luò),f是G的一個(gè)流,并設(shè)p是殘留網(wǎng)絡(luò)Gf中的一條增廣路徑,定義函數(shù):
fp:VXV->R
則fp是Gf上的一個(gè)流,其值為|fp|= cf(p)>0。
設(shè)G=(V,E)是一個(gè)流網(wǎng)絡(luò),f是G的一個(gè)流,p是殘留網(wǎng)絡(luò)Gf中的一條增廣路徑。fp定義如上, f’=f+fp也是G的一個(gè)流,值|f’|=|f|+|fp|>|f|。
通俗地理解殘留網(wǎng)絡(luò)和增廣路徑:在流網(wǎng)絡(luò)的一個(gè)流f上還可以容納的多余的流量就是殘留網(wǎng)絡(luò),而在殘留網(wǎng)絡(luò)中尋找最大流就是增廣路徑,原來流f加上殘留網(wǎng)絡(luò)中的增廣路徑流就是不斷增加了最大流的值,如此迭代,尋找最大流的值。
?? 流網(wǎng)絡(luò)的割形式化定義
Ford-Fulkerson方法沿著增廣路徑反復(fù)增加流,直至找到最大流為止。最大流最小割原理是:一個(gè)流使最大流,當(dāng)且僅當(dāng)它的殘留網(wǎng)絡(luò)不包含增廣路徑。
流網(wǎng)絡(luò)G=(V,E)的割(S,T)是將頂點(diǎn)集合V劃分為S和T=V-S兩部分,使得s∈S,t∈T。如果f是一個(gè)流,則穿過(S,T)的凈流定義為f(S,T),割(S,T)的容量為c(S,T)。一個(gè)網(wǎng)絡(luò)的最小割也是網(wǎng)絡(luò)中所有割中具有最小容量的割。
設(shè)f是源點(diǎn)s、匯點(diǎn)t的流網(wǎng)絡(luò)G中的一個(gè)流,并且(S,T)是G的一個(gè)割,則通過割(S,T)的凈流f(S,T)=|f|,即一個(gè)流的值為進(jìn)入?yún)R點(diǎn)的總網(wǎng)絡(luò)流量。
網(wǎng)絡(luò)的最大流必定不超過此網(wǎng)絡(luò)最小割的容量,最大流的值實(shí)際上就是某一個(gè)最小割的容量。
這個(gè)很好理解了,就是關(guān)鍵割了,最大值取決于關(guān)鍵路徑上的容量。
有了上面三個(gè)形式化定義,現(xiàn)在可以正式說明最大流最小割定理。
如果f是具有源點(diǎn)s和匯點(diǎn)t的流網(wǎng)絡(luò)G=(V,E)中的一個(gè)流,則下列條件是等價(jià)的:
第一:f是G的一個(gè)最大流;
第二:殘留網(wǎng)絡(luò)Gf不包含增廣路徑;(迭代再也找不到增廣路徑)
第三:對G的某個(gè)割(S,T),有|f|=c(S,T);(最大流是最小割的容量)
對Ford-Fulkerson方法的算法分析以及通過最短路徑距離定義優(yōu)化的Edmonds-Karp算法不多述。理解最大流最小割原理最重要是理解流的定義。
Ford-Fulkerson方法的基礎(chǔ)算法中關(guān)鍵是增廣路徑的尋找,這也是決定算法性能的關(guān)鍵點(diǎn)。
2)最大二分匹配
流網(wǎng)絡(luò)的流滿足容量限制、反對稱性、流守恒性三大性質(zhì),基于殘留網(wǎng)絡(luò)、流網(wǎng)絡(luò)割以及增廣路徑的定義,形成最大流的最小割容量值定理。
最大二分匹配正式在這樣基礎(chǔ)上,用以解決二分圖匹配問題。可以說是將二分匹配問題轉(zhuǎn)化為最大流問題,也可以說是最大流問題適合用于解決二分匹配問題,anyway,先看看二分匹配問題的定義。
給定一個(gè)無向圖G=(V,E),一個(gè)匹配是一個(gè)邊的子集M?E,且滿足對所有頂點(diǎn)v∈V,M中至多有一條邊和v關(guān)聯(lián)。如果M中某條邊和v關(guān)聯(lián),則說頂點(diǎn)v∈V被匹配,否則是無匹配。最大匹配就是最大勢的匹配。假定頂點(diǎn)集合可被劃分為V=LUR,其中L和R是不相交的,且E中的所有邊一個(gè)端點(diǎn)在R中、另一個(gè)端點(diǎn)在l中,并假設(shè)V中的每個(gè)頂點(diǎn)至少有一條關(guān)聯(lián)的邊。基于這樣的二分圖定義尋找最大匹配問題有很多實(shí)際應(yīng)用。如集群機(jī)器執(zhí)行分布式任務(wù),機(jī)器是集合L,任務(wù)是集合R,E中的邊(u,v)假設(shè)為u∈L的機(jī)器執(zhí)行一項(xiàng)任務(wù)v∈R,最大匹配可以將任務(wù)盡可能多地分配給機(jī)器執(zhí)行。
應(yīng)用Ford-Fulkerson方法可以在關(guān)于|V|和|E|的多項(xiàng)式時(shí)間內(nèi),找出無向二分圖G=(V,E)的最大匹配。針對二分圖建立一個(gè)流網(wǎng)絡(luò),流對應(yīng)于匹配,尋找最大匹配就是尋找最大流。定義下二分圖G的相應(yīng)流網(wǎng)絡(luò)G1=(V1,E1):
設(shè)源點(diǎn)s和匯點(diǎn)t是不屬于V的新頂點(diǎn),V1=VU{s,t},如果G的頂點(diǎn)劃分為V=LUR,G1的有向邊為E的邊,從L指向R,再加上|V|條新邊:
E1={(s,u):u∈L}U{(u,v):u∈L,v∈R,and (u,v)∈E}U{(v,t):v∈R}
V中的每個(gè)頂點(diǎn)至少有一條關(guān)聯(lián)邊,|E|≥|V|/2。
設(shè)G=(V,E)是一個(gè)二分圖,其頂點(diǎn)劃分為V=LUR,設(shè)G1=(V1,E1)是G對應(yīng)的流網(wǎng)絡(luò)。如果M是G的匹配,則G1中存在一個(gè)整數(shù)值的流f,且|f|=|M|,相反,如果f是G1中的整數(shù)值流,則G中存在一匹配M滿足|M|=|f|。二分圖G的一個(gè)最大匹配M的勢等于其相應(yīng)的流網(wǎng)絡(luò)G1中的某一最大流的值。
算法導(dǎo)論還就最大流給出了壓入與重標(biāo)記算法以及優(yōu)化的重標(biāo)記與前移算法,值得去深入理解。在理解最大流及其應(yīng)用上,還是有點(diǎn)脫離實(shí)際,所以暫不深入掌握這兩個(gè)算法。總結(jié)
- 上一篇: 离线轻量级大数据平台Spark之MLib
- 下一篇: 离线轻量级大数据平台Spark之MLib