MATLAB輕鬆解決優化問題——線性規劃、0-1整數規劃
阿新 • • 發佈:2021-02-18
線性規劃問題是目標函式和約束條件均為線性函式(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;
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=0 或 1
%約束條件滿足甲乙丙丁四人各完成一件不同的工作.
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
可見與我們暴力求解的最優化方案一致!