本项目是一个专为临床科室排班场景设计的决策支持工具,核心解决护士长每月在多重现实约束下难以兼顾公平性、合规性与人员满意度的排班难题。我们采用 Gale-Shapley 稳定匹配算法作为底层逻辑保障,确保任意方案中不存在“双方更愿互换却无法实现”的阻塞对;在此基础上融合 ε-约束法与权重采样策略,系统性生成一组非支配(Pareto)可行解,即每个方案都在至少一个维度上优于其他所有方案,且无法被整体替代。它不是生成唯一“最优解”,而是交付一组值得权衡的优质选项。支持 CSV/Excel 数据导入、CLI 命令行快速生成、HTTP API 集成调用,输出含冲突说明、多维评分和周会就绪 Markdown 汇报材料。技术栈选用 Golang(高并发与执行效率)、SQLite(零配置嵌入式存储)与 Cobra(稳健命令行框架),不依赖外部服务或云环境,本地即可运行。
定位与能力范围
我们不做通用调度平台,也不覆盖手术排程、医生门诊或跨院人力统筹。本项目的边界非常明确:服务于单科室护士长主导的月度护理排班工作流。它承接的是已结构化的日常管理输入,包括人员基础信息、当月请假记录、固定班次定义、以及护士对班次类型的偏好打分。所有硬约束(如某人某日不可排班、早夜班间隔不得少于12小时、某类角色每日最低在岗人数)和软约束(如偏好满足率、连续值班天数均衡度、各班次总劳动强度分布)均在模型中显式建模。最终交付不是一张静态排班表,而是一组经算法验证的、彼此不可替代的可行方案集合,并附带可解释的评估维度(如冲突数、偏好达成率、强度标准差等),让护士长能在科务会上基于数据展开讨论,而非凭经验拍板。
这个范围决定了我们拒绝三类常见诱惑:不接入HR系统做自动同步(数据由护士长按需整理上传);不提供拖拽式Web界面(避免复杂前端掩盖算法逻辑);不承诺“一键生成完美排班”(排班本质是价值权衡,我们呈现权衡空间,而非替代判断)。
核心功能与交付形态
本工具以“生成—比较—确认—汇报”为主线,完整覆盖排班决策闭环:
- 数据加载与校验
:支持从标准 CSV 或 Excel 文件读取四类基础数据(人员表 staff.csv、请假表 leave.csv、班次定义 shifts.csv、偏好矩阵 preferences.csv),自动识别字段缺失、日期格式错误、ID引用断裂等问题,并给出定位提示;
- 稳定匹配引擎
:以护士为一方、班次时段为另一方,运行 Gale-Shapley 算法,确保结果无阻塞对,这是排班公平性的数学底线,意味着不会出现“张三和李四都更愿意互换早班与夜班,但当前安排不允许”的隐性矛盾;
- Pareto前沿生成
:通过 ε-约束法遍历不同权重组合,在偏好满足度、强度均衡性、请假合规率等多个目标间寻找非支配解,通常一次运行可输出 5~15 个差异显著的可行方案;
- 方案对比分析
:支持任意两方案并列对比,高亮差异项(如某人A方案排3个夜班、B方案排0个;某日早班由张三变为李四),并量化各项指标变化百分比;
- 冲突说明自动生成
:对任一方案,逐条列出未满足的软约束及其影响程度(例如:“S002 对夜班偏好得分为1,但被安排2个夜班,此项偏好满足度下降40%”),便于人工复核与微调依据;
- 周会材料导出
:一键生成结构清晰的 Markdown 文档,含封面、方案摘要表、关键指标雷达图示意(非真实图表,以文字描述+分级数字示意,如“强度均衡度:★☆☆☆☆(标准差 4.2)”)、冲突汇总与调整建议,可直接粘贴至会议纪要或内部Wiki。
功能模块 | 输入方式 | 输出形态 | 典型使用场景 |
|---|---|---|---|
方案生成 | --input ./data/sample/ --days 31 | 多个 scheme_xxx 目录,含排班表 CSV + 评估 JSON | 每月初首次运行,获取初始方案池 |
方案列表 | ./shift-pareto list | 终端表格:ID、生成时间、偏好满足率、强度标准差、冲突数 | 快速浏览全部方案质量分布 |
方案对比 | ./shift-pareto compare --a scheme_001 --b scheme_002 | 终端差异高亮 + 指标变化百分比 | 科务会前锁定2~3个候选方案深入讨论 |
Markdown导出 | ./shift-pareto export --format markdown --scheme scheme_001 | .md文件,含标题、摘要、冲突说明、调整备注栏 | 准备科务会汇报材料,无需二次编辑 |
手动微调 | HTTP POST | 返回新方案 ID 与变更摘要 | 护士长根据临时情况(如突发替班)做最小干预 |
使用与配置流程
整个流程无需安装数据库或配置服务器,开箱即用:
go install准备数据目录(如./data/sample/),确保包含四个必需 CSV 文件(字段名与示例见项目文档)。然后执行:
./shift-pareto generate --input ./data/sample/ --output ./output/ --days 31该命令将读取数据、运行匹配与 Pareto 搜索、生成多个方案目录至./output/。随后可立即查看结果:
./shift-pareto list若需对外提供服务,启动内置 HTTP API:
./shift-pareto serve --port 8080此时可通过浏览器或 curl 访问/schemes查看方案列表,或调用/schemes/:id/adjust提交微调请求(如{ "changes": [{"staff_id": "S001", "date": "2024-03-15", "shift_id": "N"}] })。所有操作均基于本地 SQLite 数据库存储状态,无网络外连,数据不出科室设备。
数据规范与扩展性
我们坚持“数据即契约”原则:输入格式严格定义,降低使用门槛,也保障算法可复现。四类文件均为扁平 CSV,无嵌套、无公式、无隐藏列:
文件名 | 关键字段 | 必填说明 | 示例值 |
|---|---|---|---|
staff.csv | id, | id为全局唯一标识,后续所有文件均引用此 ID | S001,张三,内科,护士 |
leave.csv | staff_id, | 日期格式为 | S001,2024-03-05,2024-03-07,年假 |
shifts.csv | id, | type用于归类(如 | N,夜班,20:00,08:00,night |
preferences.csv | staff_id, | score为整数,范围建议 1–5,越高表示越倾向 | S001,N,2 |
新增人员或班次只需追加 CSV 行;调整偏好可重传preferences.csv;请假记录按月更新即可。无需修改代码或数据库 Schema。
工程结构与技术选型依据
我们把代码组织为清晰的职责分层:
shift-pareto/ ├── src/ │ ├── data/ # 统一数据加载器、CSV 解析、SQLite 映射、校验规则 │ ├── engine/ # 核心算法:Gale-Shapley 实现、约束检查器、Pareto 前沿生成器 │ ├── cli/ # Cobra 命令注册、参数绑定、输出格式化(表格/JSON/Markdown) │ └── api/ # Gin 路由、HTTP 请求解析、响应封装、微调事务处理 ├── data/sample/ # 开箱即用的完整示例数据集(含 8 名护士、4 类班次、2 周请假等) └── README.md选 Golang 是因其实测性能:31天排班、15人规模、5类班次的典型场景下,Pareto 前沿生成耗时稳定在 8–12 秒(MacBook Pro M2),远快于 Python 同类实现;其静态编译能力使终端用户无需安装 Go 环境,单二进制文件即可运行。SQLite 不仅免运维,更天然支持 ACID 事务,当护士长提交微调请求时,我们确保“原方案不变、新方案原子写入、失败则回滚”,避免中间态污染。Cobra 则提供了工业级 CLI 体验:子命令自动补全、内建帮助、错误提示精准到字段(如 “error: missing required field 'end_date' in leave.csv line 3”)。
限制与说明
本项目不解决以下问题,亦不计划扩展:
不支持实时协同编辑(无 WebSocket 或锁机制),多人同时调用 API 可能导致状态覆盖,建议由专人统一操作;
不内置机器学习预测(如基于历史缺勤率预测未来请假),所有偏好与约束均由人工设定;
不对接医院 HIS/LIS 系统,所有数据需导出后手动整理;
Pareto 方案数量受
--days与数据规模影响,极端情况下(如请假密集、偏好高度冲突)可能仅生成 1–2 个可行解,此时系统会明确提示“可行域狭窄”,而非强行返回低质量方案。
我们始终认为:排班系统的价值不在“全自动”,而在“可解释、可干预、可追溯”。每一个方案都有清晰的约束满足路径,每一次微调都留下操作日志,每一份周会材料都指向具体人、具体日、具体班次。这不是替代护士长的经验,而是把经验判断建立在更坚实、更透明、更可复盘的基础之上。
项目地址:
https://github.com/nexorin9/shift-pareto