停止并恢复优化

时间:2016-09-19 20:40:27

标签: c++ nlopt

我正在使用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,但我不会我想我可以获得这个价值。

我怎样才能达到这样的目标?

1 个答案:

答案 0 :(得分:1)

警告:这是猜测 - 你可以试试。

该对象具有存储该步骤的成员double *dx。如果 not 明确指定初始步骤的值,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

&#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.hnlopt_opt视为不透明指针。实际的结构定义只有 可以从nlopt-internal.h获得,这意味着您必须拥有完整的源代码并从中提取结构定义。

如果您想要肯定确认值已更改,那就是

。您可以通过某种方法推断出您获得了不同的值(例如,您的限制函数可以检测到某些内容),而无需查看dx

或者,你可以&#34;翼&&#34;通过以预期方式使用API​​提供更新值。

我尝试了一个测试程序并且没有看到dx更改,但我对NL优化知之甚少[读:没什么],所以我不知道我的测试用例是否有效或是否会显示对dx

的有效更改