lingo代码改写为matlab代码,急!

model:
max = 4.8*x11+4.8*x21+5.6*x12+5.6*x22-10*x1-8*x2-6*x3;
x11+x12<x+500;
x21+x22<1000
0.5*x11-0.5*x21>0;

0.4*x12-0.6*x22>0;
x=x1+x2+x3;
(x1-500)*x2=0;
(x2-500)*x3=0;
x1<500;
x2<500;
x3<500;
end

参考代码:

function zd616583803928481452
% x11~x22为x(4)~x(7), x1~x3为x(1)~x(3)
c = [-10 -8 -6 4.8 5.6 4.8 5.6];
f = @(x)-c*x;
A = [-1 -1 -1 1    1    0    0;
      0  0  0 0    0    1    1;
      0  0  0 -0.5 0    0.5  0;
      0  0  0 0    -0.4 0    0.6
    ];
b = [500; 1000; 0; 0];
lb = zeros(7,1);
ub = [500; 500; 500; inf*ones(4,1)];
x0 = zeros(7,1);
warning off optim:fmincon:SwitchingToMediumScale
opt = optimset('MaxFunEvals',1e6,'Display','none');
x = fmincon(f,x0,A,b,[],[],lb,ub,@con,opt)

function [c,ce] = con(x)
c = [];
ce = [(x(1)-500)*x(2); (x(2)-500)*x(3)];

 

说明:

1、优化问题的约束条件一般应为“>=”或“<=”,否则,对应的集合为开集,很多问题未必有解。例如,min x,s.t. x>0 这样一个看似简单的问题却是无解的。

2、改写的代码中,没把x作为一个决策变量,而是直接将其表达式代入约束条件。

3、原Lingo代码似乎缺少了约束条件xi>=0(或者是Lingo隐含认为变量为正?),如果没有这个限制,x2=x3=0,x1取绝对值很大的负数,目标函数会大很多(设代码中变量lb=[]可得)。另,代码的第4行x21+x22<1000行尾缺少分号,属语法错误。

4、上述代码求解结果与Lingo相同,即x11=x21=500,其余为0。

温馨提示:答案为网友推荐,仅供参考
相似回答