0

我在 C++ 中使用NLopt library,COBYLA algorithm来最小化基于日志的成本函数。我已经fmincom在 Matlab 中实现了相同的使用。Matlab 函数的性能比NLopt. 它需要的优化次数比 NLopt 少得多,而且收敛到最小值也比 NLopt 好得多。

我相信用于算法的补充选项是不同的。我试图为 NLopt 复制与 Matlab 中 fmincon 中的默认参数相同的参数,但它仍然没有给出类似的结果。

如果可能的话,我需要知道如何在 NLopt 中使用 COBYLA 以类似于 Matlab 的方式收敛。提前致谢

4

1 回答 1

2

为什么选择 COBYLA? fmincon是 afaik 更像 NLopt L-BFGS,另见LBFGS。他们使用梯度估计,因此当 func() → 二次时,收敛速度比 COBYLA 的线性近似要快得多。
我建议

  • 打印/绘制两个优化器的所有 func 值(在函数内打印)
  • 发布两者的所有选项;COBYLA 对 rhobeg 和 rhoend 非常敏感
  • 尝试 NLopt L-BFGS 或 NLopt BOBYQA,“迭代构造的二次近似”。


补充: fmincom使用

“用于估计梯度的有限差分要么是‘向前’(默认),要么是‘中心’......”

自动地。您可以运行 L-BFGS 或任何梯度优化器,使用梯度估计器,如单边或中心差异。一般来说,这可能是对嘈杂函数或边界附近的较差估计;
但它适用于 fmincom,因此也适用于 NLopt L-BFGS。
先尝试一下,然后再花时间在完全不同的方法上。

您需要设置这些 NLopt 参数:
initial_step例如 1 或 .1
ftol_absxtol_abs例如 1e-4,不小于您的需要
(对于 COBYLA,initial_step → rhobegin 和 initial_step scaled x xtol_abs → rhoend。)

NB 打印来自任何优化器的返回码:为什么它停止了?

于 2014-05-14T15:21:43.113 回答