我使用 Google OR Tools in Python 编写了一个约束编程模型,它使用 CP 求解器。我需要多次运行该模型,并且在每次运行中我都会修改约束。目前,每次我想运行模型时,我都会从头开始创建模型对象。无论如何,我可以修改现有模型的变量/约束,这样我就不需要每次都从头开始构建模型吗?
为了提供更好的背景信息,请考虑以下示例模型。
from ortools.sat.python import cp_model
model = cp_model.CpModel()
num_vals = 3
a = model.NewIntVar(0, num_vals -1, 'a')
b = model.NewIntVar(0, num_vals -1, 'b')
c = model.NewIntVar(0, num_vals -1, 'c')
model.Add(a == b)
solver = cp_model.CpSolver()
solver.Solve(model)
现在,在问题的第二次运行中,我想做以下更改。
5
a==b
a==c
如何在不从头开始构建模型的情况下实现这一目标?
这是 Laurent 回答之后的代码:
# 1. change c upper bound to 5
c.Proto().domain[:] = []
c.Proto().domain.extend(cp_model.Domain(0, 5).FlattenedIntervals())
# 2. delete a == b
# assuming that you did a_eq_b = model.Add(a == b)
a_eq_b.Proto().Clear()