护士排班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]变量兑现该优惠。
关键约束添加
单日排班数量匹配约束:
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)
单/双班次互斥约束:
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
相关产品推荐
相关产品推荐

