摘要:單純型算法是求解線性規划問題(LP)的一個經典算法,在單純型算法中最耗時的模塊是計算矩陣的逆矩陣的算法。網絡單純形算法是單純形算法的一個特殊版本,它使用生成樹基來更有效地解決具有純網絡形式的線性規划問題。
本文分享自華為雲社區《網絡單純型算法簡介》,原文作者:雲小凡 。
前言
單純型算法是求解線性規划問題(LP)的一個經典算法,在單純型算法中最耗時的模塊是計算矩陣的逆矩陣的算法。網絡單純形算法是單純形算法的一個特殊版本,它使用生成樹基來更有效地解決具有純網絡形式的線性規划問題。這樣的LP問題可以用有向圖上的公式來建模,作為一個最小費用流問題。
網絡單純型是指如下形式的LP問題:
其中,每列只包含一個1和一個-1,其他系數都是0。下面是一個例子:
該問題可以看做是最小費用流問題(Minimum cost flow problems)的圖形式。圖G=(V,E),頂點V表示行(約束),邊E表示列(變量),對於矩陣A中一個列,第i行有個1,第k行有個-1,表示圖G中的一條邊(i,k)。
對於上述例子,可以用下圖表示:
網絡流問題滿足Hoffman&Gale’s conditions,因此可以確保得到整數解。
關聯矩陣:
對於圖G=(V,E)的關聯矩陣A可以表示為:
上例中的關聯矩陣可以表示為:
路徑:
連通圖:圖中任意兩個頂點都有路徑。
生成樹:圖G的一個子圖T,包含圖G中所有頂點。
性質:rank(A)=n-1,n是結點個數。
我們新增一個變量w,A中增加一個列
,r∈{1,2……n}中任意一個值,w=0,則LP模型為:
其中,r稱為根節點(root vertex),w稱為根邊(root edge)(going nowhere)
對於上述例子,假如選擇根節點 r=2
A 是圖G的關聯矩陣,T是G的生成樹,則(A│e_r )的基B=e_r∪{a_e |e∈T}
單純型算法:
我們可以從根節點進行先序遍歷,得到y2=0, y1-y2=1, y1-y3=10,即依次遍歷基5,基1,基4
偽代碼:(遞歸)
solve(Vertex p,Tree S){//p是樹S的根節點
Vertex v=root(S);
if(v==r) y[r]=c[w];
else if ((p,v)∈E y[v]=y[p]-c[(p,v)];
else y[v]=y[p]+c[(v,p)];
solve(v,S.left());
solve(v,S.right());
}
參考文獻:https://www.cs.upc.edu/~erodri/webpage/cps/theory/lp/network/slides.pdf