繁体   English   中英

使用fmincon函数MATLAB进行定义的步长变化

[英]Make defined step variation with fmincon function MATLAB

我正在使用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 ,因为在我的目标函数中,变化不会有任何影响; 这是我的问题,因为步数太少,所以变化不会有任何结果,算法会停止运行,并说目标函数没有变化。

我已经设置了fminconDiffMinChange=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个小时。

如您所见,最后我要寻找的是间隔的变化,因此,开始时的限制不能大于顶部的限制,否则排名将为空。

好吧,这并不涉及如何使fmincon尊重这些约束,而只是一种潜在的想法...

给定所需的范围,在限制为x1 <= x2,x3 <= x4,x5 <= x6之前,您有7x7x13x13x3x3x3的潜在变量组合空间,总计约75000个组合。 那不是一个很大的空间-为什么不只对每个参数组合都评估目标函数,然后使用min来找到目标函数的最小值?

由于fmincon是针对连续问题的优化器,并且您的问题是离散的,因此问题和解决方案方法之间存在不匹配的地方,例如参见wiki

您可以尝试使用离散优化求解器,例如branch和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分钟才能得到答案。

我在许多论坛上都读过书,发现了一个非常有趣的解决方案,我尝试了一下,实际上效果很好。 我发现目标功能之间存在一些差异。 我在这里尝试使用的是fmincon,但是此功能仅适用于在所有范围内都发生变化的目标函数,换句话说,在所有范围内都可以区分。 但是这里有所不同,因为此函数仅适用于某些特定值,并且如果变化不大,则目标函数将相同。 换句话说,并非在所有范围内都是可区分的。 我发现,在MATLAB中有一个名为“模式搜索”的函数,我尝试了一下,并得到了不错的结果,它与fmincon十分相似,但工作原理不同。 对于这种问题,我建议这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM