如何避免时间表问题的安排冲突

How to avoid scheduling conflicts for a timetable problem

我正在尝试根据员工轮班时间为每位员工创建轮班时间表。我定义了一个元组,其中包括轮班开始时间、轮班结束时间、轮班人数上限。输入还包括员工轮班偏好的数组列表,例如 [[1 0 0 1 1],...] 表示员工 1 可以轮班 1、4、5 但不能轮班 2、3。请注意轮班时间不是相互排斥的,可以重叠。

我有一个决策变量 x[i,j] 如果员工 i 为第 j 个班次配备人员,则为 1,否则为 0。执行后,我期望 x[i,j] 是一个矩阵,指示每个员工被分配到哪个班次。我还有其他限制,包括轮班能力。但我一直在研究如何创建约束以确保分配的班次不重叠。

我的一个想法是比较 x[i,j] 和 x[i,k],其中 j =/= k,看看他们是否检查 i 的开始时间 > j 的结束时间或开始时间j > i 的结束时间。但是我不确定如何在 OPL 中实现它。

如果我没理解错的话,每个班次的开始和结束时间j是已知常数。让我称它们为 start[j]end[j]。所以你应该能够使用这些来指定,使用 forall 结构,(j,k) 对使得 jk 不重叠。

您将在 [InstallDir]/opl/examples/opl 的子目录中随产品安装的示例中找到使用 forall 的示例。更具体地说,包含您可以查看的构造的模型是 models/Staffing/staffing.modtimetabling/timetabling.modteambuilding/teambuilding.mod.