1. 程式人生 > 其它 >MATLAB輕鬆解決優化問題——線性規劃、0-1整數規劃

MATLAB輕鬆解決優化問題——線性規劃、0-1整數規劃

技術標籤:數學建模Matlabmatlab01規劃線性規劃

線性規劃問題是目標函式約束條件均為線性函式(Liner Function)的問題;

MATLAB解決的線性規劃問題的標準形式為:

其中 f、x、b、beq、lb、ub 為向量,A、Aeq 為矩陣。
其它形式的線性規劃問題都可經過適當變換化為此標準形式。

線性規劃問題(Linear Programming)已用函式 linprog 取代了舊版中的 lp 函式。當然,由於版本的向下相容性,一般說來,低版本中的函式在新版中仍可使用。

linprog函式

x = linprog(f,A,b) %求 min f' *x sub.to A ⋅ x ≤ b 線性規劃的最優解。
x =
linprog(f,A,b,Aeq,beq) %等式約束 Aeq ⋅ x = beq ,若沒有不等式約束 A ⋅ x ≤ b ,則 A=[ ],b=[ ]。 x = linprog(f,A,b,Aeq,beq,lb,ub) %指定 x 的範圍lb ≤ x ≤ ub ,若沒有等式約束 Aeq ⋅ x = beq ,則 Aeq=[ ],beq=[ ] x = linprog(f,A,b,Aeq,beq,lb,ub,x0) %設定初值 x0 x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options) % options 為指定的優化引數 [x,fval] = linprog
() % 返回目標函式最優值,即 fval= f ' *x。 [x,lambda,exitflag] = linprog() % lambda 為解 x 的 Lagrange 乘子。 [x, lambda,fval,exitflag] = linprog() % exitflag 為終止迭代的錯誤條件。 [x,fval, lambda,exitflag,output] = linprog() % output 為關於優化的一些資訊

說明:若 exitflag>0 表示函式收斂於解 x,exitflag=0 表示超過函式估值或迭代的最大數字,exitflag<0 表示函式不收斂於解 x;

若 lambda=lower 表示下界 lb,lambda=upper 表示上 界 ub,lambda=ineqlin 表示不等式約束,lambda=eqlin 表示等式約束,lambda 中的非 0 元素表示對應的約束是有效約束;
output=iterations 表示迭代次數,output=algorithm 表示使用的運算規則,output=cgiterations 表示 PCG 迭代次數。

例:
求解

min         − 5x1 − 4x2 − 6x3  (目標函式)
sub.to      x1 − x2 + x3 ≤ 20  (約束條件)
            3x1 + 2x2 + 4x3 ≤ 42
			3x1 + 2x2 ≤ 30
			0 ≤ x1, 0 ≤ x2, 0 ≤ x3

程式:

clc,clear,close all
f = [-5; -4; -6];
A = [1 -1 1;3 2 4;3 2 0]; 
b = [20; 42; 30]; 
lb = zeros(3,1); 
[x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb)

執行結果:

x = %最優解
 0.0000 
 15.0000 
 3.0000 
fval = %最優值
 -78.0000 
exitflag = %收斂
 1
output = 
 iterations: 6 %迭代次數
 cgiterations: 0 
 algorithm: 'lipsol' %所使用規則
lambda = 
 ineqlin: [3x1 double]
 eqlin: [0x1 double]
 upper: [3x1 double]
 lower: [3x1 double]
>> lambda.ineqlin 
ans = 
 0.0000 
 1.5000 
 0.5000 
>> lambda.lower 
ans = 
 1.0000 
 0.0000 
 0.0000

表明:不等約束條件 2 和 3 以及第 1 個下界是有效的.

0-1整數規劃
0-1規劃是決策變數僅取值0或1的一類特殊的整數規劃。

intlinprog函式

[x,fval,exitflag]= intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)

官方文件
引數意義:

     f :目標函式的係數矩陣
intcon :整數所在位置
     A :不等式約束的變數係數矩陣
     b :不等式約束的資源數
   Aeq :等式約束的變數係數矩陣
   beq :等式約束的資源數
    lb :變數約束下限
    ub :變數約束上限

該函式的使用和linprog函式的使用十分相似,其僅僅在linprog函式的基礎上多了一個引數——intcon。我們來通過下面的例子來學習該引數的意義。

例:

由於題目本身不難,首先直觀上可以用暴力求解嘗試各種方案組合,儘量安排每個工人做其相應工作時間最短的工作,不難得出:

甲 A
乙 D
丙 C
丁 B

這個方案,最短時間為70.

接下來用整數0-1模型求解驗證;

首先建立模型:

min   15x1+18x2+21x3+24x4+19x5+23x6+22x7+18x8+26x9+17x10+16x11+19x12+19x13+21x14+23x15+17x16
%目標函式:令工作時長最短.
sub.to
x1+x2+x3+x4=1
x5+x6+x7+x8=1
x9+x10+x11+x12=1
x13+x14+x15+x16=1
x1+x5+x9+x13=1
x2+x6+x10+x14=1
x3+x7+x11+x15=1
x4+x8+x12+x16=1
x1~16=01
%約束條件滿足甲乙丙丁四人各完成一件不同的工作.
clc,clear,close all
f = [15 18 21 24 19 23 22 18 26 17 16 19 19 21 23 17];
ic = [1:16];
Aeq = [ones(1,4),zeros(1,12);...
    zeros(1,4),ones(1,4),zeros(1,8);...
    zeros(1,8),ones(1,4),zeros(1,4);...
    zeros(1,12),ones(1,4);...
    [1,zeros(1,3),1,zeros(1,3),1,zeros(1,3),1,zeros(1,3)];...
    [0,1,zeros(1,3),1,zeros(1,3),1,zeros(1,3),1,zeros(1,2)];...
    [zeros(1,2),1,zeros(1,3),1,zeros(1,3),1,zeros(1,3),1,0];...
    [zeros(1,3),1,zeros(1,3),1,zeros(1,3),1,zeros(1,3),1]];
beq = ones(8,1);
lb = zeros(16,1);		
ub = ones(16,1);			
[x,fval] = intlinprog(f,ic,[],[],Aeq,beq,lb,ub)	

執行結果:

LP:                Optimal objective value is 70.000000.                                            


Optimal solution found.

Intlinprog stopped at the root node because the
objective value is within a gap tolerance of the optimal value,
options.AbsoluteGapTolerance = 0 (the default value). The intcon variables are
integer within tolerance, options.IntegerTolerance = 1e-05 (the default value).

x =
     0
     1
     0
     0
     1
     0
     0
     0
     0
     0
     1
     0
     0
     0
     0
     1
fval =
    70

可見與我們暴力求解的最優化方案一致!