我正在使用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 :(得分:1)
警告:这是猜测 - 你可以试试。
该对象具有存储该步骤的成员double *dx
。如果 not 明确指定初始步骤的值,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
。
&#34;普通&#34;的伪代码情况下:
// normal usage
obj.set_initial_step(my_values_1);
obj.optimize();
obj.set_initial_step(my_values_2);
obj.optimize();
&#34;技巧的伪代码&#34;:
// 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();
<强>更新强>
窥视对象的dx
值需要一些黑客/技巧。标准nlopt.h
将nlopt_opt
视为不透明指针。实际的结构定义只有 可以从nlopt-internal.h
获得,这意味着您必须拥有完整的源代码并从中提取结构定义。
如果您想要肯定确认值已更改,那就是
。您可以通过某种方法推断出您获得了不同的值(例如,您的限制函数可以检测到某些内容),而无需查看dx
。
或者,你可以&#34;翼&&#34;通过以预期方式使用API提供更新值。
我尝试了一个测试程序并且没有看到dx
更改,但我对NL优化知之甚少[读:没什么],所以我不知道我的测试用例是否有效或是否会显示对dx