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)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...