conditional-statements - Google or-tools 序列最大化
问题描述
我试图在一年内最大化 5 名工人的轮班顺序。假设我有 3 个班次(1、2、3)和休息(B)。然后我得到一系列班次作为输入,假设我得到'111222333BBBBBB'。
我需要做的是最大化该序列在我的工人日程安排中的出现次数。我将我的工人时间表定义为 shifts[(w, d, s)] = 1,这意味着工人 w 在第 d 天工作轮班 s。
我试图做的:为工人创建布尔值(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, day, 1)] == 1).OnlyEnforceIf(required_sequence_bools[w][d])
elif letter == '3':
model.Add(shifts[(w, day, 2)] == 1).OnlyEnforceIf(required_sequence_bools[w][d])
elif letter == 'B':
model.Add(shifts[(w, day, 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
解决方案
推荐阅读
- swift - Swift 结构定义中的崩溃。有解决方法,但想提高理解
- codenameone - 代号一方形按钮
- java - 保存并将对象从列表视图中的选中项目传递到另一个活动
- angular - Angular 2 验证器错误
- javascript - 网格线边距的 Google 图表颜色
- ios - 您如何引用在 for 循环中创建的特定视图?
- sapui5 - 如何清除 SmartForm 的值?
- python - 在 Python 中,in 运算符是如何实现的?它是否使用迭代器的 next() 方法?
- corda - 如何将 AbstractParty 持久化到 Vault?
- c# - jQuery AJAX 请求返回 HTML 而不是 JSON 结果(Razor 页面)