当每天有多个班次时,如何添加使用ORTools的最大工作天数序列

2024-04-26 14:58:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图根据https://github.com/google/or-tools/blob/39f44709bba203f5ff3bc18fab8098739f189a6d/examples/python/shift_scheduling_sat.py解决排班问题, 但由于我的问题是有多个30米的轮班时间,而不是3个,也就是早上6:00到晚上19:00的轮班时间,我无法理解或计算当我每周每人最多需要5个工作日时,soft_sum_constraint如何在我的场景中工作

以下是我的代码示例:

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, s, d] 
                                                  for s in range(num_of_shifts)) >= max_cont_shifts)
                    model.Add(sum(work[e, s, d] 
                                                  for s in range(num_of_shifts)) < max_cont_shifts + 4)
                   
            else:
                model.Add(sum(work[e, s, d] 
                                                  for s in range(num_of_shifts)) >= max_cont_shifts)
                model.Add(sum(work[e, s, 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,s,d].Not()])

这就满足了我每天轮班的需求,并且是连续的。我需要做同样的几天,但没有我尝试到目前为止的工作

以下情况不起作用:

for e in range(num_employees):
       model.Add(sum(work[e, s, 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, s, 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, s, d])<=5)

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


Tags: orofinaddformodelrangedays
1条回答
网友
1楼 · 发布于 2024-04-26 14:58:19

只要创建一个布尔值,如果这一天至少有一个班次是真的。 并用它来约束你的日常生活

记录在案:

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

编码为

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

相关问题 更多 >