📌 项目背景
某大型展销会持续 10 天,设 10 个展区,每日营业时间 8:00 - 19:00,共 11 个时段。每个时段、每个组的人力需求不同,临时工管理面临三个核心问题:
- 招多少人?招多了浪费,招少了崩盘
- 怎么排?每人每天 2 个 4 小时班次,中间至少间隔 6 小时;10 天内工作 8 天、休息 2 天
- 能不能证明这是最优?不只是"找到一个方案",而是"证明这就是最好的方案"
题目分三问:Q1 固定组别 → Q2 允许换组 → Q3 弹性排班,层层递进。
📊 三个问题 · 三个最优解
| 问题 | 约束 | 最优工人数 |
|---|---|---|
| Q1 固定组别 | 工人不换组,按 8 个 4 小时班次配对 | 417 人 |
| Q2 允许换组 | 每天可换组,班次可不连续 | 406 人 |
| Q2 班次间隔约束 | 增加"班次间休息 1 小时"约束 | 506 人 |
| Q3 弹性排班 | 块间隔 6 小时 + 严格证明 | 400 人(下界) |
🏆 核心结论
在最宽松的 Q3 条件下,我们严格证明 400 人是该问题的理论下界,并验证 400 人方案可行。
🧠 三步法数学证明(Q3 核心)
这一部分是论文最有价值的部分——不仅"找到"400 人这个解,而是从三个维度证明"400 不能再少了":
| 步骤 | 模型 | 规模 | 作用 |
|---|---|---|---|
| Step 1:下界证明 | 聚合 ILP 模型 | 6,000 变量 + 1,100 约束 | 证明总工日 ≥ 3198(用 CBC 求解器) |
| Step 2:人数上限 | 理论推导 | — | 199 人不可能(199×8 = 1592 < 需求) |
| Step 3:可行性验证 | Per-Worker 紧凑模型 | 16.2 万变量(45 种 8 天工作模式) | 证明 400 人方案能满足所有时段需求 |
💡 为什么是 400?
10 天 11 时段共 110 个时段-组组合,累计需求 3198 工日。每人最多工作 8 天,所以工人数 ≥ ⌈3198/8⌉ = 400。
⚙️ 关键数据 & 技术亮点
400
最少工人数(严格证明)
3198
最优总工日
6,000
聚合模型变量
39.9万
Per-Worker 模型变量
0
需求缺口
100%
时段覆盖
🎯 我解决的难点
- 变量爆炸:直接建模每工人每天每班次 → 1440 万变量,无法求解。→ 拆成"聚合 + Per-Worker"两步,把变量压到 16.2 万
- 午间覆盖盲区:13:00-14:00 严格按"8-19 点 + 6 小时间隔"无法覆盖 → 提出"弹性时间"建议作为实用扩展
- 最优性证明:不能只"找到一个解",要"证明这是最优" → 引入三步法(下界 + 上限 + 可行性)
- 贪心初始解:398 人 9 天 + 2 人 8 天的具体分配,用于生成完整排班表
📁 论文与代码
- 完整论文(981KB,含 3 个子问题全解)
- 代码仓库:聚合 ILP + Per-Worker 模型 + 贪心算法 + 最优性证明(Python + CBC 求解器)
- 数据结果:个人排班表(400 人 × 10 天)+ 组别时段工人枚举表(1100 行)
- 7 张图表:需求热力图、块覆盖模式、工作天数分布、求解流程图等
📝 论文结构
本文 7 节:摘要 → 引言 → 数据描述 → 数学模型 → 求解结果 → 排班生成 → 实用建议 → 总结。