情况如下:我正在为工作场所创建每日时间表。每天都被划分为时间段,在每个时间段我都知道必须有多少员工在场。时间表是使用两个整数决策变量创建的,这些变量描述了每个员工的到达和离开时间段。
目前,我使用一个额外的变量来判断员工i在时间t是否在工作,然后我将它们与每个时间段的员工相加,以与需求进行比较。我的代码可以归结为以下内容:
using CP;
tuple TimeSlot {
key int id;
int minEmploy;
}
{TimeSlot} TSlots = ...;
{int} timeSlots = {t.id|t in TSlots};
int tMax = max(t in timeSlots) t;
range dayRange = 0..tMax;
range allEmployees = 1..10;
dvar int dayStart[allEmployees] in dayRange;
dvar int dayEnd[allEmployees] in dayRange;
dvar int workTimeT[allEmployees][timeSlots] in 0..1;
minimize ...;
subject to {
/*Indicator constraints*/
forall(i in allEmployees){
forall(t in timeSlots:t>0){
dayStart[i] <= t && t <= dayEnd[i] => workTimeT[i][t] == 1;
dayEnd[i] < t || t < dayStart[i] => workTimeT[i][t] == 0;
}
}
/*Must satisfy requirement*/
forall(t in timeSlots:t>0){
sum(i in allEmployees) workTimeT[i][t] >= item(TSlots,<t>).minEmploy;
}
}
有没有办法绕过这个额外的变量?添加#employees乘以#timeslots变量只是为了检查一个数字是否在两个决策变量之间,这不可能是有效的。