線性規划(Linear Programming Problem:LPP)是凸優化以及現實生活中經常遇到的問題,解決線性規划問題常用的方法有單純形法(Simlex Method)(普通單純形法,大M法,兩階段法,對偶單純形法)以及內點法(karmarkar method)
matlab中求解線性規划使用 linprog(f, A, b, Aeq, beq, lb, ub)以及revised(c, b, a, inq, 1)
注:f為目標函數(min形式)系數矩陣,A為限制條件系數矩陣,b為右端值矩陣(元素可以小於零),Aeq為等式約束的系數矩陣,beq為等式約束的右端值矩陣,lb和ub為未知數的下限和上限
1.LPP
2.Simplex Method
每一次迭代的tableau 格式如下:
=====================================================================
=====================================================================
換入基、換出基的選擇:
原理:
所以標准型可以換成以下的形式:
迭代的思想:
解的情況討論:
========================================================================
========================================================================
2.1 Simplified Simplex Method (普通單純形)
LPP中的約束條件全是等式約束
standard form
注:這里的右端值b必須全部非負
下面舉例說明該種方法的應用以及matlab的兩種實現
Solution
首先引入變量(slack or surplus)將原問題轉為標准格式:
下面開始迭代:
first tableau
將x1作為基變量換出x4
second tableau
將x2作為基變量換出x3
third tableau
可以看到
所有的z_j-c_j都是非負的,所以此時的x值是最優值,答案為:
matlab實現
linprog() :
注意:linprog()解決問題的標准格式如下:
所以需要轉換原問題為最小化問題!!!
f = [-2, -1]; A = [3 4; 6 1]; b = [6 3]; [x, fval] = linprog(f, A, b)
下面貼出運行結果
revised():
注意:該函數不是內置函數,需要自行下載函數,附上網址:http://cn.mathworks.com/matlabcentral/fileexchange/26554-revised-simplex-method?focused=5147615&tab=function
c = [2 1]; A = [3 4; 6 1]; b = [6 3]; inq = [-1 -1]; revised(c, b, A, inq, 0)