線性規划(Simplex單純形)與對偶問題


線性規划

首先一般所有的線性規划問題我們都可以轉換成如下標准型

但是我們可以發現上面都是不等式,而我們計算中更希望是等式,所以我們引入這個新的概念:松弛型

很顯然我們最后要求是所有的約束左邊的變量都不小於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實現……


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM