1. 程式人生 > 其它 >單純形法筆記

單純形法筆記

單純形法

主要來自《演算法導論》

標準型

\[\text{最大化}\sum^n_{j=1}c_jx_j \\ \text{滿足約束}\\ \sum^n_{j=1}a_{ij}x_j \le b_i,i=1,2,...m \\ x_j\ge0,j=1,2,...m\\ \]

例題

最大化

\[3x_1+x_2+2x_3 \]

滿足約束

\[x_1+x_2+3x_3\le30 \\ 2x_1+2x_2+5x_3\le24\\ 4x_1+x_2+2x_3\le36 \]

1.轉換成鬆弛型

\[z = 3x_1+x_2+2x_3 \\ x_4=30-x_1-x_2-3x_3\\ x_5=24-2x_1-2x_2-5x_3\\ x_6=36-4x_1-x_2-2x_3 \]

2.找到基本解

如果所有的\(x_1,...x_6\)都是非負的,就說明這個解是可行的

把等式右邊的所有(非基本)變數設為0,計算左邊(基本)變數的值,可以得到基本解為(0,0,0,30,24,36)

如果一個基本解是可行的,則將其稱為基本可行解在單純形演算法執行過程中,基本解幾乎總是基本可行解

3.增大目標值

每次迭代的目標是讓基本解有一個更大的目標值。因此選擇一個在目標函式中係數為正值的非基本變數\(x_e\),儘可能增加\(x_e\)的值而不違反任何約束。

為了避免\(x_e\)違反約束並找到最大的值,考慮將變數\(x_e\)成為基本變數,而讓另一個變數\(x_l\)成為非基本變數

個人理解:因為基本解幾乎總是基本可行解,所以將\(x_e\)

放到左邊,更容易找到\(x_e\)的最大值

3.1 以\(x_1\)為主元

注意到增加\(x_1\)時,\(x_4,x_5,x_6\)隨之減小。對每個變數有一個非負的約束,不能讓其中一個變成負值。注意到三個約束分別為\(30/1,24/2,36/4\),其中第三個約束最緊(為9)

考慮將\(x_1\)作為主元,對第三個式子進行變換

\[x_1 = 9-\frac{x_2}{4}-\frac{x_3}{2}-\frac{x_6}4 \]

所以

\[x_4=30-x_1-x_2-3x_3 \\ =30-(9-\frac{x_2}{4}-\frac{x_3}{2}-\frac{x_6}4)-x_2-3x_3\\ =21-\frac{3}{4}x_2-\frac{5}2x_3-\frac{x_6}{4} \]

類似地,得到

\[x_5=6-\frac{3x_2}{2}-4x_3+\frac{x_6}{2} \] \[z = 27+\frac{x_2}{4}+\frac{x_3}{2}-\frac{3x_6}{4} \]

基本解為\(\left(9,0,0,21,6,0\right)\),目標值為27

3.2 以\(x_3\)為主元

注意到約束分別為\(18,42/5,3/2\),第三個約束是最緊的

\[z=\frac{111}{4}+\frac{1}{16}x_2-\frac{1}{8}x_5-\frac{11}{16}x_6 \\ x_1=\frac{33}{4}-\frac{1}{16}x_2+\frac{1}{8}x_5-\frac{5}{16}x_6 \\ x_3=\frac{3}{2}-\frac{3}{8}x_2-\frac{1}{4}x_5+\frac{1}{8}x_6 \\ x_4=\frac{69}{4}+\frac{3}{16}x_2+\frac{5}{8}x_5-\frac{11}{16}x_6 \\ \]

基本解為\(\left(33/4,0,3/2,69/4,0,0\right)\),目標值為\(111/4\)

3.3 以\(x_2\)為主元

三個約束分別為\(132,4,\infty\),第二個約束最緊

\[z=28-\frac{1}{6}x_3-\frac{1}{6}x_5-\frac{2}{3}x_6 \\ x_1=8+\frac{1}{6}x_3+\frac{1}{6}x_5-\frac{1}{3}x_6 \\ x_2=4-\frac{3}{8}x_3-\frac{2}{3}x_5-\frac{1}{3}x_6 \\ x_4=18-\frac{1}{2}x_3+\frac{1}{2}x_5 \]

此時目標函式中所有的係數都是負的,這種情況只發生在重寫的線性規劃使得基本解就是一個最優解的情況

\(\left(8,4,0,18,0,0\right)\),目標值為\(28\)為最優

正式的單純形法

需要解決的問題

  • 如何確定一個線性規劃是否可行
  • 如果線性規劃可行,初始基本解不可行,該怎麼辦
  • 如何確定一個線性規劃是無界的
  • 如何選擇換入變數和換出變數

輸入

  1. $m\times n $ 矩陣 \(\bold A=(a_{ij})\)
  2. \(m\)維的向量\(\bold b=(b_i)\)
  3. \(n\)維向量\(\bold c=(c_j)\)

返回:

  • 可行,初始基本解可行的鬆弛型,\(n\)維向量\(\overline {\bold x}=\left(\overline x\right)\)
  • 不可行

單純形法虛擬碼

第一行呼叫INITIALIZE-SIMPLEX(A,b,c),確定這個線性規劃是否可行。

如果目標函式中所有的係數都是負值,第2行的while迴圈終止;否則在第3行,選擇一個在目標函式中係數為正值的變數\(x_e\)作為換入變數。

下一步,在4-8行,檢查每個約束,挑選出最嚴格的限制\(x_e\)能增加而不違反非負約束的那個約束,記和這個約束關聯的基本變數是\(x_l\)此時如果沒有約束限制換入變數能夠增加的量,在第10行返回“無界”

然後呼叫主元過程,呼喚換入變數與換出變數的角色。

第12-15行,通過把所有非基本變數設為0以及把每個基本變數\(\overline{x_i}\)設為\(b_i\),來計算初始線性規劃變數\(\overline{x_1}...\overline{x_n}\)的一個解,將其作為最優解。

TODO

  1. 證明如果SIMPLEX有一個初始可行解且最終會結束,那麼它要麼返回一個可行解,要麼確定線性規劃無界
  2. 說明SIMPLEX會終止
  3. 說明返回的解是最優的

這部分詳細證明見《演算法導論》P493

對偶性

引入原因:前面已經說明了單純形法能終止,但沒有證明確實能找到一個最優解。因此引入線性規劃對偶性

例題

以上文例題為例

\[z = 3x_1+x_2+2x_3 \\ x_1+x_2+3x_3\le30 \\ 2x_1+2x_2+5x_3\le24\\ 4x_1+x_2+2x_3\le36 \]

其對偶線性規劃為

最小化

\[30y_1+24y_2+36y_3 \]

滿足約束

\[y_1+2y_2+4y_3\ge3 \\ y_1+2y_2+y_3\ge1\\ 3y_1+5y_2+2y_3\ge2 \\ \]

其中\(y_1,y_2,y_3\ge0\)

正確性

定理29.10,證明對偶線性規劃的最優值總是等於原線性規劃的最優值。單純形法同時解決了原線性規劃和對偶線性規劃

線性規劃弱對偶性

\(\overline x\)表示原線性規劃的任意一個可行解,\(\overline y\)​表示對偶線性規劃的任意一個可行解。則

\[\sum^n_{j=1}c_j\overline{x_j} \le\sum^m_{i=1}b_i\overline{y_j} \]

證明基本是求和號變換的過程

推論

如果

\[\sum^n_{j=1}c_j\overline{x_j} =\sum^m_{i=1}b_i\overline{y_j} \]

\(\overline x\)\(\overline y\)分別是原線性規劃和對偶線性規劃的最優解

初始基本可行解

目標:

  1. 如何測試一個線性規劃是否可行
  2. 如果可行,如何產生一個基本解可行的鬆弛型

即敘述INITIALIZE-SIMPLEX的過程

反例:初始基本解不可行

\[\text{最大化}z = 2x_1-x_2 \\ \text{滿足約束}\\ 2x_1-x_2\le2 \\ x_1-5x_2\le-4\\ x_1,x_2\ge0 \]

如果要將這個線性規劃轉換為鬆弛型,基本解為\(x_1=x_2=0\),顯然違反了一個約束,所以這不是一個可行解。

為了確定他是否有可行解,可以指定一個輔助線性規劃,可以幫助找到一個基本解可行的鬆弛型,進而判斷是否可行

輔助線性規劃

引理

以標準型線性規劃\(L\)為例

\[\text{最大化}\sum^n_{j=1}c_jx_j \\ \text{滿足約束}\\ \sum^n_{j=1}a_{ij}x_j \le b_i,i=1,2,...m \\ x_j\ge0,j=1,2,...m\\ \]

\(L_{aux}\)是下面帶有n+1個變數的線性規劃

\[\text{最大化}-x_0 \\ \text{滿足約束}\\ \sum^n_{j=1}a_{ij}x_j-x_0 \le b_i,i=1,2,...m \\ x_j\ge0,j=1,2,...m\\ \]

當且僅當\(L_{aux}\)的最優目標值是0時,\(L\)是可行的

演算法

下面是虛擬碼

1-3行,測試了\(L\)的初始鬆弛型的基本解,如果這個解可行,返回這個鬆弛型

第4行構造引理中的\(L_{aux}\),因為\(L\)的初始基本解不可行,所以\(L_{aux}\)的初始基本解不可行。在第7行執行一次主元過程,把\(x_0\)換入,\(x_l\)為換出變數,其中l在第1行中選擇為最小的\(b_i\)的下標。

然後可以在第9行重複主元來解決輔助線性規劃。如果找到一個目標值為0的\(L_{aux}\)的最優解,那麼就可以在第11行中為\(L\)構造一個基本解可行的鬆弛型,在約束中刪除所有的\(x_0\)項,恢復初始目標函式。

如果在第10行發現初始\(L\)不可行,那麼在第12行返回

例項

對於前面構造的反例

\[\text{最大化}z = 2x_1-x_2 \\ \text{滿足約束}\\ 2x_1-x_2\le2 \\ x_1-5x_2\le-4\\ x_1,x_2\ge0 \]

構造輔助線性規劃為

\[\text{最大化}-x_0 \\ \text{滿足約束}\\ 2x_1-x_2-x_0\le2 \\ x_1-5x_2-x_0\le-4\\ x_1,x_2,x_0\ge0 \]

根據引理,如果最優目標值是0,則初始線性規劃有一個可行解。如果輔助線性規劃的最優目標數是正數,則沒有可行解

寫成鬆弛型

\[z=-x_0\\ x_3=2-2x_1+x_2+x_0 \\ x_4=-4-x_1+5x_2+x_0 \]

選擇\(x_0\)作為換入變數,最小的\(b_i\)\(-4\),對應\(x_4\)。所以換出變數應為\(x_4\)

\[z=-4-x_1+5x_2-x_4\\ x_0=4+x_1-5x_2+x_4 \\ x_3=6-x_1-4x_2+x_4 \]

對應的基本解\((4,0,0,6,0)\)這是可行的。

重複呼叫主元過程,直到得到\(L_{aux}\)的最優解。以\(x_2\)為換入變數,\(x_0\)為換出變數\((\because~4/5<6/4)\)

\[z=-x_0\\ x_2=\frac{4}{5}-\frac{1}{5}x_0+\frac{1}{5}x_1+\frac{1}{5}x_4 \\ x_3=\frac{14}{5}-\frac{4}{5}x_0-\frac{9}{5}x_1+\frac{1}{5}x_4 \\ \]

這個解有\(x_0=0\),所以初始問題是可行的,將\(x_0\)從約束集合中刪去

\[z=2x_1-x_2 =2x_1-(\frac{4}{5}-\frac{1}{5}x_0+\frac{1}{5}x_1+\frac{1}{5}x_4) \\ =\frac{4}{5} + \frac{9}{5}x_1-\frac{1}{5}x_4 \] \[x_2 = \frac{4}{5} + \frac{9}{5}x_1-\frac{1}{5}x_4 \\ x_3 = \frac{14}{5}-\frac{9}{5}x_1+\frac{1}{5}x_4 \]

線性規劃基本定理

以標準型給出任意的線性規劃\(L\)可以是以下三者之一:

  1. 有一個有限目標值的最優解
  2. 不可行
  3. 無界