当前位置: 首页 > 知识库问答 >
问题:

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

梁浩涆
2023-03-14

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

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

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

共有1个答案

罗绪
2023-03-14

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

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

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

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

>

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

    1. 代码需要与sdpvar兼容,因此需要付出一些努力,例如,替换bsxfun()调用或替换对双矩阵的赋值。另一方面,不需要提供衍生品

    OptiToolbox级别更低,允许回调,这正是我想要的。但似乎唯一有趣的支持非线性规划的解算器是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以拒绝解决方案时,IPOPT目前似乎有一个错误)。由于NLP问题通常很难,我想我不应该期待像Mosek这样的神奇求解器。

    更新:我碰巧尝试了Knitro和Snopt(完整版本)。Knitro的matlab界面非常棒。它与fmincon完全一样,实现了相同算法的稀疏更稳健版本。Snopt类似于fmincon的界面很笨拙。我不得不对其进行修补以添加雅可比稀疏性,返回的雅可比矩阵被转置,我花了时间来掌握它,因为它每出现一个小错误都会使matlab崩溃。就我的问题表现而言,Knitro在我的一个小问题上出人意料地失败了一次,两个解算器通常都没有比其他解算器做得更好(运行数小时而没有收敛)。

    更新2:我试着在下面为每个不等式约束添加一个变量,用等式约束替换不等式约束(ineq=新var),并约束变量。fmincon尊重这些边界,但这不是一个神奇的解决方案,求解器很早就卡住了;此外,IPOPT和Knitro不尊重eq界限,进入了不可行区域。

  •  类似资料:
    • 我很难理解非线性优化中的性能如何受到求解器引擎接口的特定方式的影响。 我们有一个优化模型,在它的第一个版本中,是用GAMS编写的。IPOPT(一个常见的FOOS非线性求解器引擎)在IPOPT(无函数评估)中为每个优化返回1.4 CPU秒的执行时间,在函数评估中返回0.2 CPU秒的执行时间。 当我们将模型转换为C(以便更好地考虑模型的非优化组件)并通过其C API接口IPOPT时(使用ADOL-C

    • 我正在用pyomo编程求解非线性优化问题(使用ipopt求解器)。稍后,我想在模型中添加随机元素。我知道在Pyomo中,可以使用复数形式来处理随机规划,但复数形式只能处理线性规划、混合整数规划和二次规划。 一般非线性随机规划问题有求解器吗?如果没有,我们如何使用现有的求解器来处理它?

    • 在不同的限制条件下,我试图挑选最好的梦幻足球队。我的目标是挑选能够最大化其预测积分总和的球员。 制约因素是: 1) 团队必须包括: -1个QB -2苏格兰皇家银行 -2个WRs -1 TE 2)玩家的风险不得超过6 3) 球员的费用总额不得超过300英镑。 如何做到这一点?R中优化这些约束的最佳包/函数是什么?在给定这些约束的情况下,最大化投影点的函数调用会是什么样子?仅供参考,我将搜索100-3

    • 我正在研究一个非线性微分方程求解器。我能得到一般的解决方案,但不能得到具体的解决方案。当我试图找到集成常量时,我得到了错误:E_x不可调用的,我的解决方案被归类为一个列表,所以我不能在其中替换任何东西。 这是我的代码: 我在上得到了可调用错误,在我在书中的例子(数值Python)解决了一个线性ODE,但没有得到这个错误。有没有一种不同的方法来解决非线性DE,或者将E定义为可调用的,而将E_sol定

    • 问题内容: 在MySQL中创建非NULL约束以使fieldA和fieldB不能都为NULL的最佳方法是什么。我不在乎任何一个本身是否为NULL,只要另一个字段具有非NULL值即可。而且,如果它们都具有非NULL值,那就更好了。 问题答案: MySQL 5.5引入了SIGNAL,因此我们不再需要Bill Karwin的答案中的额外列。Bill指出您还需要一个更新触发器,因此我也将其包括在内。

    • 问题内容: 我有三个未知数4非线性方程,和我想要解决。等式的形式为: …其中,和是取决于四个方程式中每个值的常数。 解决此问题的最佳方法是什么? 问题答案: 有两种方法可以做到这一点。 使用非线性求解器 线性化问题并以最小二乘法解决 设定 因此,据我所知,您知道在4个不同点处的F,a,b和c,并且想要对模型参数X,Y和Z求逆。我们有3个未知数和4个观测数据点,因此这个问题太确定了。因此,我们将在最