当使用“active-set”算法时,如何将Matlab的fmincon的停止标准设置为“output.stepsize”

时间:2013-10-25 03:03:30

标签: matlab optimization

使用output.stepsize算法时,fmincon如何用作'active-set'的停止标准?

当我尝试解决非线性约束非凸优化问题时,我观察到output.stepsize中的'PlotFcns'选项将是比公差或最大评估更好的停止标准。但是在options参数结构中,没有这样的选项。

我还注意到fmincon使用nonlcon来解决计算output.stepsize的问题。

如果我不想更改fminconnonlcon的原始代码,如何设置output.stepsize的上限,以用作优化的停止条件运行

1 个答案:

答案 0 :(得分:1)

这是您尝试实现此目标的一种方式。我正在使用其中一个examples from the doc(还有discussion如何在那里做到这一点)。我只是添加了一个output function,当stop = true字段达到阈值时,会返回optimValues.stepsize。我还必须确保此字段不为空,因为它似乎处于初始化状态。

function fmincontest
A = [-1 -2 -2;
      1  2  2];
b = [0;72];
x0 = [10;10;10];
options = optimoptions('fmincon','Algorithm','active-set','OutputFcn',@outfun);
[x,fval,exitflag] = fmincon(@myfun,x0,A,b,[],[],[],[],[],options)

function f = myfun(x)
f = -x(1)*x(2)*x(3);

function stop = outfun(x, optimValues, state)
stop = ~isempty(optimValues.stepsize) && optimValues.stepsize < 0.05;

如果您检查exit_flag的{​​{1}}输出,您会看到它现在返回fmincon因为输出功能正在停止优化,再次如文档中所示。如果您已使用plot function,则可以使用{{3}},因为它们具有相同的格式。

您需要针对您的问题量身定制,调整阈值,当然还要确认它是否有效。我无法评论这是一个多么好的想法。您应确认所有情况下仍能满意地满足您的容错。我仍然想问为什么你不能指定适当的-1'TolCon'容差来实现你所需要的。