標准型
假設A是一個行滿秩的矩陣,否則通過一些變化可以使A變成行滿秩
如果將一個一般化的線性規划問題化成一個標准型?
如果在原始的線性規划問題中,有的變量不是非負的(自由變量),那么我們可以用兩個非負的變量替代它,即
如果有的約束條件是等式,則可以等價地用兩個不等式進行表示,即
如果有的約束形如 \(\sum_{i=1}^n a_{ji}x_i \ge b\),在不等式兩邊同時取負號即可
松弛型
可以在標准型的基礎上加入一些松弛變量從而轉化為松弛型。
單純形法
現在針對標准型,考慮單純形法,可以看出相較於線性方程組,松弛型的線性規划問題多了目標函數和變量的非負約束。
變量非負性
變量非負性的約束實質上使得線性方程組的可行域變成了多面體,考慮\(\sum_{i=1}^n a_{ji}x_i = b\) ,因為\(x_1 \ge 0\) ,所以有 \(-\sum_{i=2}^n a_{ji}x_i + b\ge 0\),即對可行域有了一個線性的約束
目標函數
目標函數的存在,使得最優解會在可行域的頂點處產生。所以,不需要考慮可行域的內點,只需要在頂點集合內進行搜索最優解即可。
了解了線性規划問題和線性方程組問題的區別之后,我們將線性規划問題轉化成了在一個多面體區域內,找尋最優解對應的那個頂點,看起來好像很簡單,但是隨着約束數量的增加,頂點個數也是以指數形式不斷增加,如何有效地搜索最優解呢?我們可以考慮以下四個問題:
- 為什么我們最優解一定會在頂點處?
- 怎么樣從線性規划問題中得到它的頂點?
- 得到頂點后,如何在每一步迭代過程中對目標函數值進行提升?
- 迭代到什么程度停止?
解決了這四個問題,就得到了一個可以獲得線性規划問題解的一個可行算法,那我們一個一個來解決這些問題。
1.為什么我們最優解一定會在頂點處?
這里我們利用反證法,不妨假設最優解在多面體內部,那么這個點一定可以用頂點進行線性表出,那么最優解會有一個頂點分解,即\(c^Tx=\lambda_1 c^Tx_1+\lambda_2 c^Tx_2+\cdots+\lambda_k c^Tx_k,\sum_{i=1}^k \lambda_i=1\),那么取這些頂點中目標函數值最小的那個頂點即 \(x_j, j = argmin\{\lambda_j c^Tx_j\}\) ,則有\(c^Tx\ge c^Tx_j\),只有當\(x=x_j\)時,等式成立,與\(x\)是非頂點的最優解矛盾,所以最優解一定會在頂點處。
2.怎么樣從線性規划問題中得到它的頂點?
首先,我們會得到一個很直觀的認識,即可行域這個多面體的任何一個頂點對應了矩陣A的一組基。
很直觀的我們可以知道,可行域的一個頂點x對應了約束條件等號成立下的一組解,不妨記作\((x_1,x_2,\cdots,x_n)^T\),假設前m個坐標非0,下面證明A中對應的這m個列向量是A的一組基:
還是利用反證法,假設\(x_1,x_2,\cdots,x_m\)線性相關,也即是說,存在一組不全為0的參數\({\lambda_i}\),使得\(\lambda_1x_1+\lambda_2x_2+\cdots+\lambda_mx_m=0\),構造一個向量\(\lambda = (\lambda_1,\lambda_2,\cdots,\lambda_m,0,0,\cdots,0)^T\),可以知道\(A\lambda=0\)。那么對於兩個與該頂點共線的點\(x'=x+\theta \lambda\)和\(x'=x-\theta \lambda\),都有\(Ax'=Ax''=b\) ,即這兩個點也都在可行域內,那么就與x是凸多面體的頂點(不能由凸多面體內其他點線性表出)矛盾了。所以這一組線性向量線性無關。
那么為什么說這一組向量就是矩陣A的一組基呢?考慮A的一個子矩陣,A‘,由前m列組成。因為其余項為0,所以有\(Ax=A'x'=b\),因為矩陣A‘行滿秩,所以很自然的可以得出,\(x'=(x_1,x_2,\cdots,x_m)^T\)是A’的一組基,也即是A的一組基。
這樣我們就把凸多面體可行域這一具象的概念和矩陣的一組基這一抽象概念建立起了聯系,而后者則是利於編程實現的。只要能找到矩陣的一組基,就意味找找到了可行域中的一個頂點。
3.得到頂點后,如何在每一步迭代過程中對目標函數值進行提升?
既然一組基對應了一個頂點,我們知道,可行域會有多個頂點,也即對應了線性規划的矩陣的多組基,怎么從這些基中進行選基呢?
假設\(x’=(x_1,x_2,\cdots,x_m)^T\)對應了A’的一組基,而\(x=(x_1,x_2,\cdots,x_m,0,\cdots,0)^T\)即對應了A的一組基,對應的列向量用\(a_i\)表示,現在我們考慮一個非基變量\(a_k\),那么它一定可以寫成基變量的一個線性組合,不妨寫作\(a_k = \lambda_1a_1+\lambda_2a_2+\cdots+\lambda_ma_m\),現在我們構建一個新的向量\(x_{updata}=x-\theta\lambda\),其中\(\lambda=(\lambda_1,\lambda_2,\cdots,\lambda_m,0,\cdots,-1,\cdots,0)^T\) ,\(\theta>0\),看看這個向量相較於原向量有什么變化。
注意到非基向量對應的系數為-1,即在\(x_{updata}\)中,\(a_k\)對應的解變量大於0,基變量中對應系數為負數的解變量仍然大於0,而對應系數為負數的那部分解變量,隨着\(\theta\)的增加,肯定會有一個分量先到達0,此時恰好有n個基變量大於0,即對應了新的一組基。從幾何上進行理解,是\(a_k\)和之前基向量中的某m-1個基向量組成一組新的基,對應了可行域的另一個定點,而\(\lambda\)則是連接着兩個頂點的方向向量。
這個時候,系數向量實際是是從可行域的一個頂點指向另一個頂點的。我們可以借助於基變換進行理解,既然\(a_k\)可以寫作當前基向量的一個線性組合,那么\(a_k\)必然可以和當前基向量中的某m-1個基向量組成一組新的基\((a_1',a_2',\cdots,a_m')^T\),對應了可行域的另一個頂點,而此時對應的坐標變換為\(x=x'-\theta\lambda\) ,所以我們知道了如何從一個頂點轉移到了另一個頂點,那么我們怎么去選擇呢?
從上述過程可以看出,頂點轉移過程其實就是基變換的過程,也即是從當前基向量中選擇一個出基向量,從非基向量中選擇一個進基向量構成一組新的基向量。那么如何選擇進基向量和出基向量?
出基變量的選擇:
考慮從頂點出發,沿邊的方向行進的距離\(\theta\)。取\(\theta=\min_{\lambda_i>0} \frac{x_i}{\lambda_i}\) ,此時出基變量對應解變量值為0,其他基變量大於0,而進基變量對應值大於0,此時得到了一組新的基。如果\(\theta\)過大,\(\theta\gt\min_{\lambda_i>0} \frac{x_i}{\lambda_i}\),則存在解變量小於0,即當前點不在可行域內;而如果\(\theta\)過小,\(\theta\gt\min_{\lambda_i>0} \frac{x_i}{\lambda_i}\),則有解變量之間線性相關,並非可行域的一個頂點,所以只能選擇\(\theta=\min_{\lambda_i>0} \frac{x_i}{\lambda_i}\)。
進基變量的選擇
當從一個頂點轉移到另一個頂點時,目標函數的變化值為\(c^Tx_{update}-c^Tx=-\theta c^T\lambda=(c_e-\sum\lambda_ic_i)\theta\) ,因為我們希望目標函數越來越小,即是\((c_e-\sum\lambda_ic_i)\theta\) 盡可能小。此時當前步的轉移獲得的收益最大。
4.迭代到什么程度停止?
如果當前狀態,如果所有的非基向量對應的\((c_e-\sum\lambda_ic_i)\theta\ge 0\)總成立,即不存在一個相鄰定點比當前頂點更優,則迭代停止。