MATLAB轻松解决优化问题——线性规划、0-1整数规划

线性规划问题是目标函数约束条件均为线性函数(Liner Function)的问题;

MATLAB解决的线性规划问题的标准形式为:
MATLAB轻松解决优化问题——线性规划、0-1整数规划
其中 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。我们来通过下面的例子来学习该参数的意义。

例:
MATLAB轻松解决优化问题——线性规划、0-1整数规划
由于题目本身不难,首先直观上可以用暴力求解尝试各种方案组合,尽量安排每个工人做其相应工作时间最短的工作,不难得出:

甲 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

可见与我们暴力求解的最优化方案一致!

上一篇:matlab线性规划


下一篇:线性规划