我正在查看nloptr 手册中给出的示例。
我将代码的最后一部分替换为
local_opts <- list( "algorithm" = "NLOPT_LD_MMA",
"xtol_rel" = 0.0,
"ftol_rel" = 0.0,
"ftol_abs" = 0.0,
"xtol_abs" = 0.0)
opts <- list( "algorithm" = "NLOPT_LD_AUGLAG",
"xtol_rel" = 0.0,
"ftol_rel" = 0.0,
"ftol_abs" = 0.0,
"xtol_abs" = 0.0,
"maxeval" = 100000,
"local_opts" = local_opts )
res <- nloptr( x0=x0,
eval_f=eval_f,
lb=lb,
ub=ub,
eval_g_ineq=eval_g_ineq,
eval_g_eq=eval_g_eq,
opts=opts)
print( res )
也就是说,我将主求解器和局部求解器的 xtol/ftol rel/abs 都更改为 0。注意它们都使用基于梯度的算法。我还将最大步数从 1k 增加到 100k。
然而,求解器在 3k 步处终止得更早。
调用:nloptr(x0 = x0,eval_f = eval_f,lb = lb,ub = ub,eval_g_ineq = eval_g_ineq,eval_g_eq = eval_g_eq,opts = opts)
使用 NLopt 版本 2.4.2 进行最小化
NLopt 求解器状态:3(NLOPT_FTOL_REACHED:优化停止,因为达到了 ftol_rel 或 ftol_abs(上图)。)
迭代次数....:3132 终止条件:xtol_rel:0 ftol_rel:0 ftol_abs:0 xtol_abs:0 maxeval:1e+05 不等式约束数:1 等式约束数:1 目标函数的最优值:17.0140172891563 最优值控制数量:1 4.743 3.82115 1.379408
查看nlopt 的 c++ 实现,这似乎不应该发生。各种公差等级给出的终止条件是严格不等式的。所以我是否遗漏了求解器状态“NLOPT_FTOL_REACHED:优化停止,因为达到了 ftol_rel 或 ftol_abs(上)”的含义。?
谢谢!约翰