python Google OR工具未实现错误:不支持将BoundedLinearExpr计算为布尔值

slwdgvem  于 2023-01-08  发布在  Python
关注(0)|答案(3)|浏览(154)

我用Python为医院的一个部门开发了一个护士排班程序,该程序使用了OR工具,并基于以下示例:https://github.com/google/or-tools/blob/master/examples/python/shift_scheduling_sat.py
为了限制员工在一周/一个月内可以工作的班次数量,我使用了以下形式的限制:

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)表示周或月的开始/结束。
这个程序运行了几个月都很好,直到大约两周前。然后我开始收到这种类型的约束的错误。具体来说,我收到了以下消息:

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

由于运行时问题,我通常在Google Cloud VM上运行代码,所以这就是我遇到麻烦的地方。然而,当我在本地机器上运行代码时,可能有不同版本的OR-Tools,我没有得到任何错误。
我在文档中找不到关于这个问题的任何东西。因此我想知道如何解决这个问题?是需要在软件包中修复还是需要重写代码。如果是这样,我需要做什么修改,示例代码似乎没有改变?

mnemlml8

mnemlml81#

Python Package 器已更新,以捕获更多用户错误。
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))
2eafrhcq

2eafrhcq2#

在重写代码并按照@Stradivari建议的方式实现约束之后,我能够成功地运行代码,而不会遇到BoundedLinearExpr错误:

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)
9bfwbjaz

9bfwbjaz3#

使用以下命令时也会出现此错误

model.add(yourBoolVar)

代替

model.add(yourBoolVar == 1)

相关问题