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

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

我在 Julia 中使用 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”设置为它们的最小值不会明显影响优化,也不会“过度限制”我的参数(即确保它们不会接近 Not Acceptable 值)。

最佳答案

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

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

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

关于julia - 为什么 IPOPT 会在违反约束的情况下评估目标函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36907064/

相关文章:

python - 在不组合特征的情况下运行多项式回归

julia - Julia 有延迟设置吗? (相当于 := from Mathematica)

arrays - 为 julia 删除数组中的元素

julia - 滚动阵列,均匀圆形移位

python - Gurobi:获取优化运行时

python - CVXPY:如何高效解决一系列类似问题

julia - Julia 中 typealias 的替代品是什么?

machine-learning - 更新时如何检查 Tensorflow 中梯度的 NaN?

r - R中的非线性回归分析

r - `nls` 拟合错误 : always reach maximum number of iterations regardless starting values