如何避免时间表问题的调度冲突

时间:2019-03-28 03:42:30

标签: linear-programming cplex integer-programming opl

在给定员工轮班可用性的情况下,我正在尝试为每个员工创建轮班时间表。我定义了一个元组,其中包括轮班开始时间,轮班结束时间,最多人上班。输入还包括一个用于员工轮班首选项的数组列表,例如[[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中实现它。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,则每个移位j的开始和结束时间都是已知的常数。我称它们为start[j]end[j]。因此,您应该能够使用forall结构使用它们来指定对(j,k)对,以使移位jk不重叠。

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