Google OR-Tools 错误:不支持将 BoundedLinearExpr 计算为布尔值

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

提问人:Svenja K 提问时间:5/27/2021 最后编辑:Svenja K 更新时间:5/27/2021 访问量:569

问:

我想在具有过渡时间和替代方案的 m 台机器上安排 n 个作业,并修改了 github/or-tools/scheduling_with_transitions_sat.py 中的示例,因为我还想要某种迟到惩罚。

我的测试输入数据是 n = 9 和 m = 3:

jobs_data = [[[(304776, 0, 'r2500', True, 2130458),
   (-1, 1, 'r2500', False, 2130458),
   (-1, 2, 'r2500', False, 2130458)]],
 [[(-1, 0, 'r1200', False, 1295928),
   (193491, 1, 'r1200', True, 1295928),
   (-1, 2, 'r1200', False, 1295928)]],
 [[(215173, 0, 'v3750', False, 1428522),
   (-1, 1, 'v3750', False, 1428522),
   (-1, 2, 'v3750', False, 1428522)]],
 [[(20226, 0, 'v3000', False, 369014),
   (20226, 1, 'v3000', False, 369014),
   (-1, 2, 'v3000', False, 369014)]],
 [[(222962, 0, 'r2500', False, 6517387),
   (222962, 1, 'r2500', False, 6517387),
   (-1, 2, 'r2500', False, 6517387)]],
 [[(-1, 0, 'r1700', False, 1266091),
   (-1, 1, 'r1700', False, 1266091),
   (80988, 2, 'r1700', False, 1266091)]],
 [[(-1, 0, 'r1350', False, 5138051),
   (-1, 1, 'r1350', False, 5138051),
   (89880, 2, 'r1350', False, 5138051)]],
 [[(-1, 0, 'r1200', False, 5699494),
   (131899, 1, 'r1200', False, 5699494),
   (-1, 2, 'r1200', False, 5699494)]],
 [[(-1, 0, 'r1200', False, 505015),
   (-1, 1, 'r1200', False, 505015),
   (126922, 2, 'r1200', True, 505015)]]]

具有 n 个作业的列表,其中包含 m 个替代任务。[processing time, machine_id, resource/material, job already active on machine?, deadline/due date]

现在我创建了变量 l_lateness。 目前lateness_seconds是预定end_time和截止日期之间的差异。

l_lateness = model.NewIntVar(-horizon_due_date, horizon_due_date, 'l_lateness')
lateness_seconds = (l_end - job[0][0][4])

model.Add(l_lateness ==  lateness_seconds)

termin.append(l_lateness)

然后,我在目标中使用该变量,如下所示:

# Objective.
  makespan = model.NewIntVar(0, horizon, 'makespan')
  model.AddMaxEquality(makespan, job_ends)
  makespan_weight = 1
  transition_weight = 3
  deadline_weight = 5
  print(type(sum(termin)))
  print(type(sum(switch_literals)))
  model.Minimize(makespan * makespan_weight +
                 sum(switch_literals) * transition_weight +
                 sum(termin) * deadline_weight)

这工作正常。 但我想要

lateness_seconds = max(0,(l_end - job[0][0][4]))

因此,只有未按时完成的工作才算在内。

如果我这样做,那么我会收到以下错误消息,我不明白为什么或如何避免它:

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

我试图把它改写成

if l_end >= job[0][0][4]:
  model.Add(ueberzogen ==  (l_end - job[0][0][4]))
else:
  model.Add(ueberzogen ==  0)

但这给了我同样的表达式错误。l_end >= job[0][0][4]

我正在使用 .ortools Version: 9.0.9048

Python 错误处理 调度 或工具 截止时间

评论

0赞 Max Ostrowski 5/27/2021
也许是 stackoverflow.com/questions/67535624/ 的复制品......
0赞 Svenja K 5/27/2021
我知道当您使用类似模型之类的东西时,您可能会遇到此错误。Add(lower_bound <= 变量 <=upper_bound)。你可以用模型来避免它。添加(变量 >= lower_bound) 模型。Add(变量 <=upper_bound)。但我不明白为什么要建模。Add(variable1 == max(0, variable2-c) ) 会触发错误,但 model.Add(variable1 == (variable2-c) ) 不要。
2赞 Christopher Hamkins 5/27/2021
“max”不是 Python 函数,而不是来自 OR Tools 的函数吗?要在目标中使用量,您必须将其构造为求解器变量,例如使用 AddMaxEquality。

答:

3赞 Laurent Perron 5/27/2021 #1

我们在 9.0 版中添加了迂腐的测试,因为使用 min()、max() 和其他 python 结构不会产生有效的模型。

请使用 AddMinEquality() 或 AddMaxEquality()。