日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

运筹学—最大流模型

發布時間:2023/12/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 运筹学—最大流模型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上兩篇文章,我介紹了最短路徑中的兩種算法:
最短路徑算法——清晰簡單的弗洛伊德算法(Floyd)
最短路徑算法——簡單明了的迪杰斯特拉算法(Dijkstra)
這篇文章,我來簡單介紹一下最大流模型!

最大流模型

\qquad很多的數學模型往往來源于生活問題,本文介紹其中一個問題借此引出最大流模型,讓讀者能夠更好地了解模型的背景以及應用。
\qquad現有一管道網絡用于運輸原油,將原油從油井運輸到提煉廠,為了在網絡中順暢地輸運原油,需要在中間合適的距離安裝增壓泵站,每一段管道有一個有限的最大原油流量(容量),每段管道可以是單向,也可以是雙向,取決于它的原始設計。那么如何確定從油井到提煉廠原油的最大流量?
\qquad下面給定雙向弧的相關概念:
\qquad給定弧(i,j)(i,j)(i,j),其中i<ji<ji<j,用符號(C ̄ij,C ̄ji)(\overline{C}_{ij},\overline{C}_{ji})(Cij?,Cji?)表示兩個方向i→j,j→ii→j,j→iijji弧上的容量。為了更清晰地描述,把C ̄ij\overline{C}_{ij}Cij?放在靠近節點iii的一邊,把C ̄ji\overline{C}_{ji}Cji?放在靠近節點jjj的一邊,如下圖所示。
C ̄ij表示從i→j的弧上的容量,C ̄ji表示從j→i的弧上的容量\overline{C}_{ij}表示從i→j的弧上的容量,\overline{C}_{ji}表示從j→i的弧上的容量 Cij?ijCji?ji

1 枚舉割

\qquad割(cut) 是一部分弧的集合,如果將這些弧從網絡中刪除,就會斷開源點和匯點之間所有的流。割的容量等于這個割中所有弧上容量的和。在網絡中所有可能的割中,最小容量的割就對應了這個網絡的最大流。

例子

如下圖網絡,按照上述表示方法對每一條雙向弧都標上了容量。例如,對于弧(3,4),從節點3到節點4的流量限制為10單位,從節點4到節點3為5單位。我直接在圖中,標出了該網絡的3個割:

圖中3個割的容量如下表:

割相應的弧容量
1(1,2),(1,3),(1,4)20+30+10=60
2(1,3),(1,4),(2,3),(2,5)30+10+40+30=110
3(2,3),(3,5),(4,5)30+20+20=70

從表中可以看出,該網絡最大流不超過60個單位。枚舉所有割,對于小型網絡是可行的,但是對于比較復雜的網絡,效率就很低了,所以需要尋找其他算法。

2 最大流算法

2.1 原理

\qquad最大流算法的核心思想是:從網絡中尋找從源點到匯點具有正的流的突破路徑。
\qquad(i,j)(i,j)(i,j)上的初始容量(C ̄ij,C ̄ji)(\overline{C}_{ij},\overline{C}_{ji})(Cij?,Cji?),當給定一個流并找到突破路徑后,需要對每條弧上的容量進行修改,修改后的容量稱為剩余容量(cij,cji)(c_{ij}, c_{ji})(cij?,cji?)。 如果節點jjj從節點iii接收到一個流,那么給節點jjj標號為[aj,i][a_j,i][aj?,i](節點jjj的表示)。其中aja_jaj?表示從節點iii流到節點jjj的量,iii表示流的來源是節點iii。

2.2 步驟

第1步: 首先將所有弧(i,j)(i,j)(i,j)的剩余容量設為初始容量,即(cij,cji)=(C ̄ij,C ̄ji)(c_{ij}, c_{ji}) = (\overline{C}_{ij},\overline{C}_{ji})(cij?,cji?)=(Cij?,Cji?).取a1=∞a_1=\inftya1?=,則源點1標號為[∞,?][\infty,-][,?]. 令i=1i=1i=1,進入第2步。

第2步: 確定集合SiS_iSi?,它是節點iii通過剩余容量為正的弧能夠直接到達的所有未標號的節點jjj的集合。如果Si=?S_i=\emptysetSi?=?,進入第3步;否則,進入第4步。

第3步: 確定k∈Sik\in S_ikSi?,使之滿足cik=maxj∈Si{cij}c_{ik}= \mathop{max}\limits_{j\in S_i}\{c_{ij}\}cik?=jSi?max?{cij?}. 令ak=cika_k=c_{ik}ak?=cik?,并且給節點kkk標號[ak,i][a_k, i][ak?,i].如果k=nk=nk=n,此時匯點(終點)得到了標號,也找到了一條突破路徑,進入第5步;否則令i=ki=ki=k,轉回第2步。

第4步(回溯): 如果i=1i=1i=1,那么不存在突破路徑,進入第6步;否則,令rrr是緊鄰在當前節點iii之前得到標號的節點,并將節點iii從節點rrr的相鄰節點集合中刪除,令i=ri=ri=r,轉回第2步。

第5步(剩余容量的確定):Np=(1,k1,k2,...,n)N_p=(1,k_1, k_2,...,n)Np?=(1,k1?,k2?,...,n)是從源點1到匯點nnn的第ppp條突破路徑,則這條路徑上最大流量為:
fp=min(a1,ak1,ak2,...,an)f_p=min(a_1,a_{k1},a_{k2},...,a_n) fp?=min(a1?,ak1?,ak2?,...,an?)
\qquad這條路徑上每條弧的剩余容量在順著流的方向上fpf_pfp?是減少的,在逆著流的方向上fpf_pfp?是增加的。
\qquad例如,對于該路徑上的節點iii與節點jjj,當前剩余容量為(cij,cji)(c_{ij}, c_{ji})(cij?,cji?)變為:
\qquad<\a> 如果流是從節點iii流向節點jjj,則弧上的剩余容量為(cij?fp,cji+fp)(c_{ij}-f_p, c_{ji}+f_p)(cij??fp?,cji?+fp?);
\qquad<\b> 如果流是從節點jjj流向節點iii,則弧上的剩余容量為(cij+fp,cji?fp)(c_{ij}+f_p, c_{ji}-f_p)(cij?+fp?,cji??fp?);
\qquad恢復第4步刪除掉的節點,然后令i=1i=1i=1,轉回第2步接著尋找新的突破路徑。

第6步(最優解)
\qquad<\a> 給出已經找到的mmm條突破路徑,那么網絡的最大流為:
F=f1+f2+...+fmF=f_1 + f_2 + ...+ f_m F=f1?+f2?+...+fm?
\qquad<\b> 根據每條弧(i,j)(i,j)(ij)上的初始的和最終的剩余容量,(cij,cji)和(C ̄ij,C ̄ji)(c_{ij}, c_{ji})和 (\overline{C}_{ij},\overline{C}_{ji})(cij?,cji?)(Cij?,Cji?)按照下面的方法確定該弧上的最優流:令(x,y)=(C ̄ij?cij,C ̄ji?cji)(x,y)=(\overline{C}_{ij}-c_{ij},\overline{C}_{ji}-c_{ji})(x,y)=(Cij??cij?,Cji??cji?),如果x>0x>0x>0,那么從節點iii流向節點jjj的最優流是xxx個單位;如果y>0y>0y>0,那么從節點jjj流向節點iii的最優流是yyy個單位.(注意x,yx,yx,y不能同時為正數).

3 總結

\qquad由于例子過于繁雜,這里就不做具體展示,有興趣的讀者可以參考運籌學相關書籍,這里推薦2本我覺得不錯的,分別是:
《運籌學導論》 作者:[美]Hamdy A·Taha 出版社:人民郵電出版社;
《運籌學》 作者:運籌學教程編寫組 出版社:清華大學出版社

運籌學導論 運籌學

總結

以上是生活随笔為你收集整理的运筹学—最大流模型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。