1

我正在使用 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不能做出很小的变化,我的意思是,它的第一个值x14,不可能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 小时。

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

4

3 回答 3

1

好吧,这并没有解决如何让 fmincon 尊重这些约束,而只是一个潜在的想法......

给定您想要的范围,在限制为 x1<=x2、x3<=x4、x5<=x6 之前,您有 7x7x13x13x3x3 的潜在变量组合空间,总共有 ~75000 个组合。这不是一个巨大的空间 - 为什么不只评估每个参数组合的目标函数,然后用它min来找到目标函数的最小值?

于 2014-10-03T07:25:58.023 回答
0

由于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需要 0.1 秒(这是相当多的;)),你必须等待 25 分钟才能得到答案。

于 2014-10-03T07:49:13.387 回答
0

我一直在阅读很多论坛,我找到了一个非常有趣的解决方案,我尝试过,实际上效果很好。我发现目标函数之间存在一些差异。我在这里尝试的是使用 fmincon,但这个函数只适用于在所有范围内变化的目标函数,换句话说,在所有范围内都是可微的。但是这里有一个区别,因为这个函数只适用于一些特定的值,如果变化不显着,目标函数将是相同的;换句话说,在所有范围内都不可微。我发现,在 MATLAB 中有一个名为“patter search”的函数,我试过了,我得到了很好的结果,它与 fmincon 非常相似,但它的工作方式不同。我推荐它来解决这类问题。

于 2014-10-12T15:00:49.950 回答