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)
我为我在 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)