每天多次轮班时如何增加使用ORTools的最大工作天数序列

问题描述

我正在尝试根据https://github.com/google/or-tools/blob/39f44709bba203f5ff3bc18fab8098739f189a6d/examples/python/shift_scheduling_sat.py解决排班问题, 但是由于我的问题有多个30m班次插槽,而不是3个,也就是shift1-shift22,从06:00 am到19:00 pm分配,所以我无法理解或锻炼soft_sum_constraint在需要时如何在我的场景中工作例如每人每周总共最多5个工作日。

以下是我的代码示例:

for e in range(num_employees):
    if db['conthoursperweek'][(e)]>0:
        max_cont_shifts=round(int(db['conthoursperweek'][e] / 5)*2)
        for d in range(7):
            if d==6:
                if db['optedinsundays'][e]==0:
                    for s in range(num_of_shifts):
                                     model.Add(work[e,s,6]==0)
                else:
                    model.Add(sum(work[e,d] 
                                                  for s in range(num_of_shifts)) >= max_cont_shifts)
                    model.Add(sum(work[e,d] 
                                                  for s in range(num_of_shifts)) < max_cont_shifts + 4)
                   
            else:
                model.Add(sum(work[e,d] 
                                                  for s in range(num_of_shifts)) >= max_cont_shifts)
                model.Add(sum(work[e,d] 
                                                  for s in range(num_of_shifts)) < max_cont_shifts + 4)

for d in range(num_days):
    for e in range(num_employees):
        for s in range(num_of_shifts-1):
            for x in range(s+1,num_of_shifts):
                model.Add(work[e,x,d] == 0).OnlyEnforceIf([work[e,s-1,d],work[e,d].Not()])

这满足了我对每天轮班限制的需求,并且它们是连续的。我需要几天来做同样的事情,但是到目前为止我还没有尝试过。

以下内容无效:

for e in range(num_employees):
       model.Add(sum(work[e,d] for d in range(7) for s in range(num_of_shifts))<=80) #for max shifts per week

#or
work_days=[]
for e in range(num_employees):
       for d in range(7):
            working=sum(work[e,d] for s in range(num_of_shifts))
            work_days.append(working)
       model.Add(work_days<=5)

#or
for e in range(num_employees):
       for d in range(7):
            model.Add(sum(work[e,d])<=5)

我知道上面的代码是错误的,但是我无法弄清楚。任何帮助将不胜感激。

解决方法

如果这一天至少有一次轮班是正确的,则只需创建一个布尔值是真的。 并在日间限制条件下使用它。

作记录:

a <=> or(b1,..,bn)

编码为

for all i: bi implies a
bool_or(a.Not(),b1,bn)

相关问答

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