在给定员工轮班可用性的情况下,我正在尝试为每个员工创建轮班时间表。我定义了一个元组,其中包括轮班开始时间,轮班结束时间,最多人上班。输入还包括一个用于员工轮班首选项的数组列表,例如[[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中实现它。
答案 0 :(得分:0)
如果我理解正确,则每个移位j
的开始和结束时间都是已知的常数。我称它们为start[j]
和end[j]
。因此,您应该能够使用forall
结构使用它们来指定对(j,k)
对,以使移位j
和k
不重叠。
在产品随附的示例中,您可以在forall
的子目录中找到使用[InstallDir]/opl/examples/opl
的示例。更具体地说,包含您可以查看的构造的模型为models/Staffing/staffing.mod
,timetabling/timetabling.mod
和teambuilding/teambuilding.mod
。