MATLAB优化-如果条件不满足,如何继续下一个可能的解决方案?

MATLAB优化-如果条件不满足,如何继续下一个可能的解决方案?,matlab,function,optimization,Matlab,Function,Optimization,我正在使用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','it

我正在使用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)
其中简化的
函数是:

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
(或其他优化工具)来避免此问题?

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


但是,您永远不会在块的catch部分结束,因为即使
interval
NaN
Inf
0
,除法也不会导致错误。我只是因为你的要求才发布这个。我对函数“失败”的理解是它抛出了一个错误。如果它只是产生一个不正确的结果,那么上面的函数是正确的。在失败的情况下,我只需修改
out
,使其高于您将获得的任何值,以训练最小化者离开此点。

什么是
时间
?你能加一个吗?你说的可除是什么意思?整数可除?所有的实数都是可以被整除的。抱歉。我试图简化一个最小的例子,但太简单了。是的,我的意思是整数可除。我已修改了问题描述。@user3743235您的示例仍然无法运行……不,您需要一个MINLP解算器来解决此问题。@houtanb再次修改。即使这是使用这种优化的一个很差的例子,但至少现在应该可以了。我喜欢这个想法,但是我仍然不确定如何最好地做到这一点。你能根据我修改过的问题更新这个答案吗?我可以简单地做:
函数(X,约束,间隔);尝试mod(时间、间隔)>0;捕捉;返回;结束;%根据参数、约束和间隔进行计算;结束
?感谢您的编辑。但是,如果do
catch;返回;结束
然后fmincon生成调用期间未分配的错误输出参数“out”(可能还有其他参数)。。返回时不指定
out
。如果我改为
catch;out=1e10;返回;结束
然后fmincon结束:优化完成,因为在初始点,目标函数在可行方向上不递减,在最优公差的选定值范围内,约束满足在约束公差的选定值范围内。我是否需要调整停止标准或其他内容?是的,您需要调整分配给
out
的值以处理您的项目。通常,当最小化函数得到一个出乎意料的大函数值时,它们会惩罚它们尝试的输入值,然后尝试其他方法,从而远离这些输入值。如果
1e10
对于您的数据来说太大,请尝试其他方法。
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