我正在使用MATLAB的优化工具箱“fmincon”,但我遇到了下一个问题:
我有6个参数可以改变,其中一些参数在偶数中变化,从4到16(这个值可能会有所不同,但偶数会有所不同)。所以让我们这样定义它们:
x1=[4:2:16];
x2=[4:2:16];
另外几个变量必须在300到1500之间变化,步长为100,我的意思是:
x3=[300:100:1500];
x4=[300:100:1500];
最后一对只是在4到6之间变化,如下所示:
x5=4:6;
x6=4:6;
参数的限制是:
x1<=x2
x3<=x4
x5<=x6
这里非常重要的一点是,fmincon
的变化无法做出很少的改变,我的意思是x1
的第一个值4
,不能4.0000000001
,因为在我的客观功能中,变化不会产生任何影响;并且有我的问题,因为步骤太少,所以变化什么都没有,算法停止,说目标函数没有变化。
我已设置fmincon
,DiffMinChange=1
,并且适用于第一次迭代,而且它们开始做的步骤太少。这是fmincon
的初始配置:
options1 = optimset('Display','iter',...
'Algorithm','sqp','PlotFcns',@optimplotfval,...
'MaxIter',400,'MaxFunEvals',2000,'DiffMinChange',1);
最初的限制是:
A=[1 -1 0 0 0 0;0 0 1 -1 0 0;0 0 0 0 1 -1];
b=[0;0;0];
更清楚的是,我正在寻找的是3个范围,让我们定义如下:
R1=[x1:2:x2];
R2=[x3:100:x4];
R3=[x5:x6];
编辑1:您可能知道每次评估目标函数大约需要2-3个小时。
正如你所看到的,最后我要找的是间隔的变化,因此开头的限制不能大于顶部的限制,否则等级将为空。 / p>
答案 0 :(得分:1)
嗯,这并没有解决如何使fmincon尊重这些限制,但只是一个潜在的想法......
给定您想要的范围,在限制为x1&lt; = x2,x3&lt; = x4,x5&lt; = x6之前,您有一个7x7x13x13x3x3的潜在变量组合空间,总共约75000个组合。这不是一个巨大的空间 - 为什么不在每个参数组合评估目标函数,然后使用min
找到目标函数的最小值?
答案 1 :(得分:0)
由于fmincon
是连续问题的优化程序,并且您的问题是离散的,因此问题与解决方案方法之间存在不一致,例如请参阅wiki。
您可以尝试使用离散优化求解器,例如branch and bound。由于您的可放置区域中的点数非常有限,因此蛮力方法也可以起作用(取决于您的目标函数所需的时间)。这样的事情应该适用于您的目标函数fun
:
lb = [4 4 300 300 4 4]; % lower bound
st = [2 2 100 100 1 1]; % step size
ub = [16 16 1500 1500 6 6]; % upoper bound
% init the best solution as infinity
bestF = inf;
bestX = nan(6,1);
% construct all permutations
for idx = 1:numel(lb)
% construct range
nextRange = (lb(idx):st(idx):ub(idx))';
if (idx==1)
permutations = nextRange;
else
a = repmat(permutations,numel(nextRange),1);
b = repmat(nextRange,1,size(permutations,1))';
permutations = [a,b(:)];
end
% remove permutations that do not satisfy constraints
if (idx==2)
permutations(permutations(:,1) > permutations(:,2),:) = [];
end
if (idx==4)
permutations(permutations(:,3) > permutations(:,4),:) = [];
end
if (idx==6)
permutations(permutations(:,5) > permutations(:,6),:) = [];
end
end
N = size(permutations,1);
assert(N == 7*4 * 13*7 * 6)
for idx = 1:N
candX = permutations(idx,:)';
% evaluate ...
candF = fun(candX);
% ... and if improvement, update best
if (candF < bestF)
bestF = candF;
bestX = candX;
end
end
% results
bestF
bestX
排列的数量等于15288,所以如果你的目标函数fun
需要.1秒(这是很多;)),你必须等待25分钟才能得到答案。
答案 2 :(得分:0)
我一直在很多论坛上阅读,我发现了一个非常有趣的解决方案,我尝试过并且实际上效果非常好。我发现目标函数之间存在一些差异。我在这里尝试的是使用fmincon,但是此功能仅适用于在所有范围内变化的目标函数,换句话说,在所有范围内都是可区分的。但这里存在差异,因为此函数仅适用于某些特定值,如果变化不显着,则目标函数将相同;换句话说,在所有范围内都不可区分。 我发现,MATLAB中的一个函数称为&#34; patter search&#34;,我尝试过,我得到了很好的结果,它与fmincon非常相似,但它的工作方式不同。我建议你解决这类问题。