Google OR-Tools NotImplementedError: Evaluating a BoundedLinearExpr as a Boolean value is not supported

Google OR-Tools NotImplementedError: Evaluating a BoundedLinearExpr as a Boolean value is not supported

我为我在 Python 工作的医院的一个部门开发了一个护士调度程序。该程序使用 OR-Tools 并基于以下示例:https://github.com/google/or-tools/blob/master/examples/python/shift_scheduling_sat.py

为了限制员工可以在 week/month 中工作的班次数量,我使用了以下形式的限制:

  model.Add(min_hour <= sum(work[k, s, d] for s in range(1, 4) for d in range(i, j)) <= max_hour)

这里的 (i,j) 表示 beginning/end 一周或一个月。

该程序在几个月前运行良好,直到大约 2 周前。然后我开始收到有关此类约束的错误。具体来说,我收到以下消息:

  NotImplementedError: Evaluating a BoundedLinearExpr as a Boolean value is not supported.

由于 运行 时间问题,我通常 运行 将代码放在 Google 云虚拟机上,所以这就是我 运行 遇到麻烦的地方。但是,当我 运行 我本地机器上的代码可能有不同版本的 OR-Tools 时,我根本没有收到任何错误。

我无法在文档中找到有关此问题的任何内容。因此我想知道如何解决这个问题?它是需要在包中修复的东西还是我需要重写我的代码。如果是这样,我需要做哪些更改,示例代码似乎没有变化?

Python 包装器已更新以捕获更多用户错误。

ortools==8.2.8710 中打印 OPTIMAL:

from ortools.sat.python import cp_model

model = cp_model.CpModel()
a = model.NewIntVar(0, 1, "")

model.Add(2 <= a <= 3)  # doesn't do anything
solver = cp_model.CpSolver()
solver.Solve(model)

print(solver.StatusName())

而在较新的版本中它会引发错误。

您必须将约束拆分为 2 model.Add。 (或删除约束以获得相同的错误行为)

编辑:在你的情况下

hours = sum(work[k, s, d] for s in range(1, 4) for d in range(i, j))
model.Add(hours >= min_hour)
model.Add(hours <= max_hour)

# or following Laurent's advice
model.AddLinearExpressionInDomain(hours, cp_model.Domain(min_hour, max_hour))

我能够 运行 代码成功,没有遇到 Bounded LinearExpr 错误,重写后,并按照@Stradivari 建议的方式实现约束:

hours = sum(work[k, s, d] for s in range(1, 4) for d in range(i, j))
model.Add(hours >= min_hour)
model.Add(hours <= max_hour)