🏆 省一等奖 数学建模 运筹优化 整数规划

大型展销会临时工排班优化

东北三省数学建模竞赛 B 题 · 10 天 10 组 11 时段排班最优解,最少 400 人 / 3198 工日,三步法数学证明锁死最优性

📅 时间: 2025 🏆 奖项: 东北三省数学建模 · 省一等奖 👤 角色: 参赛队员 1(组长)/ 全部建模与代码 👥 团队: 缪毅翔 + 赵玉林 / 指导教师:冯海艳

📌 项目背景

某大型展销会持续 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 节:摘要 → 引言 → 数据描述 → 数学模型 → 求解结果 → 排班生成 → 实用建议 → 总结。