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

本文详细介绍了如何在MATLAB中进行线性规划、非线性规划和整数规划的模型建立及求解。通过示例展示了linprog和fmincon函数的使用,包括目标函数和约束条件的设置。同时,探讨了非线性规划结合整数变量的情况,并给出了一种可能的实现方式。此外,还提供了一个背包问题的整数规划解决案例。
摘要由CSDN通过智能技术生成

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


首先是简单的线性规划模型
一般是使用下图这样的写法,使用 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  https://blog.csdn.net/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处理一下)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桃花同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值