【问题标题】:How to modify variables and constraints of an existing Google OR-Tools Constraint Programming model?如何修改现有 Google OR-Tools 约束编程模型的变量和约束?
【发布时间】:2021-07-01 09:44:15
【问题描述】:

我使用 Python 中的 Google OR Tools 编写了一个约束编程模型,该模型使用 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)

现在,在问题的第二次运行中,我想做以下更改。

  1. 将变量c的上界改为5
  2. 删除约束a==b
  3. 创建一个新的约束a==c

如果不从头开始构建模型,如何实现这一点?

【问题讨论】:

    标签: python mathematical-optimization or-tools constraint-programming operations-research


    【解决方案1】:

    首先,你可以看看这个page

    基本思想是您可以操作存储在 cp_model 类中的底层 protobuf。唯一的规则是你不应该删除一个变量,因为它们在其他约束中被索引引用。

    要删除一个约束,只需在其上调用 Clear()(参见 link)。 要添加约束,请使用普通 API。 要更改变量的域,您可以操纵其域。请注意,域存储为不相交的闭合区间的扁平列表。

    【讨论】:

      【解决方案2】:

      这是 Laurent 回答后的代码:

      # 1. change c upper bound to 5
      c.Proto().domain._values = []
      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()
      

      【讨论】:

      • 我会检查的。但我认为底层原型上有一个吸气剂。
      • 你说的很对,不知道我是怎么忘记的,编辑了
      猜你喜欢
      • 2018-06-17
      • 1970-01-01
      • 2019-06-28
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多