2016-09-19 131 views
3

我正在使用nlopt的C++接口來解決非線性優化問題。停止和恢復優化

nlopt::opt opt; 
opt.set_maxeval(10); 
opt.set_max_objective(foo); 

double result; 
std::vector<double> params(10,0); 
opt.optimize(params, result); 

// later on in the code 
opt.optimize(params, result); // this uses the updated param values, but the step size starts from scratch 

不過,我想最後一行繼續只是最後params值未優化,而且還與step_size上次使用的,但我不認爲我有機會獲得該值。

我該如何做到這樣?

+0

你是什麼意思的''',但我不認爲我有權訪問該值'''。如果你無法讀出結果,那麼優化有什麼意義?我們在談論什麼樣的熱身?設置初始點或整個求解器 - 內部? – sascha

+0

@sascha我試圖訪問優化完成時使用的步長,以便我可以用該步長再次啓動該過程。我編輯了這篇文章,試圖讓這個更清晰。 – arman

+0

在你的情況下,params是優化變量的初始狀態,你把最後的(或最好的)結果放在那裏,並開始優化與 –

回答

1

警告:這是一個猜測 - 你可以嘗試。

該對象具有存儲該步驟的成員double *dx。如果您確實而不是明確指定了初始步驟的值,則dx值將在nlopt_optimize開始時分配爲默認值,並在末尾釋放。

看API文檔:http://ab-initio.mit.edu/wiki/index.php/NLopt_Reference

有感興趣的兩個功能:nlopt_get_initial_stepnlopt_set_initial_step

正常用法是使用您自己選擇的值,請撥打set_initial_step。然後,你撥打optimize。然後,用你自己的新價值重複這個過程。

但是,你想要的東西,試試這個:

最初,使用get_initial_step獲取默認值。然後,用set_initial_step做一個明確的設置。這將使對象內部的dx數組在調用optimize後保持不變。我在nlopt源代碼中檢查了這一點。

現在撥打電話optimize

現在,查看對象內部的dx數組。

如果您獲得更新值 - 您可免費回家。如果沒有,那麼您可能需要編寫一些自定義代碼。

您可以繼續致電optimize,但而不是set_initial_step呼叫第二次或第三次。


僞爲 「正常」 的情況下的代碼:

// normal usage 

obj.set_initial_step(my_values_1); 
obj.optimize(); 

obj.set_initial_step(my_values_2); 
obj.optimize(); 

僞用於 「特技」 代碼:

// special usage 

obj.get_initial_step(x,my_values_1); 
obj.set_initial_step(my_values_1); 
obj.optimize(); 

// check to see if the values have been updated relative to my_values_1 

// if the trick works, this should use the updated values 
obj.optimize(); 

// if the trick works, this should use the updated values 
obj.optimize(); 

UPDATE:

偷窺對象的dx值需要一些黑客/詭計。標準nlopt.hnlopt_opt視爲不透明指針。實際的結構定義僅爲可從nlopt-internal.h獲得,這意味着您必須擁有完整的源代碼並從中提取結構定義。

這就是如果你想肯定確認值已經改變。您可能能夠通過某種方法推斷出您獲得了不同的值(例如,您的限制函數可以檢測到某些內容),而無需查看dx。或者,您可以通過以其預期的方式使用API​​提供更新的值來「翅膀」。

我嘗試了測試程序,並沒有看到dx變化,但我知道一點[閱讀:什麼]約NL優化,所以我不知道如果我的測試情況下是有效的或將展現給dx

有效改變