You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

主辅班次并行员工排班:次班次建模求解咨询

员工次班次排班约束解决方案

核心约束逻辑

  • 技能匹配:员工只能被分配到其明确胜任的次班次,比如Worker-1仅能承担task-1、task-2
  • 班次并行兼容性:次班次必须与当天主班次的时段匹配,主班次为off_shift的员工当天不能安排任何次班次
  • 每日覆盖要求:task-1至task-5每日必须有足够员工覆盖(根据业务需求设最低人数)
  • 员工负荷控制:单个员工每周/每日的次班次分配数量不能超过上限,避免过度排班

代码扩展实现(基于现有主班次调度)

假设你用的是约束规划库(如OR-Tools),以下是针对性的约束代码片段:

1. 定义员工次班次胜任映射

# 员工-可胜任次班次映射表
worker_task_qual = {
    "Worker-1": ["task-1", "task-2"],
    "Worker-2": ["task-2", "task-3", "task-4"],
    "Worker-3": ["task-1", "task-3", "task-5"],
    # 补充其他员工的胜任配置
}

2. 添加技能匹配约束

# 假设已声明变量:task_assign[worker][day][task] → 0/1表示是否分配该次班次
for worker in worker_list:
    for day in week_days:
        for task in ["task-1", "task-2", "task-3", "task-4", "task-5"]:
            if task not in worker_task_qual[worker]:
                solver.Add(task_assign[worker][day][task] == 0)

3. 添加主班次与次班次并行约束

# 假设主班次变量:main_shift[worker][day],取值为"off_shift"/"day"/"night"/"availability"
for worker in worker_list:
    for day in week_days:
        # 主班次为off_shift时,禁止分配任何次班次
        solver.Add(
            (main_shift[worker][day] == "off_shift")
            >> (sum(task_assign[worker][day][t] for t in ["task-1", "task-2", "task-3", "task-4", "task-5"]) == 0)
        )
        # 主班次为day时,仅允许分配day时段的次班次(自行调整对应task列表)
        solver.Add(
            (main_shift[worker][day] == "day")
            >> (sum(task_assign[worker][day][t] for t in ["task-3", "task-4", "task-5"]) == 0)
        )
        # 主班次为night时,仅允许分配night时段的次班次(自行调整对应task列表)
        solver.Add(
            (main_shift[worker][day] == "night")
            >> (sum(task_assign[worker][day][t] for t in ["task-1", "task-2", "task-5"]) == 0)
        )
        # availability主班次可分配任意次班次,无需额外限制(按需调整)

4. 添加每日次班次覆盖约束

# 每个次班次每日至少1人覆盖(可根据需求修改人数)
for day in week_days:
    for task in ["task-1", "task-2", "task-3", "task-4", "task-5"]:
        solver.Add(sum(task_assign[w][day][task] for w in worker_list) >= 1)

5. 添加员工负荷约束

# 单个员工每周次班次不超过3次(可按需调整上限)
for worker in worker_list:
    solver.Add(
        sum(task_assign[worker][d][t] for d in week_days for t in ["task-1", "task-2", "task-3", "task-4", "task-5"]) <= 3
    )

优化建议

  • 如果次班次有优先级差异,可在目标函数中给高优先级task的覆盖加权重,优先满足需求
  • 若员工有次班次偏好,可添加软约束(比如给员工偏好的task分配额外权重,提升被选中概率)

内容的提问来源于stack exchange,提问作者walter zeni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:01:23