如何删除ORTools中的约束

时间:2018-06-18 09:44:47

标签: python or-tools

有没有办法从解算器中移除已定义的约束而不使用清除解算器并从第一个创建约束?

假设我的问题是最大化3个变量的总和,这两个约束

constraint1:变量2应介于8 - 10之间

约束2:变量3应在5 - 10之间

from ortools.linear_solver import pywraplp

solver = pywraplp.Solver('SolveIntegerProblem',
                       pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING)

objective = solver.Objective()

Variable[0] = solver.IntVar(0, 5, variable 0 )
Variable[1] = solver.IntVar(0, 10, variable 1 )
Variable[2] = solver.IntVar(0, 20, variable 2 )

objective.SetCoefficient(Variable[0], 1)
objective.SetCoefficient(Variable[1], 1)
objective.SetCoefficient(Variable[2], 1)

objective.SetMaximization() 

constraints.append(solver.Constraint(8,10))
constraints[0].SetCoefficient(variable[1],1) 

constraints.append(solver.Constraint(5,10))
constraints[1].SetCoefficient(variable[2],1)  

现在在第二次运行我的代码时我想删除约束号2,但我找不到任何操作来执行它,唯一的方法是清除求解器并从第一个定义约束。

在这个半代码中,约束的数量是有限的,但实际上,在我的实际代码中,约束的数量很多,我不能从最初定义它们。

2 个答案:

答案 0 :(得分:1)

我知道这个问题已经很老了,但是:

  • 据我所知,or-tools没有提供任何删除约束或变量的接口。从工程的角度来看,弄乱内部逻辑以“手动”将其删除是很危险的。

  • 对于我的技术堆栈,我绝对需要该功能,并在那里尝试了多个python线性编程库(实际上是围绕clp / cbc的包装器),尽管存在该缺陷,我还是选择了or-tools,其原因有两个:1

  • 唯一的具有最低功能支持的库,我当时需要(2-5年前),它是唯一使用C绑定的库。

所有其他人都使用一种与cbc命令行接口的另一种形式,这是一种与python接口的可怕方式。由于在磁盘上写入和读取文件的开销,它不可扩展。讨厌讨厌因此,如果我没记错的话,只有pylp和or-tools具有c绑定,如果我没记错的话,pylp与python 3不兼容(并且从那以后一直处于困境),所以我选择了or-tools。

所以要回答您的问题:要使用or-tools“删除”变量或约束,我必须围绕or-tools构建自己的python包装器。要停用变量或约束,我将系数设置为零且自由范围(设置为+/-无穷大),并将成本设置为零以有效地停用约束。在我的包装器中,我将保留一个停用的约束/变量的列表,并对其进行回收而不是创建新的约束/变量(事实证明,这会导致运行时间增加和内存泄漏,因为C ++ + python是这些领域的噩梦)。我非常怀疑在回收过程中会产生浮点噪声,但实际上它足以满足我的需求。

因此在您的代码示例中,要重新运行而无需从头开始创建新模型,您需要这样做:

(...)

constr1 = solver.Constraint(8,10)
constraints.append(constr1)
constraints[0].SetCoefficient(variable[1],1) 

constr2 = solver.Constraint(5,10)
constraints.append(constr2)
constraints[1].SetCoefficient(variable[2],1)

constr2.SetBounds(-solver.infinity(), solver.infinity())
constr2.SetCoefficient(variable[2], 0)

# constr2 is now deactivated. If you wanted to add a new constraints, you can
# change the bounds on constr2 to recycle it and add new variables 
# coefficients

话虽这么说,最近python-mip发布了,它支持删除变量和约束,并具有c绑定。

答案 1 :(得分:0)