【问题标题】:C++ : NLopt COBYLA as compared to Matlab fminconC++:NLopt COBYLA 与 Matlab fmincon 相比
【发布时间】:2014-05-16 22:43:54
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ matlab optimization nlopt


    【解决方案1】:

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

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


    添加: fmincom 使用

    “用于估计梯度的有限差分,要么是'forward'(默认),要么是'central' ...”

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

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

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

    【讨论】:

    • 感谢您的回复!我已经尝试观察/绘制这些值,但无法得出任何结论。 COBYLA 需要更多的迭代并且不会像 fmincon 那样收敛(最小值更大)。其次,你能解释一下所有的选项吗?我使用了初始步长,但我真的不知道 rho 或其他选项以及如何使用它们。我按照您的建议尝试了 BOBYQA,有时它表现良好,但也有完全收敛的情况!在相同情况下,COBYLA 并非如此。 L-BFGS 不是无梯度的,这是必需的!你有什么建议?谢谢!
    猜你喜欢
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多