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



我正在尝试根据员工轮班的可用性为每个员工创建一个轮班时间表。我有一个元组定义为包括班次开始时间、班次结束时间、最大轮班人数。输入还包括员工班次首选项的数组列表,例如 [[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

最新更新