最小費用最大流問題

2021-09-30 08:07:36 字數 2571 閱讀 5413

【mcmf問題及數學模型】

在介紹最大流問題時,我們列舉了乙個最大物資輸送流問題。如果這個問題的已知條件還包括每條邊運送單位物資的費用,那麼怎樣運送,才能得到最大運輸量,並且輸送費用最少?這便是所謂最小費用最大流問題。 

在最大流的有關定義的基礎上,若每條有向邊除權數c(e)(表示邊容量)外還有另外乙個權數w(e)(表示單位流所需費用),並且已求得該網路的最大流值為f, 那麼最小費用最大流問題,顯然可用以下線性規劃模型加以描述:

min ∑ w(e)f(e) 

e∈e滿足 0≤f(e)≤c(e)  ,對一切e∈e 

f+(v)=f-(v)   ,對一切v∈v 

f+(x)=f      (最大流約束) 

(或f-(y)=f ) 

【演算法思路】

解決最小費用最大流問題,一般有兩條途徑。一條途徑是先用最大流演算法算出最大流,然後根據邊費用,檢查是否有可能在流量平衡的前提下通過調整邊流量,使總費用得以減少?只要有這個可能,就進行這樣的調整。調整後,得到乙個新的最大流。 

然後,在這個新流的基礎上繼續檢查,調整。這樣迭代下去,直至無調整可能,便得到最小費用最大流。這一思路的特點是保持問題的可行性(始終保持最大流),向最優推進。另一條解決途徑和前面介紹的最大流演算法思路相類似,一般首先給出零流作為初始流。這個流的費用為零,當然是最小費用的。然後尋找一條源點至匯點的增流鏈,但要求這條增流鏈必須是所有增流鏈中費用最小的一條。如果能找出增流鏈,則在增流鏈上增流,得出新流。將這個流做為初始流看待,繼續尋找增流鏈增流。這樣迭代下去,直至找不出增流鏈,這時的流即為最小費用最大流。這一演算法思路的特點是保持解的最優性(每次得到的新流都是費用最小的流),而逐漸向可行解靠近(直至最大流時才是乙個可行解)。 

由於第二種演算法和已介紹的最大流演算法接近,且演算法中尋找最小費用增流鏈,可以轉化為乙個尋求源點至匯點的最短路徑問題,所以這裡介紹這一演算法。

在這一演算法中,為了尋求最小費用的增流鏈,對每一當前流,需建立伴隨這一網路流的增流網路。例如圖 1 網路g 是具有最小 費用的流,邊旁引數為c(e) , f(e) , w(e),而圖 2 即為該網路流 的增流網路g′。增流網路的頂點和原網路相同。 按以下原則建 立增流網路的邊:若g中邊(u,v)流量未飽,即f(u,v) < e(u,v),則g ' 中建邊(u,v),賦權w ' (u,v)=w(u,v);若g中邊(u, v)已有流量,即f(u,v)〉0,則g′中建邊(v,u),賦權w′(v,u) =-w(u,v)。建立增流網路後,即可在此網路上求源點至匯點的最短路徑,以此決定增流路徑,然後在原網路上循此路徑增流。這裡,運用的仍然是最大流演算法的增流原理,唯必須選定最小費用的增流鏈增流。 

計算中有乙個問題需要解決。這就是增流網路g ′中有負權邊,因而不能直接應用標號法來尋找x至y的最短路徑,採用其它計算有負權邊的網路最短路徑的方法來尋找x至y的最短路徑,將 大大降低計算效率。為了仍然採用標號法計算最短路徑,在每次建立增流網路求得最短路徑後,可將網路g的權w(e)做一次修正,使再建的增流網路不會出現負權邊,並保證最短路徑不至於因此而改變。下面介紹這種修改方法。 

當流值為零,第一次建增流網路求最短路徑時,因無負權邊,當然可以採用標號法進行計算。為了使以後建立增流網路時不出現負權邊,採取的辦法是將 g中有流邊(f(e)>0)的權w(e)修正為0。為此, 每次在增流網路上求得最短路徑後,以下式計算g中新的邊權w " (u,v):

w " (u,v)=l(u)-l(v)+w(u,v) (*)

式中 l(u),l(v) -- 計算g′的x至y最短路徑時u和v的標號值。第一次求最短徑時如果(u,v)是增流路徑上的邊, 則據最短 路徑演算法一定有 l(v)=l(u)+w ' (u,v)=l(u)+w(u,v), 代入(*)式必有

w″(u,v)=0。

如果(u,v)不是增流路徑上的邊,則一定有: 

l(v)≤l(u)+w(u,v), 

代入(*)式則有 w(u,v)≥0。

可見第一次修正w(e)後,對任一邊,皆有w(e)≥0, 且有流 的邊(增流鏈上的邊),一定有w(e)=0。以後每次迭代計算,若 f(u,v)>0,增流網路需建立(v,u)邊,邊權數w ' (v,u)=-w(u,v) =0,即不會再出現負權邊。 

此外,每次迭代計算用(*)式修正一切w(e), 不難證明對每一條x至y的路徑而言,其路徑長度都同樣增加l(x)-l(y)。因此,x至y的最短路徑不會因對w(e)的修正而發生變化。

【計算步驟】

1. 對網路g=[v,e,c,w],給出流值為零的初始流。 

2. 作伴隨這個流的增流網路g′=[v′,e′,w′]。 

g′的頂點同g:v′=v。 

若g中f(u,v)<c(u,v),則g′中建邊(u,v),w(u,v)=w(u,v)。 

若g中f(u,v)>0,則g′中建邊(v,u),w′(v,u)=-w(u,v)。 

3. 若g′不存在x至y的路徑,則g的流即為最小費用最大流, 

停止計算;否則用標號法找出x至y的最短路徑p。 

4. 根據p,在g上增流: 對p的每條邊(u,v),若g存在(u,v),則(u,v)增流;若g存在(v,u),則(v,u)減流。增(減)流後,應保證對任一邊有c(e)≥ f(e)≥0。 

5. 根據計算最短路徑時的各頂點的標號值l(v),按下式修 改g一切邊的權數w(e):

l(u)-l(v)+w(e)→w(e)。  

6. 將新流視為初始流,轉2。 

mysql最小費用最大流問題 最小費用最大流問題

複雜網路中,單源單點的最小費用最大流演算法 mcmf 應用廣泛。在實際網路問題中,不僅考慮從 vs到 vt的流量最大,還要考慮可行流在網路傳送過程中的費用問題,這就是網路的最小費用最大流問題。最小費用最大流問題的一般提法 已知容量網路 d v a c 每條弧 vi,vj 除了已給出容量 cij 外,...

mysql最小費用最大流問題 最小費用最大流問題

最小費用最大流就是在原來求最大流的基礎上,假設每條邊還有乙個單位流量所需要的費用,因為最小費用的出現,原本的平行邊變得有意義,並且允許反向增廣,基本上就是將原本bfs改為進行一次bellmanford演算法尋找最短路徑,只要初始流是該流量下的最小費用可行流,每次增廣後的新流都是新流量下的最小費用流。...

mysql最小費用最大流問題 最小費用最大流

最小費用最大流 修改的dijkstra ford fulksonff演算法 修改的dijkstra其實和johnson演算法的思想是一致的。乙個求最小費用最大流的樸素演算法是這樣的 1求最小費用增廣路2判斷是否存在增廣路,否的話演算法終止。3增加增廣路上邊的流量4在增廣路上新增必要的逆向負權邊5go...