2014-04-16 69 views
0

我在C++中使用了NLopt library,COBYLA algorithm,用於最小化基於對數的成本函數。我已經在Matlab中使用了fmincom。 Matlab函數比NLopt表現得更好。它需要比NLopt少得多的優化,並且收斂到比NLopt好得多的最小值。C++:NLopt COBYLA與Matlab相比fmincon

我相信用於算法的補充選項是不同的。我試圖複製相同的參數爲NLopt與默認在Matlab中的fmincon,它仍然不會給出類似的結果。

我需要知道如何以類似於Matlab的方式進行會聚,如果可能的話,在NLopt中使用COBYLA。 在此先感謝

回答

1

爲什麼COBYLA? fmincon is 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,不小於你需要

NB從任何優化打印返回代碼(COBYLA,initial_step → rhobegin和initial_step縮放X xtol_abs → rhoend):爲什麼沒有制止?

+0

感謝您的回覆!我已經試圖觀察/繪製這些值,但不能得出任何結論。 COBYLA需要更多的迭代,並且不像fmincon那樣收斂(最小值更大)。其次,你能解釋所有的選擇嗎?我已經使用了初始步長,但我並不真正瞭解rho或其他選項以及如何使用它們。我按照你的建議嘗試過BOBYQA,有時候它表現良好,但也有一些情況下它會收斂!對於同樣的情況,COBYLA並非如此。 L-BFGS不是無梯度的,這是必需的!你有什麼建議?謝謝! – MonsieurBeilto