使用MATLAB定义限制fmincon的问题

时间:2014-09-30 16:42:29

标签: matlab optimization

这是我的问题:

我有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

如您所见,这些限制未得到遵守。

1 个答案:

答案 0 :(得分:0)

函数fmincon终止后,它应该满足约束条件,或者表示它找不到可行的解决方案。

在优化迭代期间违反约束,对于某些问题可能是有利的,因此fmincon中的一些算法(至少是活动集算法)支持这一点。如果您不喜欢此行为,请使用内部点。有关详细信息,请参阅fmincon algorithmsviolating constraints


编辑出错的是您的目标函数MyfunSSI。它只返回1,因此没有什么可以最小化。另外,您只是放置约束语句,而不以任何方式处理它们。约束由Ab矩阵处理,所以忘记这些。但主要的是:将函数更改为使用输入ddx来生成输出值FO的正确目标函数。

顺便说一句,以这种方式使用sqp意味着优化器将使用有限差分,从而评估 near 可行的目标函数,因此可能不可行点。