1. 规划问题的分类
在统筹优化类的问题中,规划论的问题是十分常见的,规划论主要分为线性规划和非线性规划,对于这两种规划的粗略定义如下:
- 线性规划:目标函数与约束条件均为线性
- 非线性规划:目标函数或者约束条件中有非线性函数的存在
关于线性函数的定义 传送门
2. 线性规划
解决线性规划问题在Matlab中主要使用linprog函数和intlinprog函数,这两个函数分别对应求解非整数规划问题和整数规划问题,其函数原型如下所示:
% 非整数规划
[x, fval] = linprog(f,A,b,Aeq,beq,lb,ub)
% 整数规划
[x,fval] = intlinprog(f,xint,A,b,Aeq,beq,lb,ub)
在Matlab中的函数原型如下所示 (字丑勿喷
相应的参数
参数 | Value |
---|---|
f | 目标函数的系数矩阵 |
A | 线性不等式的约束矩阵 |
b | 不等式右边的常数项 |
Aeq | 线性等式的左边系数 |
beq | 线性等式的右边系数 |
lb | 决策变量x的下边界变量 |
ub | 决策变量x的上边界变量 |
xint (整数规划独享) | 取值为整数的决策变量的下标 |
注意:不一定所有的规划问题都有这些元素,但是需要注意的是,如果没有,则需在等号右边加上[ ] 如:ub =[ ];
2.1 例子1
我们设有线性规划问题如下:
则对应的源代码有:
%f:目标函数的系数矩阵
f = [-72 -64];
%A:线性不等式的约束矩阵
A = [1,1;12,8;3,0];
%b:不等式右边的常数项
b = [50;480;100];
%Aeq:线性等式的左边系数
%beq:线性等式的右边系数
%没有的话输入空值
Aeq = [];
beq = [];
%lb:决策变量x的下边界变量
%ub:决策变量x的上边界变量
lb = [0 ,0 ];
ub =[];
%xint:取值为整数的决策变量的下标
xint = [1,2]; %这里表示x1和x2都要求取整数
[x,fval] = linprog(f,A,b,Aeq,beq,lb,ub)
[x,fval] = intlinprog(f,xint,A,b,Aeq,beq,lb,ub)
非整数规划结果:
整数规划结果:
2.2 例子2
f = [8 1];
A = [ 1 2 ;
4 1 ;
2 1 ];
b = [-14; -30; 20];
Aeq = [2,-1];
beq = [3];
lb = [-5,-40];
ub = [5,10];
xint = [2];
[x, fval] = intlinprog(f,xint,A,b,Aeq,beq,lb,ub)
最终结果
3. 非线性规划
对于求解非线性规划的问题,我们主要使用 fmincon来对函数进行求解,其函数原型如下:
[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,@nonlcon)
参数 | Value |
---|---|
x0 | 决策变量的初始向量 |
A b Aeq beq lb ub | 同线性规划 |
@nonlcon | 表示约束函数 |
fun | 使用目标函数句柄输入 |
其对应的标准型如下:
3.1 实例
源代码
%输入参数:
%fun: 使用目标函数句柄输入
fun = @(x)(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2))*exp(x(1))
%x0: 决策变量的初始向量
x0 = [0,0];
% A b Aeq beq lb ub 同线性规划
A = [2 1;3 5];
b = [4 ; 10];
Aeq = [1, -2];
beq = -1;
lb = [0,0];
ub = [];
% @nunlcon表示函数
[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,@nonlcon)
% nonlcon: 非线性约束函数的句柄
function [c,ceq] = nonlcon(x)
%不等式的约束有两个,写成矩阵的形式
%但是要注意两个等式都要将所有的项移到同一边才写句柄
c =[1 - x(1)*x(2);
x(1)*x(2)-1.5];
ceq = x(1)^2+x(2)^2-3;
end
计算结果
写在最后
各位看官,都看到这里了,麻烦动动手指头给博主来个点赞8,您的支持作者最大的创作动力哟! <(^-^)>
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知