图片

本项目是面向医院护理管理一线的智能调度工具,专为解决人工床位分配中「科主任偏好难落实、感染隔离易疏漏、护理等级常错配、性别分区易违规」等高频合规风险而设计。我们采用 Google OR-Tools 的 CP-SAT 约束规划求解器作为核心引擎,将床位分配转化为可验证、可追溯、可复现的数学优化问题;输出结构化 JSON 结果、Excel 报表和交互式 HTML 甘特图三类交付物,全部通过命令行一键生成。系统支持硬约束(必须满足,否则方案无效)与软约束(按权重惩罚,支持权衡取舍)双层建模,覆盖性别分区、感染隔离、护理等级匹配、动态时间窗、床位占用状态五大刚性规则,以及科主任偏好、同科室分配、位置偏好、护理等级精确匹配四大柔性目标。技术栈以 Python 3.10+ 为基础,集成 SimPy 做仿真验证、Click 构建 CLI、Rich 实现彩色终端反馈、Jinja2 渲染甘特图模板、Chart.js 驱动前端可视化、openpyxl 导出结构化报表,所有模块均按医疗排班场景深度定制,不依赖 Web 服务或数据库,开箱即用。

定位与能力范围

我们不做通用资源调度平台,也不做轻量级床位看板。本系统明确聚焦于「住院部护士长每日晨会前的床位预分配」这一具体动作:输入当日待入院患者清单、全院可用床位清单、当前约束配置,输出一份带原因分析、可筛选、可打印、含违背报告的推荐方案。它不替代医生下达医嘱,不干预信息系统床位状态同步,也不承担病历质控或医保结算,它的边界非常清晰:在数据已就绪的前提下,把「人脑权衡」变成「模型推演」,把「经验试错」变成「约束显式化」。所有硬约束一旦违反,求解器直接判定方案不可行;所有软约束违背均量化为惩罚值,供管理者判断是否接受折中方案。尤其关键的是,我们内置了帕累托前沿(Pareto Frontier)多目标优化模式,当「最小化未分配人数」与「最小化总惩罚」存在天然冲突时,系统可一次性给出多个非支配解,由护士长根据当日人力、感控压力、科室负荷等现实因素拍板选择。

核心功能

多约束建模:硬规则保底线,软目标促优化

硬约束是系统运行的“安全阀”,任何一项不满足,方案即被拒绝:
性别分区:男患者仅可分配至男床或不限性别床位,女患者同理;
感染隔离:is_infected=true 的患者必须分配至 is_isolated=true 的床位;
护理等级匹配:患者所需等级 ≤ 床位提供等级(特级 > 一级 > 二级 > 三级),允许降级但禁止越级;
床位占用状态:is_occupied=true 的床位不可参与本次分配;
动态时间窗:支持在 bed_inventory.json 中为每张床定义 time_slots,标记手术、清洁等不可用时段。

软约束则构成优化目标,其权重可配置(默认科主任偏好=10,同科室=8,位置偏好=5,等级精确匹配=3),违背时计入总惩罚值,用于排序与帕累托分析:

软约束名称

默认权重

违背示例

惩罚值

preferred_beds

10

科主任指定XN-102床,患者却被分到XN-105

15

department_assignment

8

心内科患者被分到呼吸科区域

12

position_preference

5

患者要求靠窗,实际分配中间位

10

nursing_level_exact

3

特级患者分配至一级床(降级)

3

甘特图可视化:浏览器打开即用,审阅决策有据可依

生成的 gantt_output.html 是交付核心界面,无需部署服务器,双击即可在 Chrome/Firefox 打开:
- 支持按科室、护理等级、性别三重下拉筛选,快速定位某类患者分布;
- 分页控制支持 25/50/100/200 条每页,适配不同屏幕尺寸;
- A4 横向打印样式已内嵌,导出 PDF 后可直接归档或张贴;
- 顶部固定显示「未分配患者列表及失败原因」,如「P007:无可用特级隔离床」;
- 底部嵌入「软约束违背报告表格」,逐条列出患者ID、违背项、对应惩罚值;
- 甘特图主体以床位为横轴、时间为纵轴(单日视图),色块颜色严格映射护理等级(特级深红/一级番茄红/二级橙色/三级浅绿)与性别(男蓝/女粉),一目了然。

CLI 交互界面:面向运维人员的可靠操作入口

所有功能通过 bed-scheduler 命令统一驱动,终端输出全程彩色化、进度可视化:
bed-scheduler demo:零配置启动,加载内置示例数据,3秒内完成全流程演示;
bed-scheduler allocate:生产环境主命令,支持 --time-limit 控制求解上限(默认30秒)、--pareto 启用多目标优化、--format json/simple 切换输出粒度;
bed-scheduler validate:独立校验模块,提前发现数据格式错误、字段缺失、约束逻辑矛盾等隐患;
- 日志分级明确:WARNING(默认,只显示进度条与摘要)、-v(INFO,展示数据统计与约束摘要)、-vv(DEBUG,输出每张床/每位患者的完整属性与约束匹配过程)。

使用与配置

三步启动:数据准备 → 命令执行 → 结果审阅

系统完全离线运行,所有输入均为标准文本文件:
- 床位数据存于 data/bed_inventory.json,需包含 bed_idgenderis_isolatednursing_levelis_occupiedtime_slots 字段;
- 患者数据存于 data/patients.json,需包含 patient_idgenderdepartmentnursing_level_requiredis_infectedposition_preference 字段;
- 约束规则存于 data/constraints_config.yaml,可开关各项硬/软约束,并调整权重与优先级。

安装与运行只需两步:

pip install -r requirements.txt
pip install -e .

执行分配:

bed-scheduler allocate \
  --beds data/bed_inventory.json \
  --patients data/patients.json \
  --constraints data/constraints_config.yaml \
  --output result/

结果目录 result/ 下自动生成三类文件:
gantt_output.html:甘特图主界面;
allocation_result.json:结构化结果,含 assignmentsunassignedmetadata 三部分;
allocation_report.xlsx:Excel 报表,含「分配总表」「软约束违背报告」「未分配患者」三个工作表。

工程结构

代码组织严格遵循职责分离原则,每个子模块专注单一能力:
src/models/:定义 BedPatientConstraintConfig 三类数据模型,字段与 JSON/YAML 输入一一映射;
src/data/loader.py:统一加载器,自动校验必填字段、类型转换(如 nursing_level 字符串转枚举)、缺失值填充;
src/solver/:CP-SAT 核心,cp_sat_formulator.py 将业务约束转为布尔变量与线性表达式,cp_sat_solver.py 封装求解流程与超时控制;
src/engine/scheduler.py:调度引擎,协调数据加载、模型构建、求解调用、结果后处理四阶段;
src/visualization/gantt_generator.py:基于 Jinja2 渲染 HTML,Chart.js 动态绘图,所有筛选逻辑由前端 JavaScript 完成;
src/cli/commands.py:Click 命令注册中心,各子命令(demo/allocate/validate)逻辑解耦,便于单元测试与灰度发布。

环境与运行

系统对运行环境要求极简,仅需 Python 3.10+ 及标准科学计算依赖:
| 组件 | 版本要求 | 作用 |
|------|-----------|------|
| Python | ≥ 3.10 | 运行时基础 |
| OR-Tools | ≥ 9.8 | CP-SAT 求解器核心 |
| Rich | ≥ 13.0 | 彩色终端渲染与进度条 |
| Click | ≥ 8.0 | CLI 命令解析框架 |
| Jinja2 | ≥ 3.0 | HTML 模板渲染 |
| Chart.js | CDN 加载 | 前端甘特图绘制 |
| openpyxl | ≥ 3.1 | Excel 报表导出(可选) |

无外部服务依赖,不写数据库,不启 HTTP 服务,所有状态保存于内存与输出文件。Windows/macOS/Linux 全平台支持,Docker 镜像亦可按需构建(脚本位于 scripts/ 目录)。

限制与说明

本系统不解决以下问题:
- 不替代 HIS 系统床位状态同步,需确保 bed_inventory.json 中 is_occupied 字段实时准确;
- 不提供床位预约、退床、转科等动态变更逻辑,仅处理「静态快照」下的单次分配;
- 不支持跨日连续排程(如术后三天需固定床),时间窗仅限单日内分段标记;
- 甘特图中「时间」维度仅为视觉分组标识,非真实时间轴(暂不支持多日滚动视图)。

所有约束逻辑与字段含义均在项目文档中明确定义,例如 nursing_level 的等级顺序(特级 > 一级 > 二级 > 三级)、position_preference 的合法取值("window"/"door"/"middle")、time_slots 的 ISO 8601 时间格式要求等,均无需猜测,查文档即得。

项目地址:
https://github.com/nexorin9/bed-allocation-optimizer

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐