1. 程式人生 > 實用技巧 >Netflow&Linear Programming 學習筆記

Netflow&Linear Programming 學習筆記

Netflow&Linear Programming 學習筆記

首先是Linear Programming(不按套路出牌啊喂)

解決$\sum a_{i,j}x_j \leq b_i, $ \(x_i \geq 0\)

形式化的可以寫成\(Ax\leq b , x_i\geq 0\)

可以轉換成鬆弛型,即新增未知量,使不等式變等式。

如果不符合小於號可以兩邊變號處理,這裡係數無需保證正負。

解決線性規劃即轉成鬆弛型,做單純形演算法。

單純形演算法規則大概是尋找初始解,然後進行 轉軸操作,具體看程式碼,很好記,背過就完了。


全么模最優解=整數解,可以優化

對偶:

最小化\(\sum_{j=1}^{n} c_jx_j\)

,滿足\(\sum_{j=1}^ma_{i,j}x_j \geq b_i\)

最大化\(\sum_{i=1}^m b_iy_i\),滿足\(\sum_{j=1}^ma_{i,j}y_j \leq c_i\)

互為對偶。

最小化\(c^Tx\),滿足\(Ax\geq b\) 和最大化\(b^Ty\),滿足\(A^Ty\leq c\)

目標函式、約束 互換,結果大於/小於號取反。

二分圖和網路流的那些結論可以用對偶來推。

線性規劃轉網路流

有道曰:“全么模矩陣最優解為整數解”。

全么模是什麼,是erho的東西嗎?

全么模是指任何一個行數和列數相等的滿秩子矩陣行列式值均為1或-1(自身不需要相等)

一個充分條件:

僅有0,1,-1,每列最多2個非零數。

行可被分為BC 2個集合,假如有一列包含了2個同號非零數那麼它們所在的行被分在不同的集合,假如有一列包含了兩個異號非零數那麼他們所在的行被分在同一集合。

額,這判斷怪難的,感覺真要到這一步還是打表猜猜看吧。

這種線性規劃可以快速做

waiting for update

假如每列均為異號

這種可以轉換成網路流,速度比單純形快不少,因為其利用了這種矩陣的特殊性。

轉換方法:

對於最小化\(\sum_{j=1}^{n} c_jx_j\),滿足\(\sum_{j=1}^ma_{i,j}x_j=b_i\)

\(A_x\)中的正常數 c:連邊\(<S,x,c,0>\)

\(A_x\)中的負常數 c:連邊\(<x,T,-c,0>\)

\(A_{x,v}=-1,A_{y,v}=1\)範圍\([0,c]\)\(c_x=w\) 連邊\(<x,y,c,w>\)

\(<u,v,流量,費用>\)

跑最小費用最大流。

如果不好沒有等式,先新增變數變成等式

考慮新增變數\(z\),其每個只出現一次且符號均為正負1

對於最小化\(\sum_{j=1}^{n} c_jx_j\),滿足\(\sum_{j=1}^ma_{i,j}x_j+z_i+b_i=0\)

\(A_{x,v}=-1,A_{y,v}=1\)範圍\([0,c]\)\(c_x=w\) 連邊\(<x,y,c,w>\)

\(A_x\)中的正常數 c:連邊\(<S,x,c,0>\) 欽定其流滿

\(A_x\)中的負常數 c:連邊\(<x,T,-c,0>\)同樣也欽定流滿

對於\(z_i\),建立\(<i,T,\infty,0>\) 表示輔助量。

跑上下界最小費用最大流