我有一个具有一般非凸不等式约束的一般非凸函数。我有一个可行的出发点,我想在限制条件下尽量减少精力。求解器绝不应该离开可行域(即势垒方法),并且绝不应该增加能量。到目前为止,我使用的fmincon都失败了,并且我想尝试一种简单的方法来尝试其他求解器,例如IPOPT,KNITRO和SNOPT。
说到这一点,我不介意为某个特定的求解器提供建议,该求解器可以完成我要寻找的内容(不增加且停留在可行范围内)。

我想尝试其他求解器,但是我想一次在某个包装器上对问题进行建模(例如,使用yalmip和cvx进行凸优化;对AMPL怎么办?),这会将其转换为其他求解器(或只是调用我的函数,并将其输出转换为每个求解器所需的输出-即,我想使用一个接口。
为了在代码方面尽可能地灵活,我宁愿为目标函数和约束函数及其梯度提供回调函数(用Matlab编写),这些函数将返回实数值。当然,如果可以选择使用内部变量来提供诸如auto-diff之类的功能而又不影响代码灵活性的话,那会很好(我有一个复杂的代码,并且使其对某些特殊变量类型友好)麻烦)。
我没有尝试过,但是如果它足够灵活,我不会介意使用.nl文件,尽管我需要管道上的一些技巧来与我的Matlab代码进行交互(运行一些需要解决问题-即它提供了输入,并期望从诸如fmincon的某些求解器功能获得解决方案。

顺便说一句,我对fmincon()的问题是,它在某个时候开始增加功能,并可能以更糟糕的结果(更大的目标)结束,并且如果过早终止则折衷约束(它似乎没有收敛)。

最佳答案

我玩了一些求解器和建模包,重点是Matlab。

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

  • https://en.wikipedia.org/wiki/Interior_point_method

    因此,当我想严格限制我的问题(以保持可行域的范围)时,我定义了自己的f_aggregate(),用日志将约束包裹起来,并仅使用求解器来限制变量范围(或仅使用不受约束的变量求解器)。
  • Yalmip非常方便。定义NLP问题的方式与使用sdpvar定义凸问题的方式相同,后者跟踪操作,并且我假设它创建的模型类似于auto-diff软件包。缺点:
  • 该代码需要与sdpvar兼容,因此需要付出一些努力,例如,替换bsxfun()调用或替换对双矩阵的赋值。另一方面,无需提供衍生工具。
  • 无法很好地扩展。在一个小问题上,它可以正常工作,但在一个小问题上,它运行了将近一个小时,其中一半的时间花在了配方上(例如处理电源操作似乎很昂贵)。
    对我而言,这意味着与向mosek提供模型不同,它向IPOPT提供了缓慢的回调(类似于自动差异)(但我可能错了)。我看不到IPOPT的迭代。
    我的相关文章:
    https://groups.google.com/forum/?fromgroups#!searchin/yalmip/zohar/yalmip/eJidaJgI9ec/0KqI-KP4LwAJ
  • 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拒绝解决方案时,它似乎存在一个错误)。
    由于NLP的问题通常很难解决,所以我认为我不应该期望像Mosek这样的魔术师。

  • 更新:我碰巧尝试Knitro和Snopt(完整版本)。
    Knitro的matlab界面非常出色。就像fmincon一样,实现相同算法的稀疏,更健壮的版本。
    Snopt的类似fmincon的界面笨拙。我必须修补它以增加Jacobian稀疏性,然后返回的Jacobian被换位,并且花了我一些时间来掌握它,因为它因每个小错误而崩溃了matlab。
    就我所遇到的问题的性能而言,Knitro出人意料地在我的一个小问题上失败了一次,并且总体而言,这两个求解器的性能都没有比其他求解器好得多(运行了数小时却没有收敛)。

    UPDATE2:我在下面尝试了Erwin Kalvelagen为每个不等式约束添加变量,用等式约束(ineq = new var)替换不等式约束,并绑定了var。
    fmincon遵守这些界限,但这不是一个神奇的解决方案,而且求解器很早就被卡住了。此外,IPOPT和Knitro不遵守均衡界限,进入了不可行的领域。

    关于matlab - 用于Matlab的一般非凸/非线性约束问题(NLP)的求解器的包装器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36782768/

    10-12 18:50