使用output.stepsize
算法时,fmincon
如何用作'active-set'
的停止标准?
当我尝试解决非线性约束非凸优化问题时,我观察到output.stepsize
中的'PlotFcns'
选项将是比公差或最大评估更好的停止标准。但是在options参数结构中,没有这样的选项。
我还注意到fmincon
使用nonlcon
来解决计算output.stepsize
的问题。
如果我不想更改fmincon
或nonlcon
的原始代码,如何设置output.stepsize
的上限,以用作优化的停止条件运行
答案 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'
容差来实现你所需要的。