警告:这是一个猜测——你可以试试。
该对象有一个double *dx
存储步骤的成员。如果您没有明确指定初始步骤的值,则该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
第二次或第三次拨打电话。
“正常”情况的伪代码:
// 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.h
将nlopt_opt
其视为不透明的指针。实际的结构定义只能从中获得,nlopt-internal.h
这意味着您必须拥有完整的源代码并从中提取结构定义。
那是如果您想要肯定地确认值已更改。您可能能够 [通过某种方法] 推断出您正在获得不同的值(例如,您的极限函数检测到某些东西)而不必偷看dx
.
或者,您可以通过使用 API 以预期方式提供更新的值来“实现它”。
我尝试了一个测试程序,但没有看到dx
变化,但我对 NL 优化知之甚少[阅读:一无所知],所以我不知道我的测试用例是否有效或会显示有效的更改dx