我在 Julia 中使用 IPOPT。我的目标函数会针对某些参数值抛出错误(具体来说,虽然我认为这无关紧要,但它涉及协方差矩阵的 Cholesky 分解,因此要求协方差矩阵是正定的)。因此,我对参数进行非线性约束,以便它们不会产生错误。尽管有这个限制,IPOPT 仍然坚持在参数处评估目标函数,这会导致我的目标函数抛出错误。这会导致我的脚本崩溃,导致痛苦和痛苦。
我很感兴趣,一般来说,IPOPT 会在违反约束的参数处评估函数。(我确保它确实在评估函数之前检查了约束。)如果可能,我想知道如何阻止它这样做。
我已将 IPOPT 的 'bound_relax_factor' 参数设置为零;这没有帮助。我知道我可以要求目标函数返回NaN
而不是抛出错误,但是当我这样做时,IPOPT 似乎变得更加困惑并且最终没有收敛。可怜的东西。
如果有帮助,我很乐意提供一些示例代码。
提前谢谢了 :):)
编辑:
一位评论者建议我要求我的目标函数在违反约束时返回一个错误的目标值。不幸的是,当我这样做时会发生这种情况:
我不确定为什么 Ipopt 会从 2.0016x10^2 的评估点变为 10^10 的评估点——我担心 IPOPT 有一些非常基本的东西我不理解。
将 'constr_viol_tol' 和 'acceptable_constr_viol_tol' 设置为其最小值不会显着影响优化,也不会“过度约束”我的参数(即确保它们不能接近不可接受的值)。