我正在查看the manual of 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
看c++ implementation of nlopt,似乎不会发生这种情况。由各种容差水平给出的终止条件是严格的不平等。所以我错过了解决方案状态的意义“NLOPT_FTOL_REACHED:由于达到ftol_rel或ftol_abs(上面),优化已停止。” ?
谢谢! 约翰