线性规划问题是目标函数和约束条件均为线性函数(Liner Function)的问题;
MATLAB解决的线性规划问题的标准形式为:
其中 f、x、b、beq、lb、ub 为向量,A、Aeq 为矩阵。
其它形式的线性规划问题都可经过适当变换化为此标准形式。
线性规划问题(Linear Programming)已用函数 linprog
取代了旧版中的 lp
函数。当然,由于版本的向下兼容性,一般说来,低版本中的函数在新版中仍可使用。
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的一类特殊的整数规划。
[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
可见与我们暴力求解的最优化方案一致!