max=x1^2+x2^2+3*(x3)^2+4*(x4)^2+2*(x5)^2-8*x1-2*x2-3*x3-x4-2*x5;
X1+X2+X3+X4+X5<=400;
X1+2*X2+2*X3+X4+6*X5<=800;
2*X1+X2+6*X3<=200;
X3+X4+5*X5<=200;
X1<=99;
X2<=99;
X3<=99;
X4<=99;
X5<=99;
@gin(x1);
@gin(x2);
@gin(x3);
@gin(x4);
@gin(x5);
function [f,g]=mengte(x);
f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)^2-8*x(1)-2*x(2)-3*x(3)-x(4)-2*x(5);
g(1)=sum(x)-400;
g(2)=x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800;
g(3)=2*x(1)+x(2)+6*x(3)-200;
g(4)=x(3)+x(4)+5*x(5)-200;
clc,clear
p0=0;
tic
for i=1:10^5
x=99*rand(5,1);
x1=round(x);
[f,g]=mengte(x1);
if sum(g<=0)==4
if p0<=f
x0=x1;p0=f;
end
end
end
x0,p0
toc
楼上 @sinxlg1 说的有道理,非线性优化一般会存在多个局部最优点,使用Lingo时,建议设置使用全局求解器,如图所示:
如果不选择全局求解器,得到的为局部最优解:
选择全局求解器之后,可以得到全局最优解:
MATLAB程序是用Monte-Carlo方法,即随机在给定范围内取点,如果满足所有的约束,则为可行解;如果该可行解比当前最优值更佳,则用新取的点代替原最优点。很显然这种做法需要足够多的尝试次数才有望得到比较靠谱的解,现在的设置为10^5,应该说比较大了,但并不能保证每次都得到相同的解,这是Monte-Carlo方法不可避免的偶然性。
在2011b之后的MATLAB版本中,遗传算法函数ga支持求解不含等式约束的混合整数规划问题,参考代码如下:
A = [ ...在多数情况下,可以求出全局最优解:
x =但应该注意,遗传算法本身也是一种带有随机因素的算法,并不能保证每次都得到真正的最优结果,有时也会得到其它解,例如
x =另外,根据你给的MATLAB程序,实际上隐含了xi>=0的约束条件。如果不考虑这个约束,实际上这个问题是无解的(xi可以取足够小的负数,目标函数趋近无穷大)。