python - 2个元组列表之间的可能排列(调度算法)
问题描述
我正在尝试使用 python 解决排列的特定问题。
一般来说,我有一个包含员工 ID 的列表、一个包含可用班次的列表以及一个包含天数的列表,如下所示:
employees = [1, 5,34,234,233,534,33,2,11,3,7,6,8]
days = [0,1,2,3,4]
shift = [0,1,2]
我使用这些代码行在这三个列表之间进行可能的排列:
lists = [days, shift, days]
Compbinations = list(itertools.product(*lists))
到目前为止一切都很好,但我还有另一个问题......我需要根据可用性将可能的排列分配给相应的日期。
我有这个数组,每轮每天可用:
Shift_Availabilities = [
(1,2,3),
(3,3,3),
(0,1,2),
(3,1,2),
(0,0,1)
]
但我不知道如何根据此约束进行可能的排列。
知道我该怎么做吗?
谢谢!
解决方案
如果您有条件申请,请远离 itertools 并进行列表理解......它们在条件等方面非常灵活。这将根据一些制定的标准开发“有效”分配选项。
emp_ids = [55, 202, 70]
days = list('MTWRF')
shifts = [1, 2, 3]
emp_avail = { 55: ['M', 'T'],
202: ['T', 'W', 'R', 'F'],
70: ['W', 'R', 'F']}
shifts_avail = {'M': [1, 2],
'T': [3],
'W': [2, 3],
'F': [1]}
poss_assignments = [(emp, day, shift)
for emp in emp_ids
for day in days
for shift in shifts
if day in emp_avail.get(emp, []) # employee avail on day
and shift in shifts_avail.get(day, [])] # shift is active on day
for asmt in poss_assignments:
print(asmt)
产量:
(55, 'M', 1)
(55, 'M', 2)
(55, 'T', 3)
(202, 'T', 3)
(202, 'W', 2)
(202, 'W', 3)
(202, 'F', 1)
(70, 'W', 2)
(70, 'W', 3)
(70, 'F', 1)
推荐阅读
- python - PyQt5:如何通过 QPushButton 重新对接浮动的 QDockWidget?
- unix - Unix下Control+C
- arrays - 如何实现运算符 [] 在二维数组中设置值?
- express - Cloud Run 实例如何感知来自 HTTP2 连接的多个请求?
- flutter - Flutter通过for循环显示小部件显示错误
- spring - 使用 Spring JPA 检查数据库
- python - Pandas/Python - 创建新列,仅从列字符串中提取数字
- reactjs - 我们如何能够通过单击按钮生成另一个元素?
- python - 从 Flask 迁移到 FastAPI
- mysql - 如何按 userId 对每天最新的 DATETIME 记录进行分组?