使用內點法解決線性規劃問題
1. 問題描述
這裏以一個簡單的線性函數爲例子:
min x+ys.t. x+2y≤10 2x+y≤10 x≥0 y≥0
最終,可行域在下圖中中間那部分,結合圖像可以很容易的得到最優值爲0。但是如何要使用程序從可行域的某個起始點收斂到最優值。
2. 問題建模
線性規劃問題的一般形式爲:
min cTXs.t. AX≤b
因此,對上一部分的那個例子按照這種形式表示,設c=(11),A=⎝⎜⎜⎛12−10210−1⎠⎟⎟⎞,b=⎝⎜⎜⎛1100⎠⎟⎟⎞,X=(xy),則原始問題可以表示爲線性規劃的一般形式。
使用拉格朗日方法將問題的目標與問題的約束條件放到一個函數裏面,得到下面這個函數:
f(x)=cTX+i=1∑mI(AjXj−b)
其中指示函數的定義爲:
I(x)={x,+∞,x≤0x>0
使用該指示函數可以確保最終的最小值一定是符合函數的約束條件的,但是這種分段函數存在不可導的點。所以,使用某個可導的函數代替,在這裏使用對數函數 −t1log(−x),其函數圖像如下所示,其中t越大,則該函數越貼近左側的x,y座標軸。
之後,問題的形式變成了:
f(x)=tcTX−i=1∑mlog(−AijXj+bi)
分別求解一階以及二階導數,對於X中的每個xk求一階導得到 ∇fxk=tck−i=1∑mAijXj−biAik,將一階導數向量化表示爲 ∇f=tc−ATAX−b1,同理,二階導表示爲 ∇2f=ATDA, 其中 D=(Ax−b)21.
在算法的開始,在可行域內選取任意一個作爲初始點,t的初始值設爲一個比較小的數,在迭代過程中慢慢增大t的值。在實際運行中發現,從點(3,3)開始,會逐漸收斂到(1.58,1,58)左右。因此,爲了進一步地收斂到最優值,在收斂到某個點後不再繼續收斂的情況下,應該繼續從該點開始,t重置爲一個較小的值。這樣最終可以收斂到(0,0)點。
代碼實現已上傳到Github,鏈接。