具有非线性约束的内点优化的良好语言/包?

计算科学 约束优化 scipy 曲线拟合 信任区域 内点法
2021-12-06 09:48:09

我目前正在使用 Python 的 scipy.optimize 包为 10 个 ODE 的系统执行参数估计。我有一些观察到的数据,我正在尝试找到使 ODE 解决方案最适合最小二乘意义上的数据的参数集。(顺便说一下,ODE 没有解析解,所以我没有提供梯度。)每个参数都被限制在一个区间内,并且还有一些不等式约束。我想优化总共大约 15-30 个参数。我倾向于在 scipy.optimize.minimize 中使用 SLSQP 和使用 'trust-constr' 得到不错的结果。前一种方法往往更快(30-90 秒,后者为 5-10 分钟),而且平方误差也更小。但是,对于我的问题,它是首选的 m 努力寻找不在边界上的最小值(或最小值)。由于 Python 的 'trust-constr' 方法对我来说效果不佳,我正在寻找替代方案。

任何人都可以为具有合适的内点(或类似)方法的语言和/或包提供推荐吗?我听说过一些关于 Julia 的好消息,但在简要阅读 JuliaOpt 和 JuMP 页面时,我不确定对不等式约束问题的支持有多好。性能是半重要的,因为我计划运行数百次优化,并且我希望能够在合理的时间内完成此操作。任何想法或建议将不胜感激。

1个回答

NLopt 有大约十几个局部无导数优化器,包括 C 语言中的 SLSQP。

目前只有 COBYLA 支持任意非线性不等式和等式约束;其余的仅支持有界约束或无约束问题。(但是,它们中的任何一个都可以通过将它们与增强拉格朗日方法相结合来应用于非线性约束问题

Python API 非常统一,这使得尝试多个优化器变得容易,具有宽松的容差和步长

另见这个 丑陋 的 3 NLopt 算法图×十几个合成 8d 测试函数。

关于有效/无效的图表和注释可能很有趣。