Optimization 跳转解算器';添加重复约束时的行为

Optimization 跳转解算器';添加重复约束时的行为,optimization,julia,constraints,linear-programming,julia-jump,Optimization,Julia,Constraints,Linear Programming,Julia Jump,为了演示,我们假设以下模型不代表任何内容,这只是一个示例: 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> @constraint(m, [j=5:50

为了演示,我们假设以下模型不代表任何内容,这只是一个示例:

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> @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循环中。所以我想知道:

  • 只是约束的数量增加了一倍,但模型确切地知道他可以避免处理其中的一半
  • 他是否仍能记住约束条件,并且在避免一半约束条件的同时,仍然需要双倍的记忆
  • 如果是的话,有没有办法在添加约束之前检查约束集是否已经存在
“跳跃解算器如何处理重复约束?”在某种程度上概括了这一点


最后,我了解了
num_约束
函数返回所有用户输入的约束。如何获取唯一约束的数量?

跳转不区分唯一约束。它将添加您告诉它添加的所有约束。这样做的一个原因是,可以在创建约束后修改约束。但是,如果您能够证明冗余约束是导致显著减速的原因,我只会担心。如果是这样,我建议您重构代码,不要添加多余的约束

回答您的问题:

只是约束的数量增加了一倍,但模型确切地知道他可以避免处理其中的一半

每个解算器的预解算应该删除冗余约束(但这需要时间)

他是否仍能记住约束条件,并且在避免一半约束条件的同时,仍然需要双倍的记忆

对。它仍然需要两倍的内存

如果是的话,有没有办法在添加约束之前检查约束集是否已经存在


没有任何功能可以检查是否已添加约束。

一个好的解算器可能会预先解决这些重复的约束。@ErwinKalvelagen,谢谢您的回答!我在最后添加了最后一个问题:最后,我了解
num_约束
函数返回所有用户输入的约束。如何获取唯一约束的数量?您有什么想法吗?解算器日志可能会显示类似的内容:“LP Presolve消除了200000行和100列”。所以检查一下。num_constraints函数在解算器看到模型之前,而预解算器在解算器接收到模型之后但在它开始迭代之前工作。@ErwinKalvelagen,谢谢!有没有一种简单的方法来访问这些值而不是读取日志?我对此表示怀疑。当然,如果您正在生成重复项,您可以检查自己。对每个约束使用某种校验和。
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