这是我的问题:
我有6个参数,我在MATLAB的fmincon工具箱中有所不同,这些是限制:
variables=[x1,x2,x3,x4,x5,x6]
x1<=x2
x3<=x4
x5<=x6
所以,我为fmincon定义了这样的A矩阵:
A=[1 -1 0 0 0 0; 0 0 1 -1 0 0; 0 0 0 0 1 -1];
和向量b:
b=[0;0;0];
问题是fmincon并不尊重条件(如果它们定义得很好),我的意思是第一次迭代,参数是:
ddx=[1 1 1 1 1 1];
对于第二次迭代,变化是:
ddx=[2 1 1 1 1 1];
正如您所看到的,在边界中的定义存在错误,因为x1 = 2且x2 = 1;这是不对的。
我希望你能给我一些想法。
这是一个例子:
function Example
clc
global xo
lbr=[2,2,300,300,3,3];
upr=[8,8,2000,2000,6,6];
xo =[3,4,400,500,4,5];
Aeq=[];
beq=[];
% Matríz de condiciones
Ain=[1 -1 0 0 0 0;0 0 1 -1 0 0;0 0 0 0 1 -1];
bin=[0;0;0];
lb=lbr./xo;
ub=upr./xo;
xo_n=ones(1,size(upr,2));
options1 = optimset('Display','iter',...
'Algorithm','sqp','PlotFcns',@optimplotfval,...
'MaxIter',400,'MaxFunEvals',1000,'DiffMinChange',1);
[ddx, FOval] = fmincon(@MyfunSSI,xo_n,Ain,bin,Aeq,beq,lb,ub,[],options1);
end
function [FO]=MyfunSSI(ddx)
global xo
ddx
x1=xo(1)*ddx(1);
x2=xo(2)*ddx(2);
x3=xo(3)*ddx(3);
x4=xo(4)*ddx(4);
x5=xo(5)*ddx(5);
x6=xo(6)*ddx(6);
% These are the conditions:
x1<=x2
x3<=x4
x5<=x6
FO=1;
end
如您所见,这些限制未得到遵守。
答案 0 :(得分:0)
函数fmincon终止后,它应该满足约束条件,或者表示它找不到可行的解决方案。
在优化迭代期间违反约束,对于某些问题可能是有利的,因此fmincon中的一些算法(至少是活动集算法)支持这一点。如果您不喜欢此行为,请使用内部点。有关详细信息,请参阅fmincon algorithms和violating constraints。
编辑出错的是您的目标函数MyfunSSI
。它只返回1,因此没有什么可以最小化。另外,您只是放置约束语句,而不以任何方式处理它们。约束由A
和b
矩阵处理,所以忘记这些。但主要的是:将函数更改为使用输入ddx
来生成输出值FO
的正确目标函数。
顺便说一句,以这种方式使用sqp
意味着优化器将使用有限差分,从而评估 near 可行的目标函数,因此可能不可行点。