Matlab中一般非凸/非线性约束问题(NLP)求解器的包装器

Matlab中一般非凸/非线性约束问题(NLP)求解器的包装器,matlab,mathematical-optimization,nonlinear-optimization,Matlab,Mathematical Optimization,Nonlinear Optimization,我有一个具有一般非凸不等式约束的一般非凸函数。我有一个可行的起点,我想在约束条件下最小化一个能量。解算器不得离开可行域(即屏障方法),也不得增加能量。到目前为止,我使用的fmincon在两个帐户上都失败了,我想用一种简单的方法来尝试其他解决方案,如IPOPT、KNITRO和SNOPT。 说到这里,我不介意推荐一个特定的解算器来完成我所寻找的(不增加并保持在可行区域) 我想尝试其他解算器,但我希望在某个包装器中对问题进行一次建模(例如,用于凸优化的yalmip和cvx;关于AMPL呢?),这将把问

我有一个具有一般非凸不等式约束的一般非凸函数。我有一个可行的起点,我想在约束条件下最小化一个能量。解算器不得离开可行域(即屏障方法),也不得增加能量。到目前为止,我使用的fmincon在两个帐户上都失败了,我想用一种简单的方法来尝试其他解决方案,如IPOPT、KNITRO和SNOPT。 说到这里,我不介意推荐一个特定的解算器来完成我所寻找的(不增加并保持在可行区域)

我想尝试其他解算器,但我希望在某个包装器中对问题进行一次建模(例如,用于凸优化的yalmip和cvx;关于AMPL呢?),这将把问题转化为其他解算器(或者只调用我的函数并将其输出转换为每个解算器所需的内容,即,我希望使用单个接口)。 为了在代码方面尽可能灵活,我更愿意为目标函数和约束函数及其梯度提供回调函数(用Matlab编写),它将返回实际值。当然,如果可以选择使用内部变量,在不影响代码灵活性的情况下提供auto diff之类的功能,那就太好了(我有一个复杂的代码,让它对某些特殊的变量类型友好会很麻烦)。 我没有尝试过,但如果它足够灵活,我不介意使用.nl文件,尽管我需要一些与我的matlab代码接口的提示(运行一些请求解决问题的应用程序-即,它提供输入,并期望来自某些解算器函数(如fmincon)的解决方案)


顺便说一句,我对fmincon()的问题是,在某个点上,它开始增加函数,并可能以更糟糕的点(更大的目标)结束,如果过早终止(它似乎不会收敛),还会破坏约束。

我使用了一些解算器和建模包,重点是Matlab

  • 首先,内点法的定义似乎相当宽松。所有解算器都允许自己进入不可行区域(即行为类似于惩罚方法),而wiki非常清楚地描述了一种屏障方法,其中包含一个包含约束的日志函数:

因此,当我想严格处理我的问题(保持在可行域内)时,我定义了自己的f_aggregate(),用一个日志包装我的约束,并且只使用解算器来绑定变量范围(或者只使用一个无约束解算器)

  • Yalmip非常方便。定义NLP问题的方式与使用sdpvar定义凸问题的方式相同,sdpvar跟踪操作,我假设它创建了一个类似于auto diff包的模型。缺点:

  • 代码需要与sdpvar兼容,因此需要一些努力,例如,替换bsxfun()调用或替换双矩阵的赋值。另一方面,不需要提供衍生品
  • 它的伸缩性不好。在一个小问题上,它运行得很好,但在一个小问题上,它运行了将近一个小时,其中一半的时间都花在配方上(例如,处理一个电源操作似乎很昂贵)。 这对我来说意味着,与向mosek提供模型不同,它向IPOPT提供了一个缓慢的回调(类似于auto diff)(但我可能错了)。我看不到IPOPT所做的迭代。 我的相关帖子:
  • OptiToolbox的级别更低,允许回调,这更符合我的要求。但似乎NLP唯一有趣的支持解算器是IPOPT。公平地说,其他有趣的解决方案是商业性的。 它还可以使用SCIP编写.gms文件,该文件可以由GAMS执行或由GAMS导出到AMPL。不幸的是,我的特定问题没有正确编写,两个包在导出的问题上产生了相同的错误结果

  • 我和AMPL玩了一点(GAMS看起来很像)。这并不是那么直观,问题的表述水平相当低(例如,没有范数函数或其他甜味剂),并且转换我的matlab代码或基于它为AMPL生成问题(由我自己)似乎是一件痛苦的事情。此外,演示版本将问题限制为10个变量,供感兴趣的解算器使用

  • 有一些商业解决方案,比如Knitro和Snopt,我想尝试一下。它们都有6个月的试验期,但它们仅限于300个变量。我不确定如何在一个限制为300个变量的大规模问题上测试解算器。 更新:Knitro还有一个月的试用期,我可以试试

  • Tomlab看起来很有趣。这是一个类似OptiToolbox的商业软件包,可以和商业解算器接口。我正在等待他们回复许可证,但它将被限制为21天

  • 我认为有在线服务器,可以尝试商业解决方案。但我需要一个好的出口商(例如)GAMS或AMPL格式

  • 总而言之,Matlab的fmincon看起来并没有那么糟糕。虽然只有内部点可以处理大规模问题,但它似乎至少和IPOPT一样好(当我的目标函数返回Inf以拒绝解决方案时,它目前似乎有一个bug)。 由于NLP问题通常都很难解决,我想我不应该期待像莫塞克这样的神奇解决者

更新:我碰巧尝试了Knitro和Snopt(完整版本)。 Knitro的matlab界面非常出色。它与fmincon完全相同,实现了相同算法的稀疏更健壮版本。 Snopt类似于fmincon的接口很笨重。我不得不修补它以添加雅可比稀疏性,返回的雅可比被转置,我花了很多时间来掌握它,因为它每出一个小错误都会使matlab崩溃。 就我在问题上的表现而言,Knitro出人意料地失败了一次