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


9

我目前正在尝试解决在matlab“ fmincon”函数中实现的非线性约束最小化问题。我的期望是,minimum(fun1,x0,uB,lB,fun2)其中x0是初始状态,fun1是需要最小化的函数,uB是上限,lB是下界,fun2是提供非线性相等向量的函数/不平等,如http://www.mathworks.com/help/optim/ug/fmincon.html中所述作为nonlcon函数。这些向量也通过迭代而改变(它们非线性地取决于x_n,解向量的第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唯一的区别就是我也需要边界...

提前致谢。

彼得


有可能使用NLOPT ab-initio.mit.edu/wiki/index.php/NLopt_C-plus-plus_Reference,但我需要使用多次调用来计算有限差分,以从目标函数调用“最小化”函数求值,我很客气希望算法本身可以解决这个问题,以提高性能。我的最小化函数计算起来确实很昂贵。为了明确起见,最小化函数是时序马尔可夫切换模型估计中具有原始数据的估计模型的对数似然性。
彼得·科塔斯

1
您是否看过这个问题的答案?如果您的要求没有得到充分解决,则应编辑问题以指出问题,以获得有用的建议。
Christian Clason 2012年

谢谢,那里有一些有用的信息。目前,我在NLOPT库中只能依靠自己的手肘,因为我发现它也可能适合我的问题。我将保持该主题发布,并在提出一个主题时提供解决方案。可能会加快流程速度的任何帮助仍然受到赞赏。实际执行例如,等等
彼得Kottas

1
几个问题:1.您的问题是否凸出?2.目标和约束条件是可区分的吗?如果是这样,多少次?一旦?两次?3.如果存在这些导数,您是否可以轻松计算?如果您不容易获得有限差分近似值,是否容易计算出来?4.您有多少个决策变量?(即,您要最小化多少变量?)粗略估计就足够了。5.功能评估昂贵吗?拥有所有这些信息将很有帮助,以便为您提供更好的答案。
Geoff Oxberry 2012年

嗨!首先,感谢您的答复。1.很难说,但很可能不是,因为最小化函数是金融应用中时间序列的马尔可夫切换模型估计与从其性质来看之间的对数似然性,因此我认为它具有一定的噪声输出。2.否3.仅使用有限差分4.解决方案向量由n个变量组成,其中n取决于所需的模型参数,通常从12到可以说30。5.模型与原始数据之间的对数似然性代价高昂,另外存在非线性不等式很
高兴

Answers:


2

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

十二到三十个变量可能是模式搜索(也称为直接搜索)方法可操作的上限。可以在此处找到Rios和Sahinidis在《全球优化杂志》上有关无导数优化方法(例如模式搜索方法)的最新评论文章以及随附的网页。在SIAM Review中,有关Kolda,Lewis和Torczon的这些方法的最新评论文章可以在此处找到。这些方法在昂贵的函数评估中效果很好,并且不一定需要可微性或派生信息。

这些方法中的许多方法都需要某种凸度以确保收敛到全局最优值,因此,如果要严格解决问题,则可能需要将上述这些方法与分支定界策略结合使用。但是,如果您不关心严谨性,那么像MATLAB这样的方法fmincon可能就足够有效了(不再有保证)。有限差异很可能使您成为不可微分函数的次微分成员,这足以满足您的问题实例和特定的输入数据,以返回足够准确的结果供您使用。在这种情况下,您可能应该查看克里斯蒂安在其评论中链接的问题的答案中提到的库。


2

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

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

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

注意:我是该项目的开发人员之一。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.