Julia JuMP 可行性松弛约束

Julia JuMP feasibility slack of constraints

在 Julia 中,通过使用 JuMP am 设置一个简单的优化问题(MWE,真正的问题要大得多)。

model = Model()
set_optimizer(model, MosekTools.Optimizer)
@variable(model, 0 <= x[1:2])
@constraint(model, sum(x) <= 2)
@constraint(model, 1 <= sum(x))
@objective(model, Min, sum(x))
print(model)

这给了这个模型:

Min x[1] + x[2]
Subject to
 x[1] + x[2] ≤ 2.0
 -x[1] - x[2] ≤ -1.0
 x[1] ≥ 0.0
 x[2] ≥ 0.0

我通过optimize!(model)优化了这个模型。

现在,显然,约束 x[1] + x[2] <= 2 是多余的,它的可行性松弛度为“3”。我的目标是确定松弛度大于 0 的所有约束并显示松弛度。然后我将从模型中删除它们。

为此,我迭代了不是变量边界的约束并打印了它们的值。

for (F, S) in list_of_constraint_types(model)
    # Iterate over constraint types
    if F!= JuMP.VariableRef #for constraints that 
        for ci in all_constraints(model, F, S)
            println(value(ci))
        end
    end
end

但是,因为我打印了约束的 value,所以我得到了左侧:

1.0
-1.0

我想将休闲裤视为

0
3

我该怎么做?请注意,我不一定对线性程序感兴趣,所以 shadow_value 之类的东西对我没有用。


基于已接受的答案,我添加了一个 MWE 来解决这个问题。

model = Model()
set_optimizer(model, MosekTools.Optimizer)
@variable(model, 0 <= x[1:2])
@constraint(model, sum(x) <= 2)
@constraint(model, 1 <= sum(x))
@constraint(model, 0.9 <= sum(x))
@objective(model, Min, sum(x))
print(model)
optimize!(model)
constraints_to_delete = vec([])
for (F, S) in list_of_constraint_types(model)
    if F!= JuMP.VariableRef
        for ci in all_constraints(model, F, S)
            slack = normalized_rhs(ci) - value(ci)
            if slack > 10^-5
                push!(constraints_to_delete, ci)
                println(slack)
                #delete(model, ci)
            end
        end
    end
end

for c in constraints_to_delete
    delete(model, c)
end

print(model)

阅读此(热销)教程:https://jump.dev/JuMP.jl/dev/tutorials/linear/lp_sensitivity/

虽然专注于 LP,但它展示了如何使用 normalized_rhs(ci) - value(ci) 计算松弛等。