如何解决Google OR-Tools 错误:不支持将 BoundedLinearExpr 评估为布尔值
我想在 m 台机器上安排 n 个作业,并带有转换时间和替代方案,并修改了 github/or-tools/scheduling_with_transitions_sat.py 中的示例,因为我还想要某种迟到惩罚。
我的测试输入数据是 n = 9 和 m = 3:
jobs_data = [[[(304776,'r2500',True,2130458),(-1,1,False,2,2130458)]],[[(-1,'r1200',1295928),(193491,1295928)]],[[(215173,'v3750',1428522),1428522)]],[[(20226,'v3000',369014),(20226,369014)]],[[(222962,6517387),(222962,6517387)]],'r1700',1266091),(80988,1266091)]],'r1350',5138051),(89880,5138051)]],5699494),(131899,5699494)]],505015),(126922,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
。
解决方法
我们在 9.0 版本中添加了迂腐测试,因为使用 min()、max() 和其他 Python 构造不会产生有效的模型。
请使用 AddMinEquality() 或 AddMaxEquality()。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。