为什么IPOPT在违反约束条件的情况下评估目标函数?

时间:2016-04-28 06:37:42

标签: julia mathematical-optimization non-linear-regression ipopt

我在朱莉娅内部使用IPOPT。我的目标函数会为某些参数值抛出一个错误(具体来说,虽然我认为这无关紧要,但它涉及协方差矩阵的Cholesky分解,因此要求协方差矩阵是正定的)。因此,我非线性地约束参数,以便它们不会产生错误。尽管有这种限制,IPOPT仍然坚持在参数上评估目标函数,导致我的目标函数抛出错误。这会导致我的脚本崩溃,导致痛苦和痛苦。

我很感兴趣,为什么IPOPT会在违反约束的参数下评估函数。 (我确保在评估函数之前确实检查了约束。)如果可能的话,我想知道如何阻止它这样做。

我已将IPOPT的'bound_relax_factor'参数设置为零;这没有用。我理解我可以要求目标函数返回NaN而不是抛出错误,但是当我做IPOPT似乎变得更加困惑并且最终没有收敛。可怜的事。

我很乐意提供一些示例代码,如果有帮助的话。

非常感谢提前:))

编辑:

评论者建议我在违反约束时要求我的目标函数返回错误的目标值。不幸的是,当我这样做时会发生这种情况 Ipopt running indefinitely at bad objective value

我不确定为什么Ipopt会从2.0016x10 ^ 2的评估点到10 ^ 10的评估点 - 我担心IPOPT有一些非常基本的东西我不理解。

将'constr_viol_tol'和'acceptable_constr_viol_tol'设置为最小值并不会显着影响优化,也不会“过度约束”我的参数(即确保它们不能接近不可接受的值)。

1 个答案:

答案 0 :(得分:3)

Ipopt在所有中间迭代中保证满足的唯一约束是变量的简单上限和下限。在解算器在最后一次迭代中完成收敛之前(如果它可以达到满足终止条件的点),则不一定满足任何其他线性或非线性相等或不等式约束。在存在任意非凸等式和不等式约束的情况下保证中间迭代总是可行的是不容易处理的。牛顿阶梯方向基于局部一阶和二阶导数信息,因此将是近似值,并且如果问题具有非平凡曲率,则可以留下可行点的空间。考虑以x * y == constant为例的点的空间。

您应该重新设计问题,以避免在无效点评估目标或约束函数。例如,不是采用由数据构造的协方差矩阵的Cholesky分解,而是引入单位下三角矩阵L和对角矩阵D。为所有D[i, i] >= 0和非线性等式约束i in 1:size(D,1)施加下限约束L * D * L' == A,其中A是您的协方差矩阵。然后在需要操作Cholesky分解的任何地方使用L * sqrtm(D)(这可能是半定分解,因此更多的是修改的Cholesky表示而不是经典的严格正定L * L'分解。)

请注意,如果你的问题是凸的,那么可能有一个专门的公式,即圆锥解算器比Ipopt这样的通用非线性求解器更有效求解。