【问题标题】:MATLAB Optimization - how to move on to next possible solution if a condition is not satisfied?MATLAB 优化 - 如果条件不满足,如何继续下一个可能的解决方案?
【发布时间】:2017-11-17 17:35:09
【问题描述】:

我正在使用 fmincon 优化来查找适合约束的参数。目前设置如下:

constraints = [1 2 3];    
interval = 100;

time_start = [2500];
time_boundary = [500 5000];
param2_start = [0.5];
param2_boundary = [0 1];

opts = optimset(optimset('fmincon'),'TolFun',1e-4,'TolX',1e-4,'display','iter');
[x,fval] = fmincon(@(X) func(X,constraints,interval),[time_start param2_start],[],[],[],[],[time_boundary(1) param2_boundary(1)],[time_boundary(2) param2_boundary(2)],[],opts)

简化的func 是:

function out = func(X,constraints,interval)

  time = X(1);
  param2 = X(2);

  % Check inputs before calculations
  if (mod(time,interval) > 0)
      out = 999;
  else
      % Perform calculations based on parameters, constraints and interval.
      % Simplified to:
      out = time/interval;
  end

end

但是,如果 time 不能被 interval 整除,则函数 (func) 可能会失败。

有没有办法在函数中捕捉到这一点,以便fmincon 转移到另一个解决方案而不会失败?

或者,有没有更好的方法来使用fmincon(或其他优化工具)来避免这个问题?

【问题讨论】:

  • 什么是time?你能加一个minimal reproducible example吗?你说的可分是什么意思?整除?所有实数都可以相互整除。
  • 抱歉。我试图简化一个最小的例子,但它太简单了。是的,我的意思是整数整除。我已经修改了问题描述。
  • @user3743235 你的例子仍然没有运行......
  • 不,你需要一个 MINLP 求解器。
  • @houtanb 再次修改。这现在至少应该可以工作,即使它是使用这种优化的一个糟糕的例子。

标签: matlab function optimization


【解决方案1】:

是的,将你的函数修改为类似(伪代码,因为你没有提供你的函数的内容)

function(X, constraints, interval)
try
   <<code that can fail when function is being optimized>>
   <<time/interval when interval == 0 for example>>
catch
   return <<penalty value>>
end
end

基本上,这个想法是当函数失败时,你会返回一个惩罚值,这样最小化器就会远离它传递给你的函数的值。


编辑:根据您的编辑,函数将是:

function out = func(X, constraints, interval)
try
    out = X(1)/interval;
catch
    out = 1e10;
end
end

但是,您永远不会进入块的 catch 部分,因为除法永远不会导致错误,即使 intervalNaNInf0。我只是发布这个,因为你要求我。我对函数“失败”的理解特别是它会引发错误。如果它只是产生不正确的结果,那么您上面的函数是正确的。我只会在失败的情况下修改out,使其高于您将获得的任何值,否则训练最小化器以远离该位置。

【讨论】:

  • 我喜欢这个想法,但我仍然不确定如何最好地做到这一点。您能否根据我修改后的问题更新此答案?我可以简单地做:function(X, constraints, interval); try; mod(time,interval) &gt; 0; catch; return; end; % Perform calculations based on parameters, constraints and interval; end 吗?
  • 感谢您的编辑。但是,如果执行catch; return; end,则 fmincon 会产生错误在调用期间未分配的输出参数“out”(可能还有其他参数)。 因为它返回时未分配 out。如果我改为使用catch; out = 1e10; return; end,则 fmincon 完成:优化完成,因为在初始点,目标函数在可行方向上不递减到最优容差的选定值内,并且在选定的范围内满足约束约束容差的值。 我是否需要调整停止标准或其他什么?
  • 是的,您需要调整分配给out 的值才能使用您的项目。通常,当最小化器获得意外的大函数值时,它们会惩罚他们尝试过的输入值并尝试其他方法,远离这些输入值。如果1e10 对您的数据而言太大,请尝试其他方法。
猜你喜欢
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
相关资源
最近更新 更多