用MATLAB中的fmincon函数定义阶跃变化

用MATLAB中的fmincon函数定义阶跃变化,matlab,optimization,minimization,Matlab,Optimization,Minimization,我正在使用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; R1=[x1:2:

我正在使用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;
R1=[x1:2:x2];
R2=[x3:100:x4];
R3=[x5:x6];
这些参数的限制如下:

x1<=x2
x3<=x4
x5<=x6
最初的限制是:

A=[1 -1 0 0 0 0;0 0 1 -1 0 0;0 0 0 0 1 -1];
b=[0;0;0];
更清楚地说,我想要的是制作3个范围,让我们定义如下:

x5=4:6;
x6=4:6;
R1=[x1:2:x2];
R2=[x3:100:x4];
R3=[x5:x6];
编辑1:您可能知道,每次评估目标函数大约需要2-3小时


正如你所看到的,最后我要寻找的是区间的变化,因为这个原因,开始时的限制不能大于顶部的限制,否则排名将是空的。

好吧,这并没有解决如何使fmincon尊重这些限制,只是一个潜在的想法


给定您想要的范围,您有一个7x7x13x13x13x3x3x3的潜在变量组合空间,总共约75000个组合,然后再限制为x1,因为
fmincon
是连续问题的优化器,而您的问题是离散的,因此问题和解决方案之间存在不匹配,请参阅示例

您可以尝试离散优化解算器,例如。由于可用区域中的点数非常有限,所以蛮力方法也可以工作(取决于目标函数需要的时间)。像这样的东西应该适合你的目标函数
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
lb=[4 4 300 300 4];%下限
st=[2 2 100 100 1];%步长
ub=[16 16 1500 1500 6];%上界
%将最佳解初始化为无穷大
bestF=inf;
bestX=nan(6,1);
%构造所有置换
对于idx=1:numel(磅)
%构造范围
nextRange=(lb(idx):st(idx):ub(idx));
如果(idx==1)
排列=nextRange;
其他的
a=repmat(置换,numel(nextRange),1);
b=repmat(nextRange,1,size(置换,1));
排列=[a,b(:)];
结束
%删除不满足约束的置换
如果(idx==2)
排列(排列(:,1)>排列(:,2),:)=[];
结束
如果(idx==4)
排列(排列(:,3)>排列(:,4),:)=[];
结束
如果(idx==6)
排列(排列(:,5)>排列(:,6),:)=[];
结束
结束
N=大小(排列,1);
断言(N==7*4*13*7*6)
对于idx=1:N
candX=置换(idx,:)';
%评估。。。
candF=乐趣(candX);
% ... 如果有改进,最好更新
if(candF

排列的数量等于15288,因此,如果你的目标函数
fun
需要0.1秒(相当多),你必须等待25分钟才能得到答案。

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

注意-我可能会误解,将您的实际调用发布到fmincon和您的实际目标函数可能会有所帮助,这样我们就可以看到发生了什么。感谢您的回答,但我不可能给出目标函数,此外,这不是一个好的解决方案,因为对于每次迭代,目标函数在一(1)次迭代中大约需要2-3个小时,因此,对于所有可能的组合,该解决方案大约需要17年。我看到KevinMc几乎同时有相同的想法;)