如何解决Google OR-tools员工排班中轮班的最大长度系列
我正在为使用Python的医院之一部门开发护士计划程序。此类程序的各种示例已经存在并可以在线共享。其中之一是以下内容:https://github.com/google/or-tools/blob/master/examples/python/shift_scheduling_sat.py
到目前为止,我已经设法调整了上面链接中的代码,以包括各种类型的劳动法规以及各个护士的偏好。但是我一直在努力执行以下规则:
- 员工不能连续工作超过5天。
该代码本机支持相同班次类型的系列长度的界限(例如,禁止连续n次早上上班或晚上上班)。但是,如果它们不是同一类型(例如,夜晚/夜晚/早晨/夜晚/早晨/早晨),则没有办法限制一系列前后移动的长度。
for e in range(num_employees):
for d in range(num_days):
model.Add(work[e,d] == 1).OnlyEnforceIf( (work[e,1,d-5] or work[e,2,3,4,d-5] )
and (work[e,d-4] or work[e,d-4] )
and (work[e,d-3] or work[e,d-3] )
and (work[e,d-2] or work[e,d-2] )
and (work[e,d-1] or work[e,d-1] ))
但是,此实现极大地增加了程序的运行时间(从无约束的30秒增加到包括约束的15分钟)。因此,我正在寻找一种方法来禁止连续5天或更长时间安排员工,而这不会增加员工的运行时间。
解决方法
您可以通过限制off_shift.not()文字的长度来修改代码。
,答案
我使用以下代码行实现了以下建议的@LaurentPerron更改:
max_seq_length = 5
for e in range(num_employees):
works = [work[e,d].Not() for d in range(num_days)]
variables,coeffs = add_soft_sequence_constraint(
model,works,max_seq_length,'shift_constraint(employee %i,shift %i)' % (e,0))
obj_bool_vars.extend(variables)
obj_bool_coeffs.extend(coeffs)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。