SQP优化算法调优建议

计算科学 优化 C++
2021-12-23 07:00:06

我正在使用来自 lib 的稳定版本的 SQP 算法。参数设置留给开发人员,尽管默认值在手。我在非常简单的优化问题上启动求解器

min(p1exp(p2x))

s.t.0p1,p210

我在允许的空间中使用蒙特卡洛采样,通过精心选择的初始点进行优化。

看来优化输出对初始点非常敏感。我尝试使用一些参数,例如梯度计算的精度(使用有限差分方案)......但仍然:即使在像这样的简单示例上,它也不会始终收敛。

我还希望可以对任何函数进行优化,例如 matlab 优化工具箱的基本函数及其线性组合(exp、power、gaussian、sin、cos、fourier、多项式、线性、有理作为开始)。

如果有人在调整此类算法方面有一些经验,我会很高兴他分享这些知识。另外,您对揭示调优策略的文献有很好的暗示吗?

问候。

1个回答

正确的做法是在调用求解器之前缩放变量。然后您可能可以使用默认版本。

良好的缩放通常取决于问题,因此很难自动完成。这就是为什么大多数求解器将其留给用户的原因。

如果 Hessian 除以其绝对最大的条目只有在相应的交互作用真正可以忽略不计的情况下才具有小条目,则您的变量是很好的缩放比例。即使您无法计算显式 Hessian,这也可以让您了解如何进行缩放。

在您的示例中,这意味着使用甚至作为变量来代替p2xep2xp2

一般来说,缩放没有固定的规则;这是一门艺术,取决于您的目标函数和约束的细节。找出哪些变量需要缩放的一种方法是在起点计算 Hessian,使用对称矩阵的缩放方法对其进行平衡,并检查所有被大量缩放的变量。(如果 Hessian 是正定的,您可以简单地将变量除以 Hessian 对角元素的平方根或它们的数量级;但如果 Hessian 是不定的,这可能很危险!)这也为您提供了缩放因子线性缩放。如果这还不够,你要么需要非线性缩放(检查你的函数以找出什么是自然的),要么你需要迭代地使用求解器,

如果您仍需要调整,标准方法是为应用程序准备一组典型的测试问题(但如果应用程序功能的评估成本很高,则更简单),使用求解器运行所有示例,并根据结果计算性能度量出于兴趣。然后系统地改变调整参数以提高性能。这本身就是一个黑盒优化问题,您可以使用诸如 SNOBFIT(我的小组开发的求解器,仅适用于连续调整参数)或 NOMAD(也接受离散调整参数)等求解器。