为什么 IPOPT 会在违反约束的情况下评估 objective 函数?

Why does IPOPT evaluate objective function despite breaching constraints?

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

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

我已将 IPOPT 的 'bound_relax_factor' 参数设置为零;这没有帮助。我知道我可以让 objective 函数变为 return NaN 而不是抛出错误,但是当我执行 IPOPT 时似乎变得更加混乱并且最终没有收敛。可怜的东西。

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

非常感谢:):)

编辑:

一位评论者建议我让我的 objective 函数在违反约束时 return 一个错误的 objective 值。不幸的是,当我这样做时会发生这种情况:

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

将 'constr_viol_tol' 和 'acceptable_constr_viol_tol' 设置为最小值不会明显影响优化,'over-constraining' 我的参数也不会(即确保它们不会接近不可接受的值)。

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

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

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