如何修改现有 Google OR-Tools 约束编程模型的变量和约束?

问题描述 投票:0回答:2

我使用 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)

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

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

如何在不从头开始构建模型的情况下实现这一目标?

python mathematical-optimization or-tools constraint-programming cp-sat
2个回答
6
投票

这是 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()

3
投票

首先,你可以看看这个页面

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

要删除约束,只需对其调用 Clear()(请参阅此链接)。 要添加约束,请使用普通 API。 要更改变量的域,您可以操作其域。请注意,域存储为不相交闭区间的扁平列表。

© www.soinside.com 2019 - 2024. All rights reserved.