You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

护士排班MILP模型成本函数构建咨询(含GAMS代码)

护士排班MILP模型双班次成本优化实现方案

核心思路

通过引入二进制识别变量将阶梯式成本线性化,适配MILP求解逻辑,精准实现单/双班次的差异化成本核算。

变量定义

  • x[n,d,s]:二进制变量,1表示护士n在d日排s班次,0则否(n=护士集合,d=日期集合,s=3个班次的集合)
  • y[n,d]:二进制变量,1表示护士n在d日排2个班次,0则否
  • z[n,d]:二进制变量,1表示护士n在d日排1个班次,0则否

成本函数构建

目标为最小化总成本,通过基础成本加优惠项实现阶梯定价:

minimize total_cost = sum(n,d,s) x[n,d,s] * 1 + sum(n,d) y[n,d] * (-0.5);

解释:每个单班次基础成本1€,若护士单日排2班,原本2个单班次合计2€,实际只需1.5€,相当于减免0.5€,通过y[n,d]变量兑现该优惠。

关键约束添加

  1. 单日排班数量匹配约束:

    sum(s) x[n,d,s] = z[n,d] + 2*y[n,d];
    

    确保护士单日排班数只能是0(z=0,y=0)、1(z=1,y=0)或2(z=0,y=1)

  2. 单/双班次互斥约束:

    z[n,d] + y[n,d] <= 1;
    

    避免同一护士单日同时被标记为单班次和双班次

GAMS代码核心片段

将上述逻辑整合进现有模型,示例如下:

Sets
    n nurses /n1*n20/
    d days /d1*d30/
    s shifts /s1*s3/;

Variables
    total_cost;

Binary Variables
    x(n,d,s) '护士n在d日排s班'
    y(n,d) '护士n在d日排2班'
    z(n,d) '护士n在d日排1班';

Equations
    obj '目标函数'
    shift_count(n,d) '单日排班数量等式'
    mutual_excl(n,d) '单/双班次互斥';

obj.. total_cost =e= sum((n,d,s), x(n,d,s)*1) + sum((n,d), y(n,d)*(-0.5));

shift_count(n,d).. sum(s, x(n,d,s)) =e= z(n,d) + 2*y(n,d);

mutual_excl(n,d).. z(n,d) + y(n,d) =l= 1;

Model nurse_scheduling /all/;

Solve nurse_scheduling minimizing total_cost using milp;

补充说明

  • 若业务允许单日排3班,可新增二进制变量w[n,d]标记该情况,成本设为2€(比3个单班次省1€),同步调整排班数量等式和成本项即可
  • 现有已实现的约束(如班次人员需求、护士休息规则等)可直接与上述逻辑兼容,无需额外修改

内容的提问来源于stack exchange,提问作者Jonix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:57:08