gpt4 book ai didi

c++ - 停止并恢复优化

转载 作者:太空狗 更新时间:2023-10-29 22:58:46 31 4
gpt4 key购买 nike

我正在使用 nlopt 的 c++ 接口(interface)来解决非线性优化问题。

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 源代码中检查了这一点。

现在,调用优化

现在,查看对象内的 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 优化知之甚少 [read: nothing],所以我不知道我的测试用例是否有效或是否会显示对 dx

的有效更改

关于c++ - 停止并恢复优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39581734/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com