在求解LP問題時,有人給出了圖解法,但對多維變量時,卻無能為力。
於是,美國數學家G.B. Dantzig (丹捷格)發明了一種“單純形法”的代數算法,尤其是方便於計算機運算。這是運籌學史上最輝煌的階段。
翻譯一下就是:
-
若某個基本可行解對應的檢驗向量<0,那么這個基本可行解就是最優的。
-
若某個基本可行解對應的檢驗向量=0,則有無窮多個最優解。
-
若某個基本可行解對應的檢驗向量>0,並且系數(約束條件)小於0,無解。
${C_N}$——非基變量系數
${C_B}$——基變量系數
B——基,即線性無關向量組R(A)=R(B)
N——非基向量組
單純形法計算步驟:
-
將線性規划問題化成標准型 (引入松弛變量)
-
找出或構造一個m階單位矩陣作為初始可行基,建立初始單純形表。
-
計算各非基變量的檢驗數${\sigma _j} = {c_j} - {z_j}$ 若所有檢驗數≤0,則問題已得到最優解,停止計算。否則,轉入下一步。(檢驗數)
-
在大於0的檢驗數中,若某個檢驗數對應的系數列向量≤ 0,則此問題是無界解,停止計算,否則轉入下步。
-
根據$max$(檢驗數$j$ | 檢驗數$j$>0)=檢驗數k的原則,確定為換入變量(進基變量) 再按最小比值法則($\frac{{{b_i}}}{{{a_{ik}}}}$,&${a_{ik}}$>0)確定換出變量,建立新的單純形表,此時的基變量中${x_k}$代替的換出變量的位置。
-
以${a_{ik}}$為主元素進行迭代,把${x_k}$所對應的列向量變為單位列向量,即${a_{ik}}$變為1 同列中其他元素變為0,繼續計算各非基變量的檢驗數,進行第三步。
&Lingo里面的方法就屬於單純形法。
例題:
①先引入三個松弛變量,構造單位矩陣。
②得到單位矩陣,構造出初始可行基B
從中我們可以get信息:基向量組B和非基向量組N
還可以知道所有變量的系數所組成的向量C和基變量${X_B}$、非基變量${X_N}$:
我們需要的檢驗數就是系數減去${Z_j}$(${\sigma _j} = {c_j} - {z_j}$,${Z_j} = {C_B}{N_j}$)
這是目標函數:$Z = {C_B}{B^{ - 1}}b + ({C_N} - {C_B}{B^{ - 1}}N){X_N}$ (b就是增廣矩陣多出來的那些)
當基矩陣B化成單位矩陣時,令非基變量${X_N}$=0,得到 $Z = {C_B}{B^{ - 1}}b$
③進行步驟3--6
填入信息
剛開始,基變量的系數全為0,所以Z=0,${Z_j}$=0,可以寫出對應的檢驗數:
x1 |
x2 | s1 | s2 | s3 |
50 | 100 | 0 | 0 | 0 |
可以看出,${x_2}$對應的檢驗數最大,成為換入變量,而且根據最小值法則,知道${s_3}$是換出變量。於是將${s_3}$的位置換上${x_2}$,對應的系數也變成了100。
我們再進行初等行變換,使${x_2}$,${s_1}$,${s_2}$對應的基矩陣變成單位矩陣。在此基礎上進行計算${Z_j}$,就可以利用其算出新一輪的檢驗數:
我們可以發現,仍然存在檢驗數大於0的情況,唉,只能進入新一輪的迭代,${x_1}$作為換入變量,而經過最小比值規則,可以判定出${s_1}$是換出變量
然后,我們再根據新的數據,寫出新一輪的${Z_j}$和 檢驗數 ,發現此時的檢驗數全部≤0,我們成功地找到了最優解!
結束啦!
表格中,檢驗數全部≤0,根據判斷規則,Z值為最優值(Z=27500),其解:
${X_1}$=50,${s_1}$=50,${X_2}$=250,${s_2}$=${s_3}$=0
為模型的最優解。