2014-03-30 61 views
1

我正在使用NLOpt的Python接口運行優化。在某個點上,經過多次迭代後,我得到一個nlopt.RoundoffLimited異常。根據文檔(http://ab-initio.mit.edu/wiki/index.php/NLopt_Reference#Error_codes_.28negative_return_values.29),在發生這種異常之後,「優化仍然通常會返回有用的結果。」我如何真正查看中間結果?我運行的代碼,如:使用Python API優化失敗後獲取NLOpt結果

opt = nlopt.opt(...) 
# ... some optimization settings 
try: 
    opt_results = opt.optimize(guess) 
except nlopt.RoundoffLimited: 
    # How do I get the latest parameters from opt, 
    # after the optimization has failed? 

我能得到就好使用opt.last_optimize_result()客觀價值,但我不能找到API調用來獲取導致這一目標值的參數。

謝謝!

回答

0

我還沒有找到一個特別優雅的解決方案,但我現在會發布這個,以防有人絆倒同樣的問題。下面是在優化例外之前恢復以前的有效優化參數的一種方法:

# globals 
previous_args = None 
current_args = None 

# objective function 
def objective_function(args, gradient): 
    global previous_args 
    global current_args 

    previous_args = current_args 
    current_args = args 

    # ... the rest of your objective function 
    return function_value 

# optimization code using objective_function 
opt = nlopt.opt(...) 

try: 
    args = opt.optimize(guess) 
except nlopt.RoundoffLimited: 
    args = previous_args 

    # you should do some sanity checks on args. 
    # for example, one reason you may see RoundoffLimited 
    # is args on the order of 1e-300 or so. 
+0

另一種方法是監視所有f/all x值, (https://gist.github.com/denis-bz/9156830)。 – denis

+0

哈謝謝=) 我想使用一些memoization裝飾也可以。可能比使用全局變量更好。 – Max