700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 规划问题——尝试 非线性规划+部分整数决策变量 的求解

规划问题——尝试 非线性规划+部分整数决策变量 的求解

时间:2022-12-01 02:30:33

相关推荐

规划问题——尝试 非线性规划+部分整数决策变量 的求解

这里总结一下常用的规划模型的写法 以下内容包括 线性规划 整数规划 非线性规划非线性+部分变量整数规划(这里尝试一种方法,如果有问题请大家指正)

首先是简单的线性规划模型

一般是使用下图这样的写法,使用 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'

注意非线性约束的写法,这里举出一个三元的例子,用两个向量接收约束条件,一个不等式向量,一个等式向量(我下面就直接调用这个函数了)注意如果这里的等式约束或是不等式约束不存在的话,直接定义成空集就可以了

这里放一个fmincon函数的例子 from/Arcann/article/details/109563868?ops_request_misc=&request_id=&biz_id=102&utm_term=matlab%20nonlcon%E7%94%A8%E6%B3%95&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-5-109563868.pc_search_insert_download&spm=1018.2226.3001.4187

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处理一下)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。