julia - JuMP 非线性优化约束被打破到 O(1e-9)

我在 JuMP 中使用 Ipopt 优化器运行非线性优化。我的目标/成本函数依赖于严格遵守的约束。然而,在某些迭代中,约束被打破了。

具体来说,我的约束是 s.t.值应该在 0 和 1/0.6 = 1.6666666 之间....

但是,在某些迭代中,变量的值如下:

-7.761358324221462e-9 或 1.6666666718748067

使程序崩溃。

这是一个错误吗?是 JuMP 还是 Ipopt 的问题?有解决方法吗?

代码:

using JuMP
using Ipopt

model = Model(Ipopt.Optimizer)
@variable(model, 0.0 <= ξ[1:6] <= 1.0/0.6)
set_start_value.(ξ, ξ₀)

@constraint(model, dot(ξ, T) == 1)

register(model, :objtv, 6, MyNonLinearObjectiveFn; autodiff=true)
@NLobjective(model, Min, objtv(ξ...))

optimize!(model)

最佳答案

当使用计算机处理实数时,您永远无法获得完全的精度。基本上,在这种情况下所做的是在从求解器获得解决方案后应用舍入(例如,在您的情况下舍入为整数或有理数 - 例如,尝试类似 rationalize(1.6666666718748067, tol=1e-6 ) 因为 1e-6 是 Ipopt 中的默认容差)。

话虽如此,您可以尝试使用 Ipopt 的精度/容差选项,例如(您的代码不完整,所以我无法测试您的情况):

set_optimizer_attribute(model, "constr_viol_tol", 1e-10)
set_optimizer_attribute(model, "acceptable_tol", 1e-10)

您可以在 Ipopt 文档中找到更多具有 _tol 后缀的选项,并查看它们如何影响您的解决方案的精度:参见 https://coin-or.github.io/Ipopt/OPTIONS.html

https://stackoverflow.com/questions/70852073/

相关文章:

apache-spark - 由于执行者丢失导致洗牌阶段失败

python - 给定四边形的角,使用 matplotlib 在 3d 中绘制阴影四边形

python - PyTorch 中的 DataLoader 和 DataLoader2 有什么不同

python - 将列名传递给 Pandas read_csv() 函数

npm - sh : hardhat: command not found when install

java - 如何对 Map> 进行排序?

react-native - 如何在 React Navigation 中使用图标代替原来的后退按钮

angular - 如何配置 nginx 以在/和代理/api 上为另一个 api 服务器提供 An

flutter - 如何修复此语法错误?不可为 null 的实例字段 'students' 必须初始

sql - Postgres SELECT 查询中的模式匹配