排班排到凌晨两点,我换了个思路
社区讨论 · 其他

排班排到凌晨两点,我换了个思路

跑条线跑条线2 天前2026/11/02 110 浏览

上个月帮一个做仓储的朋友排班。三十来号人,三个班次,有人只能上早班,有人必须有叉车证,周末还要轮休。我先拿 Excel 的规划求解跑,四十分钟给我一句「未找到可行解」。后来自己写了个贪心,出来的人均工时差得离谱。

朋友的 IT 说这类组合优化可以试试量子启发的求解器。名字听着玄,其实不用连真的量子计算机,它借的是量子退火那套搜索思路,跳着试组合,不逐个穷举。我找了 Multiverse Computing 的 Singularity 平台,从注册到跑出第一版能用的排班表,花了一周。

第一天:先把问题翻译成它能读的格式

注册完进控制台,左边菜单三块,Optimization、AI Models、Notebook,排班归第一块管。

进去别急着建项目,先看模板。有个 Shift Scheduling,点进去能下一份示例表格。这一步很关键,它的数据格式是定死的,员工、日期、班次、技能标签,四列,一行一个可选组合。我照着把朋友那边三十来人的名单填进去,补上技能列。

点右上角 New Workspace,起名 warehouse-shift;进 Data 上传 CSV,编码选 UTF-8;再到 Constraints 一条条加规则,每人每天最多一班,有叉车证才能进夜班。

这里第一次踩坑。 我以为「每人每周最多五班」和「夜班必须持证」是一类东西,全丢进硬约束。跑出来直接报 Infeasible,无解。后来才想明白,硬约束是绝对不能破的,软约束是可以破但要扣分。朋友的真实需求是尽量五班,偶尔六班也能接受。把这条降成软约束,给个权重,再跑就有结果了。

第三天:看它怎么权衡

第一次出解,排班表能导出 CSV,一行一个人一天。拿去给朋友看,他说有三个人连着上了五天夜班。

这就是目标函数的问题。它只按你给的标准打分,你没提的它不管。我在 Objective 里加了几个权重,连续夜班扣分、周末班次方差扣分。权重给多少没有标准答案,我试了四五组,每组跑两三分钟。

我这边测下来,权重压得越极端,解越偏一头。全压公平性,总成本就上去了。

到第三天能出一版朋友说「能接受」的表。不是最优,但比我熬夜排的强。

一周后:接回自己的流程

它带 Python 接口,这点最省事。我把上传那步写成脚本,每周一推新数据,跑完拉结果塞进飞书表格。这套跑顺花了大概一周,时间主要耗在字段对齐。

第二个坑在时间列。我写成 2026/11/3,它不认,得是 2026-11-03。这种错报错信息不会直说,只告诉你某行解析失败。

学完这个,同一套流程换个场景就能用。比如给采访行程排路线,或者把一批选题分配到版面。约束和权重的思路是通的,换张数据表而已。

1 条回复

?
Ctrl + Enter 快速回复
沈老师
沈老师1 天前

软约束给权重那段太真实了,我上周带学生做课表也全塞硬约束跑出无解,降成软约束才有解。