線性規划
首先一般所有的線性規划問題我們都可以轉換成如下標准型:
但是我們可以發現上面都是不等式,而我們計算中更希望是等式,所以我們引入這個新的概念:松弛型:
很顯然我們最后要求是所有的約束左邊的變量都不小於0。而求解這類問題,我們又有一套十分便利的模型算法:單純形
基變量:松弛型等式左邊的所有變量
非基變量:松弛型等式右側的所有變量
基本解:一組基變量和非基變量蘊含着一組基本解,即所有的非基變量都為0,基變量都為等式右側的常數項(這里要求常數項為正,為負時我們后面討論)
算法原理:
可證線性規划的解空間是一個凸形區域,也就是說全局最優解只有一個,或者同時有多個平行的最優解。由上性質我們可以知道,局部最優解一定時全局最優解,這就是單純形的算法思想。
算法過程:
轉軸操作:選擇一個基變量和非基變量,將其互換
simplex操作:主過程,從一個基本解出發,經過一系列的轉軸操作,找到最優解
舉例:
求解如下問題:
第一步:互換x1與x6
第二步:互換x3與x5
第三步:互換x2與x3
此時我們得到的基本解:(x1, x2, x3, x4, x5, x6) = (8, 4, 0, 18, 0, 0),易驗證就是最后的最優解
算法偽代碼:
1 def Simplex(A, b, c): 2 initialization(A, b, c) 3 while there is e that Ce > 0 do: 4 find the index l that Ale > 0 and minimizes bi/Ale 5 if all l, Ale <= 0 then: 6 return Unbounded 7 else: 8 pivot(A, b, c, l, e)
其中我們發現有一個“initialization”函數就是用於處理我們的bi<0的情況,它的做法是引入一個輔助的線性規划:
這樣經過一次轉軸操作以后,第l個約束變為:
其余的變為:
易知此時對於新的bi滿足都不小於0
對偶問題
定義:
用矩陣表示更形象,而且也更利於我們后期的計算與理解:
因此我們在面對這類問題時可以考慮它們之間的相互轉化。這里不加證明給出一下定理:
互為對偶問題的兩組最優解相等
后續更新Simplex算法的python實現……