警告:這是一個猜測 - 你可以嘗試。
該對象具有存儲該步驟的成員double *dx
。如果您確實而不是明確指定了初始步驟的值,則dx
值將在nlopt_optimize
開始時分配爲默認值,並在末尾釋放。
看API文檔:http://ab-initio.mit.edu/wiki/index.php/NLopt_Reference
有感興趣的兩個功能:nlopt_get_initial_step
和nlopt_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.h
將nlopt_opt
視爲不透明指針。實際的結構定義僅爲可從nlopt-internal.h
獲得,這意味着您必須擁有完整的源代碼並從中提取結構定義。
這就是如果你想肯定確認值已經改變。您可能能夠通過某種方法推斷出您獲得了不同的值(例如,您的限制函數可以檢測到某些內容),而無需查看dx
。或者,您可以通過以其預期的方式使用API提供更新的值來「翅膀」。
我嘗試了測試程序,並沒有看到dx
變化,但我知道一點[閱讀:什麼]約NL優化,所以我不知道如果我的測試情況下是有效的或將展現給dx
有效改變
你是什麼意思的''',但我不認爲我有權訪問該值'''。如果你無法讀出結果,那麼優化有什麼意義?我們在談論什麼樣的熱身?設置初始點或整個求解器 - 內部? – sascha
@sascha我試圖訪問優化完成時使用的步長,以便我可以用該步長再次啓動該過程。我編輯了這篇文章,試圖讓這個更清晰。 – arman
在你的情況下,params是優化變量的初始狀態,你把最後的(或最好的)結果放在那裏,並開始優化與 –