停止和恢复优化

Stop and resume optimisation

本文关键字:优化 恢复      更新时间:2023-10-16

我正在使用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,但我认为我无法访问该值。

我怎样才能做到这一点呢?

警告:这是一个猜测——你可以试试。

对象有一个存储步骤的成员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"情况的伪代码:

// 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();

更新:

窥视对象的dx值需要一点黑客/诡计。标准的nlopt.hnlopt_opt视为不透明指针。实际的结构定义是,只有可以从nlopt-internal.h中获得,这意味着您必须拥有完整的源代码并从中提取结构定义。

如果您想要确认值已经更改。你可以推断[通过某种方法],你得到不同的值(例如,你的极限函数(s)检测某些东西),而不必偷看dx

或者,您可以"即兴发挥",通过使用API以预期的方式提供更新的值。

我尝试了一个测试程序,没有看到dx的变化,但我对NL优化知之甚少,所以我不知道我的测试用例是否有效,或者是否会显示dx的有效变化