我有一个具有一般非凸不等式约束的一般非凸函数。我有一个可行的出发点,我想在限制条件下尽量减少精力。求解器绝不应该离开可行域(即势垒方法),并且绝不应该增加能量。到目前为止,我使用的fmincon都失败了,并且我想尝试一种简单的方法来尝试其他求解器,例如IPOPT,KNITRO和SNOPT。
说到这一点,我不介意为某个特定的求解器提供建议,该求解器可以完成我要寻找的内容(不增加且停留在可行范围内)。
我想尝试其他求解器,但是我想一次在某个包装器上对问题进行建模(例如,使用yalmip和cvx进行凸优化;对AMPL怎么办?),这会将其转换为其他求解器(或只是调用我的函数,并将其输出转换为每个求解器所需的输出-即,我想使用一个接口。
为了在代码方面尽可能地灵活,我宁愿为目标函数和约束函数及其梯度提供回调函数(用Matlab编写),这些函数将返回实数值。当然,如果可以选择使用内部变量来提供诸如auto-diff之类的功能而又不影响代码灵活性的话,那会很好(我有一个复杂的代码,并且使其对某些特殊变量类型友好)麻烦)。
我没有尝试过,但是如果它足够灵活,我不会介意使用.nl文件,尽管我需要管道上的一些技巧来与我的Matlab代码进行交互(运行一些需要解决问题-即它提供了输入,并期望从诸如fmincon的某些求解器功能获得解决方案。
顺便说一句,我对fmincon()的问题是,它在某个时候开始增加功能,并可能以更糟糕的结果(更大的目标)结束,并且如果过早终止则折衷约束(它似乎没有收敛)。
最佳答案
我玩了一些求解器和建模包,重点是Matlab。
https://en.wikipedia.org/wiki/Interior_point_method
因此,当我想严格限制我的问题(以保持可行域的范围)时,我定义了自己的f_aggregate(),用日志将约束包裹起来,并仅使用求解器来限制变量范围(或仅使用不受约束的变量求解器)。
对我而言,这意味着与向mosek提供模型不同,它向IPOPT提供了缓慢的回调(类似于自动差异)(但我可能错了)。我看不到IPOPT的迭代。
我的相关文章:
https://groups.google.com/forum/?fromgroups#!searchin/yalmip/zohar/yalmip/eJidaJgI9ec/0KqI-KP4LwAJ
它还可以使用SCIP写入.gms文件,该文件可以由GAMS执行或由GAMS导出到AMPL。不幸的是,我的特定问题未正确编写,并且两个软件包在导出的问题上产生了相同的错误结果。
更新:Knitro也有一个月的试用期,我可以尝试。
由于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/