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

构建成本最小化模型:如何在Cplex中编写休息日约束?

在CPLEX中编写休息日约束的实现方案

核心决策变量定义

首先定义二进制决策变量,标记工人的排班状态:

// 工人w在日期d上班次s则为1,否则为0
dvar boolean x[Workers, Days, Shifts]; 
// 工人w在日期d休息则为1,否则为0(可选,用于简化约束书写)
dvar boolean y[Workers, Days];

关键休息日约束的CPLEX实现

以下是对应常见排班休息日规则的OPL代码(匹配你提供的约束逻辑):

1. 每日工作唯一性约束

每个工人每天最多上1个班次,要么工作要么休息:

forall(w in Workers, d in Days) {
  sum(s in Shifts) x[w][d][s] ≤ 1;
  // 若使用y变量关联工作与休息状态:
  sum(s in Shifts) x[w][d][s] + y[w][d] = 1;
}

2. 连续工作天数限制

禁止工人连续工作超过指定天数(示例为最多连续工作6天):

int maxConsecWorkDays = 6;
forall(w in Workers, d in Days where d + maxConsecWorkDays <= Days.size) {
  sum(k in d..d+maxConsecWorkDays) sum(s in Shifts) x[w][k][s] ≤ maxConsecWorkDays;
}

3. 每周最低休息日要求

确保每个工人每周至少休息指定天数(示例为每周至少休息1天):

int minWeeklyRestDays = 1;
forall(w in Workers, week in Weeks) {
  sum(d in week.Days) y[w][d] ≥ minWeeklyRestDays;
  // 若直接用x变量表示等价逻辑:
  // sum(d in week.Days) sum(s in Shifts) x[w][d][s] ≤ week.Days.size - minWeeklyRestDays;
}

4. 休息日禁止工作约束

确保休息的工人当天不参与任何班次:

forall(w in Workers, d in Days, s in Shifts) {
  x[w][d][s] ≤ 1 - y[w][d];
}

整合到总成本最小化模型

将上述约束添加到你的目标函数模型中,总成本通常包含班次工资、加班成本等:

minimize sum(w in Workers, d in Days, s in Shifts) shiftCost[w][s] * x[w][d][s];

subject to {
  // 插入上述所有约束代码
}

如果你的约束图示中有特殊规则(如每月最低休息日、连续休息天数限制等),只需调整变量阈值或约束逻辑即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:20:26