用于非线性约束最小化的 C++ 库

计算科学 C++ 非线性规划
2021-12-12 08:24:32

我目前正在尝试解决在 matlab“fmincon”函数中实现的非线性约束最小化问题。我的期望是,minimize(fun1,x0,uB,lB,fun2) 其中 x0 是初始状态,fun1 是需要最小化的函数,uB 是上限,lB 是下限,而 fun2 是提供非线性等式向量的函数/不等式,如http://www.mathworks.com/help/optim/ug/fmincon.html中所述作为非lcon函数。这些向量也在通过迭代发生变化(它们非线性地依赖于解向量的第 n 次迭代 x_n)。在 matlab 实现中,它们的形式为 c(x)<=0。这是需要从 matlab 移植到 c++ 的最后一段代码,我一直在努力寻找包含该算法的适当 c++ 库。这就是我在这里寻求帮助的原因,如果您能提供您的专业知识,我将不胜感激。

我想做的很好的例子是这个页面上的第一个http://www.mathworks.com/help/optim/ug/constrained-nonlinear-optimization-examples.html#f10960?s_tid=doc_12b唯一的区别是我也需要界限...

提前致谢。

彼得

2个回答

如果您只需要一个 C++ 库来解决非线性优化问题,您可以使用RobOptim尽管 RobOptim 最初开发时考虑了机器人优化问题,但它适用于任何非线性优化问题。它为多个非线性求解器(IpoptNAG等)提供了一个简单的C++ 接口和插件。使用这种包装器可以很容易地使用另一个 NLP 求解器。如果您不能提供梯度,则可以自动完成有限差分计算。

它是开源的,因此您可以在 GitHub 上查看源代码:https ://github.com/roboptim/

@Geoff Oxberry 所做的分析对于选择将由 RobOptim 调用的非线性求解器至关重要。请注意,在处理此类求解器时,参数调整会对性能产生巨大影响,并且您可能仍会陷入局部最小值(这实际上取决于您要处理的问题类型)。

注意:我是这个项目的开发者之一。

如果您的函数不可微,则应注意如何使用有限差分。如果你想使用衍生信息,你最好的选择可能是某种半光滑的牛顿型方法。可以在此处找到一组描述此类方法的注释。

十二到三十个变量可能是模式搜索(也称为直接搜索)方法可行的上限。Rios 和 Sahinidis 最近在 Journal of Global Optimization 上发表的一篇关于无导数优化方法(例如模式搜索方法)的评论论文可以在这里找到,以及一个配套网页可在此处找到 Kolda、Lewis 和 Torczon 在 SIAM 评论中关于这些方法的较新的评论论文。这些方法在昂贵的函数评估中工作得相当好,并且不一定需要可微性或衍生信息。

其中许多方法需要某种凸性来保证收敛到全局最优,因此如果您要严格解决问题,您可能需要将上述这些方法与分支定界策略相结合。但是,如果您不关心严谨性,那么像 MATLAB 之类的方法fmincon可能会运行良好(不再有任何保证)。有限差分很可能会给您一个不可微函数的子微分成员,这足以让您的问题实例和特定输入数据为您的目的返回足够准确的结果。在这种情况下,您可能应该查看 Christian 在他的评论中链接的问题的答案中提到的库。