【发布时间】:2021-01-14 13:47:08
【问题描述】:
让我们假设我有以下不代表任何东西的模型,这只是一个示例:
using GLPK
using JuMP
m = Model(GLPK.Optimizer)
@variable(m, y[i=1:100], Bin)
@objective(m, Min, sum(y))
@constraint(m, [j=5:50], sum([y[i] for i in j:j+10]) >= 5)
现在,
julia> num_constraints(m, GenericAffExpr{Float64,VariableRef}, MOI.GreaterThan{Float64})
46
哪个好。然后,如下:
julia> @constraint(m, [j=5:50], sum([y[i] for i in j:j+10]) >= 5)
[...]
julia> num_constraints(m, GenericAffExpr{Float64,VariableRef}, MOI.GreaterThan{Float64})
92
这意味着模型现在的约束数量增加了一倍,而所有约束都是重复的。这对我来说是有问题的,因为我有另一个真实模型,其中我有更多的约束,我有时会添加可能重复或可能不重复的约束。所有这些都在 for 和 while 循环中。所以我想知道是否:
- 只是约束的数量翻了一番,但模型确切地知道他可以避免处理其中的一半?
- 他是否仍能记住约束并在避免其中一半的同时仍需要双倍的记忆?
- 如果是,有没有办法在添加之前检查一组约束是否已经存在?
这在某种程度上可以概括为“JuMP 求解器如何处理重复约束?”。
最后,我了解num_constraints 函数返回所有用户输入的约束。如何获得唯一约束的数量?
【问题讨论】:
-
一个好的求解器可以预先解决这些重复的约束。
-
@ErwinKalvelagen,谢谢你的回答!我在最后添加了最后一个问题:最后,我了解
num_constraints函数返回所有用户输入的约束。如何获得唯一约束的数量?你有什么想法吗? -
求解器日志可能显示如下内容:“LP Presolve 消除了 200000 行和 100 列”。所以检查一下。 num_constraints 函数是在求解器看到模型之前,而预求解器在求解器收到模型之后,但在它开始迭代之前工作。
-
@ErwinKalvelagen,谢谢!有没有一种简单的方法来访问这些值而不是阅读日志?
-
我对此表示怀疑。当然,您可以检查自己是否正在生成重复项。对每个约束使用某种校验和。
标签: optimization julia constraints linear-programming julia-jump