这里总结一下常用的规划模型的写法 以下内容包括 线性规划 整数规划 非线性规划 非线性+部分变量整数规划(这里尝试一种方法,如果有问题请大家指正)
首先是简单的线性规划模型
一般是使用下图这样的写法,使用 linprog 函数
[x,fval]=linprog(f,A,b,Aeg,beg,lb,ub,x0) %x0对应着初值,f对应系数的列向量,这里求解的是标准型,即min 下方是<=号的约束条件
f=[-4 3 2]';
A=[1 -2 2;
2 -1 -1];
b=[8;-4];
Aeg=[-1 0 1];
beg=[2]
lb=[1,0,0]';
ub=[4,4,4]';
[x,fval]=linprog(f,A,b,Aeg,beg,lb,ub);
非线性求解和非线性约束时fmincon函数
这里有四种option对应着四种不同的非线性规划的求解方法
option = optimoptions('fmincon','Algorithm','interior-point') 这里定义option, 后面一般可以有四种方法:interior point算法 (内点法)(也是matlab的默认算法);
'sqp';'active-set';'trust-region-reflective'
注意非线性约束的写法,这里举出一个三元的例子,用两个向量接收约束条件,一个不等式向量,一个等式向量(我下面就直接调用这个函数了)注意如果这里的等式约束或是不等式约束不存在的话,直接定义成空集就可以了
function y=demo(x)
y=floor(x(1)^2+x(2)^2+x(3)^2+x(4)^2);
end
function [g,h]=nonlfun(x)
g(1) = - x(1).^2 + x(2) - x(3).^2;
g(2) = (x(1) + x(2).^2 + x(3).^3 - 20);
% g代表不等式约束,Matlab中默认g<=0,所以这里取相反数
h(1) = - x(1).^2 - x(2).^2 + 2;
h(2) = x(2) + 2 * x(3).^2 - 3;
% h代表等式约束
end
option = optimoptions('fmincon','Algorithm','interior-point');
x0=[1 1 1 1 ]';
lb=[0 0 0 0 ]';
ub=[3 3 3 3 ]';
A=[1 2 3 4;
2 1 4 3];
b=[5;7];
Aeq=[1 1 1 1];
beq=[8];
[x,fval] = fmincon(@demo,x0,A,b,Aeq,beq,lb,ub,@nonlfun,option);
这里再来看一个matlab中的整数规划问题(from 清风数学建模)
%% 背包问题(货车运送货物的问题)
c = -[540 200 180 350 60 150 280 450 320 120]; % 目标函数的系数矩阵(最大化问题记得加负号)
intcon=[1:10]; % 整数变量的位置(一共10个决策变量,均为0-1整数变量)
A = [6 3 4 5 1 2 3 5 4 2]; b = 30; % 线性不等式约束的系数矩阵和常数项向量(物品的重量不能超过30)
Aeq = []; beq =[]; % 不存在线性等式约束
lb = zeros(10,1); % 约束变量的范围下限
ub = ones(10,1); % 约束变量的范围上限
%最后调用intlinprog()函数
[x,fval]=intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)
fval = -fval
那么杠精就要问了,如果我是一个非线性规划然后再加上一些整数型的变量呢?我们不妨在这里做以下的一个尝试,还是沿用上面的非线性规划模型,把目标函数和约束函数稍加修改
function f = demo1(x)
P=[2 3];%这里想要模仿的是可以取的几个离散解
f=floor(x(1)^2+x(2)^2+x(3)^2)+P(floor(x(4))+1);
end
function [c,ceq] = nonlfun1(x)
P=[2 3];%这里想要模仿的是可以取的几个离散解
c(1) = - x(1).^2 + x(2) - x(3).^2;
c(2) = P(floor(x(4))+1)*(x(1) + x(2).^2 + x(3).^3 - 20);
% g代表不等式约束,Matlab中默认g<=0,所以这里取相反数
ceq(1) = - x(1).^2 - x(2).^2 + 2;
ceq(2) = x(2) + 2 * x(3).^2 - 3;
% h代表等式约束
end
option = optimoptions('fmincon','Algorithm','interior-point');
x0=[1 1 1 1 ]';
lb=[0 0 0 0.1 ]';
ub=[3 3 3 1.1 ]';
A=[1 2 3 4;
2 1 4 3];
b=[5;7];
Aeq=[1 1 1 1];
beq=[8];
[x1,fval1] = fmincon(@demo1,x0,A,b,Aeq,beq,lb,ub,@nonlfun1,option);
这里尝试着对于目标函数和非线性约束都进行了整数的限制,至少程序没有报错,这里的正确性留待讨论 (最后取解的时候记得把x里面对应的整数部分拿函数里的P处理一下)