微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Google OR-tools员工排班中轮班的最大长度系列

如何解决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 举报,一经查实,本站将立刻删除。