Google or-tools 序列最大化

问题描述

我试图在一年内最大限度地增加 5 名工人的轮班顺序。假设我有 3 个班次(1、2、3)和休息(B)。然后我将输入一系列移位,假设我得到“111222333BBBBBB”。

我需要做的是最大限度地增加该序列在我的工作人员日程表中的出现次数。 我将我的工人时间表定义为 shifts[(w,d,s)] = 1 意味着工人 w 在第 d 天工作轮班 s。

我尝试做的事情:为工人 w 创建 bools (w_d) 表示序列将从第 d 天开始。然后我尝试最大化正布尔值的数量。

问题:这需要太长时间,即使在 1 天后也不会停止运行,我确实将核心数设置为 8。如果有人对如何做到这一点有更好的想法,请告诉我!

代码:

worker = 5
days = 365
required_sequence_bools = []
required_sequence = "111222333BBBBBB"
for w in range(worker):
    required_sequence_bools.append([])
    for d in range(1,days - len(required_sequence)):
        required_sequence_bools[w].append(model.NewBoolVar(f"{w}_{d}"))

for w in range(worker):
    for d in range(0,days - len(required_sequence) - 1):
        day = d + 1
        for letter in required_sequence:
            if letter == '1':
                model.Add(shifts[(w,day,0)] == 1).OnlyEnforceIf(required_sequence_bools[w][d])
            elif letter == '2':
                model.Add(shifts[(w,1)] == 1).OnlyEnforceIf(required_sequence_bools[w][d])
            elif letter == '3':
                model.Add(shifts[(w,2)] == 1).OnlyEnforceIf(required_sequence_bools[w][d])
            elif letter == 'B':
                model.Add(shifts[(w,3)] == 1).OnlyEnforceIf(required_sequence_bools[w][d])
            day += 1
model.Maximize(sum(required_sequence_bools[w][d] for w in range(worker) for d in range(0,days - len(required_sequence) - 1)))

示例: required_sequence="112233BB" 4 个工人

        | day1 | day2 | day3 | day4 | day5 | day6 | day7 | day8 | day9 | day10 | day11| day12 | day13 | day14 |
|worker1| 1      1      2      2     3       3      B      B
|worker2|               1      1     2       2      3      3       B       B
|worker3|                            1       1      2      2       3       3       B      B
|worker4|                                           1      1       2       2       3      3      B      B

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

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