2016-09-19 125 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

有效改变