MatlabLingo:数模10-非线性规划与01规划模型

Posted fxalll

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MatlabLingo:数模10-非线性规划与01规划模型相关的知识,希望对你有一定的参考价值。

非线形规划例题

在这里插入图片描述

非线形规划例题(lingo解法)

在这里插入图片描述
在这里插入图片描述

非线形规划例题(Matlab解法)

在这里插入图片描述
首先建立脚本:

function f = fun1(x)
f = -98*x(1) - 277*x(2) + x(1)^2 + 0.3*x(1)*x(2) + 2*x(2)^2;
end

注意由于题目是max,需要改成标准形式。所有的符号都要变号。(而“数模9”文章给的代码自动转换了,所以max可以直接输入,这个要自己创建函数文件,所以需要自己修改为标准型)

保存为fun1.m。

再建立脚本:

function [g,h] = fun2(x)
g(1) = x(1) + x(2) - 100;
g(2) = x(1) - 2*x(2);
h = 0;
end

其中g是不等式约束,h是等式约束。

保存为fun2.m。

最后建立一个脚本:

disp('max(0) or min(1)?');
Judge=input('Judge=');
options = optimset;
[x, y] = fmincon('fun1', rand(2,1), [], [], [], [], zeros(2,1), [], 'fun2', options);
if Judge==0
    x
    fval=-y
else
    x
    fval=y
end

在写fun2时,可以把线性和非线性约束的等式和不等式约束都按照这种格式写到这个函数里面,这样的话fun2就包含了所有约束条件,在后面运行fmincon()时不需要再写A,B,Aeq,Beq,直接用[]略过。

‘fun1’代表目标函数,rand(2,1)随机给了x初值,zeros(2,1)代表下限为0,即x1,x2>=0, 'fun2’即刚才写的约束条件。

运行后得到:
在这里插入图片描述
与lingo给的结果基本一致。

01规划模型定义及例题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

01规划模型例题(lingo解法)

在这里插入图片描述
在这里插入图片描述

01规划模型例题(Matlab解法)

原本可用以解决的bintprog在2014年被废除了,面对这样大的数据我尝试了几个都报错,如果有人可以把这道题用Matlab解答请私信我。

(尝试1:)

disp('max(0) or min(1)?');
Judge=input('Judge=');
f=[8,13,18,23,10,14,16,27,2,10,21,26,14,22,26,28];
A=[];
b=[];
Aeq=[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0;
    0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0;
    0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0;
    0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1;
    1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0;
    0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0;
    0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0;
    0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1];
beq=[1,1,1,1,1,1,1,1];
lb=[0;0;0;0;0;0;0;0];
ub=[inf;inf;inf;inf;inf;inf;inf;inf];
if Judge==0
    [x,fval]=linprog(-f,A,b,Aeq,beq,lb,ub);
    x
    fval=-fval
else
    [x,fval]=linprog(f,A,b,Aeq,beq);
    x
    fval
end

(尝试2:)

function f = fun1(x)
f = 8*x(11)+13*x(12)+18*x(13)+23*x(14)+10*x(21)+14*x(22)+16*x(23)+27*x(24)+2*x(31)+10*x(32)+21*x(33)+26*x(34)+14*x(41)+22*x(42)+26*x(43)+28*x(44);
end
function [g,h] = fun2(x)
g = 0;
h(1) = x(11)+x(12)+x(13)+x(14)-1;
h(2) = x(21)+x(22)+x(23)+x(24)-1;
h(3) = x(31)+x(32)+x(33)+x(34)-1;
h(4) = x(41)+x(42)+x(43)+x(44)-1;
h(5) = x(11)+x(21)+x(31)+x(41)-1;
h(6) = x(11)+x(21)+x(31)+x(41)-1;
h(7) = x(13)+x(23)+x(33)+x(43)-1;
h(8) = x(14)+x(24)+x(34)+x(44)-1;
end
disp('max(0) or min(1)?');
Judge=input('Judge=');
options = optimset;
[x, y] = fmincon('fun1', rand(16,1), [], [], [], [], zeros(16,1), [], 'fun2', options);
if Judge==0
    x
    fval=-y
else
    x
    fval=y
end

以上是关于MatlabLingo:数模10-非线性规划与01规划模型的主要内容,如果未能解决你的问题,请参考以下文章

Python数模笔记-PuLP库线性规划实例

Python数模笔记-Scipy库线性规划问题

数模常用算法系列--整数线性规划(分枝定界法)整数非线性规划(蒙特卡洛法)

Python数模笔记-模拟退火算法约束条件的处理

Python数模笔记-PuLP库线性规划入门

Python数模笔记-PuLP库线性规划进阶