2

我正在查看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(上)”的含义。?

谢谢!约翰

4

0 回答 0