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)
计算松弛等。
在 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)
计算松弛等。