3

我正在使用nloptC++ 接口来解决非线性优化问题。

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

我怎样才能实现这样的目标?

4

1 回答 1

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

更新:

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

那是如果您想要肯定地确认值已更改。您可能能够 [通过某种方法] 推断出您正在获得不同的值(例如,您的极限函数检测到某些东西)而不必偷看dx.

或者,您可以通过使用 API 以预期方式提供更新的值来“实现它”。

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

于 2016-09-20T01:26:52.703 回答