·完整·單純形演算法(Simplex Algorithm),附C原始碼
前段時間參加了華為的2017軟體精英挑戰賽,用到了單純形演算法求解線性規劃問題,學習了正單純形,對偶單純形以及割平面法並用C語言實現了完整的simplex演算法。
單純形演算法是用來求解線性規劃問題的,其被用在了眾多SMT Solver中,如Yices, Z3等,都是基於的單純形演算法,其演算法效率在最壞情況下為指數級別,不過實現證明其效率在大多數情況下都是令人滿意的。
標準形式
…
對於
一些特殊情況的處理
1.對於不滿足
2.如果限制式子為等式,可將其化為一個大於等於和小於等於,如
3.如果要求的目標式
正單純形演算法
首先將標準形式寫為如下形式(Slack Form)
…
這裡引入了新的鬆弛變數
1.查詢
2.找到
3.交換
4.將所有的非基變數取0值,即可算出所有的基變數的值以及目標式的最大值,演算法結束
單純形的物理意義
如上圖所示,為7個限制不等式所構成的凸多面體,每個限制條件可看成正凸多面體的一個面,凸多面體的內部(包括表面)即為可行解區域。可以證明,最優解如果存在,則一定在凸多面體的頂點上。對於三維空間來說(更高維空間可類似推廣),某個頂點比為三個或以上的平面的交點,這個交點滿足對應相交平面的限制不等式。如點A,同時滿足式子②③⑦。
演算法中第3步中的交換因子(pivot),可以看成是從凸多面體的一個頂點走向另一個頂點。
對偶單純形
在標準形式(Slack Form)中,如果
對偶單純形的求解步驟如下:
1.引入新的鬆弛變數