1. 程式人生 > >線性規劃專題——SIMPLEX 單純形演算法(一)

線性規劃專題——SIMPLEX 單純形演算法(一)

線性規劃,以前一直小瞧它了,它其實一種特別表達能力特別強的工具,只要能夠將問題定義成線性規劃的問題,那麼就可以使用單純形法來解決。

為什麼說,線性規劃的表達能力很強呢?因為像經典的網路流演算法、最小費用流演算法、多物品流演算法都可以寫成線性規劃的形式,一旦劃歸成線性規劃,那麼就可以使用單純形法在平滑多項式的時間內解決問題。至於如何劃歸成線性規劃問題就是看個人的本事了,看個人的創造力了,近幾年也的確有人嘗試將原先複雜度極高的問題轉換成線性規劃問題後,使問題得到多項式時間內的解決。

單純形演算法是求解線性最優化問題的超級有效的演算法,本文就來看看這個單純形演算法是如何匯出的。

線性規劃的幾種形式

線性規劃的一般形

線性規劃是指目標函式、約束條件都是線性的最優化問題。
線性規劃問題會有含有 n n 個自變數: X = ( x

1 , x 2 , x 3 ,
, x n ) T X=(x_{1},x_{2},x_{3},\dots,x_{n})^{T}
一個目標函式: o b j ( X ) = c 1 x 1 + c 2 x 2 + + c n x n obj(X)=c_{1}x_{1}+c_{2}x_{2}+\dots+c_{n}x_{n} ,寫成矩陣的形式就是 o b j ( X ) = C T X obj(X)=C^{T}X 。這表示目標函式是自變數的線性函式,然後問題是最大化或者最小化這個目標函式: m i n min o b j ( X ) obj(X) m a x max o b j ( X ) obj(X)
然後會有一堆的線性約束:
一些等式約束: a i T X = b i a_{i}^{T}X=b_{i}
一些不等式約束: a j T X < = b j a_{j}^{T}X<=b_{j} 或者 a k T X > = b k a_{k}^{T}X>=b_{k}

上面描述就是線性規劃的一般形,特指它的約束裡面既有等式約束又有不等式約束,目標既可以最大化又可以最小化。
這種表達很自然,但是不適於用計算機處理。於是有學者提出了線性規劃的標準型。

線性規劃的標準型

線性規劃的標準型,是從一般型轉換而來,轉換的目標是把 最優化都轉為最小化,然後把無約束、等式約束、不等式約束都轉換為小等於約束,以及把每個變數約束到非負。
線性規劃的標準型為:
m i n   C T X min \space C^TX
s . t .   A X < = b , X > = 0 s.t.\space AX<=b,X>=0
其中, A R m × n b R m , X R n A \in R^{m\times n},b \in R^{m},X\in R{^n}
那麼如何把一般型轉成標準型呢?

  1. 把目標函式由最大化轉最小化:假如原問題目標是 m a x   o b j ( X ) max\space obj(X) ,那麼最大化 o b j ( X ) obj(X) 就是在最小化 o b j ( X ) - obj(X)
  2. 把等式約束改成小於等於約束:假如原問題存在某個等式約束: a i X = b i a_{i*}X=b_{i} ,其中 a i a_{i} 是約束矩陣 A A 的第 i i 行。那麼可以把這個等式約束轉換為兩個不等式約束: a i X < = b i a_{i*}X<=b_{i} 以及 a i X < = b i -a_{i*}X<=-b_{i}
  3. 把大等於約束改成小等於約束:假如原約束為 a j X > = b j a_{j*}X>=b_{j} ,那麼兩邊同乘負號轉為: a j X < = b j -a_{j*}X<=-b_{j}
  4. 把無約束改成小等於約束:假如一般型裡面有某個變數 x k x_{k} 的約束是 x k R x_{k}\in R ,那麼構造兩個新變數: x k , x k x'_{k},x''_{k} 要求 x k > = 0 , x k > = 0 x'_{k}>=0,x''_{k}>=0 。令 x k = x k x k x_{k}=x'_{k}-x''_{k}