警告:这是一个猜测 - 你可以尝试。
该对象具有存储该步骤的成员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();
UPDATE:
偷窥对象的dx
值需要一些黑客/诡计。标准nlopt.h
将nlopt_opt
视为不透明指针。实际的结构定义仅为可从nlopt-internal.h
获得,这意味着您必须拥有完整的源代码并从中提取结构定义。
这就是如果你想肯定确认值已经改变。您可能能够通过某种方法推断出您获得了不同的值(例如,您的限制函数可以检测到某些内容),而无需查看dx
。或者,您可以通过以其预期的方式使用API提供更新的值来“翅膀”。
我尝试了测试程序,并没有看到dx
变化,但我知道一点[阅读:什么]约NL优化,所以我不知道如果我的测试情况下是有效的或将展现给dx
有效改变
你是什么意思的''',但我不认为我有权访问该值'''。如果你无法读出结果,那么优化有什么意义?我们在谈论什么样的热身?设置初始点或整个求解器 - 内部? – sascha
@sascha我试图访问优化完成时使用的步长,以便我可以用该步长再次启动该过程。我编辑了这篇文章,试图让这个更清晰。 – arman
在你的情况下,params是优化变量的初始状态,你把最后的(或最好的)结果放在那里,并开始优化与 –