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

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

前言

線性規劃專題——SIMPLEX 單純形演算法(一) 提到了在線性規劃問題的以下結論:

  1. 問題的所有可行解構成了一個n-m維度的多胞型
  2. 而且最優解會在多胞型的頂點取得。
  3. 每個頂點對著係數矩陣的一組基,或者係數矩陣的每組基對應著一個頂點。
  4. 同時我們給出了多邊形或者更一般的多胞型的頂點的定義:頂點是那些特殊點,對於這些點而言,無法找到多邊形內部兩個不同的點,使得頂點在這兩個內部點形成的線段內。同時我們給出了多邊形或者更一般的多胞型的頂點的定義:頂點是那些特殊點,對於這些點而言,無法找到多邊形內部兩個不同的點,使得頂點在這兩個內部點形成的線段內。
    在這裡插入圖片描述
    例如上面這個多邊形裡面,A,B,C是頂點,這三個點就不在任何多邊形內點所形成的線段內部。而E不是頂點,那麼總是可以找到任意多條線段使得E線上段的內部。
  5. 頂點的解的格式:對於一個 m × n m \times n 的係數矩陣 A A
    來說,且 r a n k ( A ) =
    m rank(A)=m
    ,它表示 m m 約束, n n 個未知數。那麼這個係數矩陣內每組基含有 m m 線性無關的列。頂點的解的格式:至少 n m n-m 個0,剩下每一個 x i x_{i} 都對應著矩陣 A A 的第 i i 列選為基本列下的解。

OK,本章就來解決單純型法剩下的幾個問題。

  1. 如何從一個頂點轉移到另外一個頂點?
  2. 什麼時候單純型演算法停止?
  3. 如何生成第一個可行解,或者可行頂點?

如何從一個頂點轉移到另外一個頂點?

假設對於如下化為鬆弛型的線性規劃:
在這裡插入圖片描述
我們提取出它的係數矩陣,並且找到它的一個頂點。
在這裡插入圖片描述
這個頂點是: X = [ 2 , 0 , 0 , 2 , 0 , 3 , 6 ] X=[2,0,0,2,0,3,6] ,注意這裡的藍色的 x i x_{i} 。他們的值不為0,那麼他們對應的列:第1列,第4列,第6列,第7列構成了係數矩陣的一組基。

現在,我們從 x x 出發,構造出一個新的頂點出來。
因為每組頂點都對應這一組基,於是這個問題就等價於從原來由第1列、第4列、第6列、第7列形成的一組基構造出一個新的基來。

我們知道,這個係數矩陣是包含了 n n 列的,在示例中就是7列,而這個矩陣的rank,又是 m m ,也就是4。因此,為了構造一個新的基,我們只要把舊的那組基本列裡面換下一列,然後從原來非基本列裡面選出一列放進去就又形成了一組基。

例如,現在我們想把係數矩陣的第三列放進來。那麼應該把舊基本列裡面那個列踢出去呢?

第三列本來是不屬於基本列的,那麼第三列肯定是可以由舊的基:第2列、第4列、第5列、第6列線性表出的。

下面,我們用 A i A_{*i} 表示矩陣A的第i列, A j A_{j*} 表示矩陣A的第j行。

顯然 ( A 1 , A 4 , A 6 , A 7 ) (A_{*1},A_{*4},A_{*6},A_{*7}) 構成了 A A 的基本列,因為他們正好是一個元素個數為4的線性無關組。
於是 A 3 A_{*3} 必然可以由這組基本列線性表出。怎麼計算係數呢?

假設 A 3 = λ 1 A 1 + λ 4 A 4 + λ 5 A 6 + λ 7 A 7 A_{*3}=\lambda_1A_{*1}+\lambda_4A_{*4}+\lambda_5A_{*6}+\lambda_7A_{*7} ,把 A 1 , A 4 , A 6 , A 7 A_{*1},A_{*4},A_{*6},A_{*7} 並排在一起形成一個新的矩陣,那麼這可以寫成矩陣的形式:
( A 1 A 4 A 6 A 7 ) ( λ 1 , λ 2 , λ 6 , λ 7 ) T = A 3 (A_{*1}|A_{*4}|A_{*6}|A_{*7})(\lambda_1,\lambda_2,\lambda_6,\lambda_7)^T=A_{*3}
解這個線性方程組就是了。最後可以解的: A 3 = 0 A 1 + 1 A 4 + 1 A 6 + 1 A 7 A_{*3}=0A_{*1}+1A_{*4}+1A_{*6}+1A_{*7} ,

於是兩邊同時減去 A 3 A_{*3} 得到:
0 = A 3 + 0 A 1 + 1 A 4 + 1 A 6 + 1 A 7 0=-A_{*3}+0A_{*1}+1A_{*4}+1A_{*6}+1A_{*7}
我們整理一下,按列下標遞增的方式寫一下:
0 A 1 + 0 A 2 1 A 3 + 1 A 4 + 0 A 5 + 1 A 6 + 1 A 7 = 0 0A_{*1}+0A_{*2}-1A_{*3}+1A_{*4}+0A_{*5}+1A_{*6}+1A_{*7}=0