Логические ограничения в CPLEX
Я новичок в использовании CPLEX, и я столкнулся с проблемой с созданием логических ограничений (если... тогда...). Я использую IBM ILOG CPLEX Optimization Studio версии 12.7. Согласно руководству, он должен уметь обрабатывать логические ограничения с помощью "=>" (например, "если x>0, то y>=2" должно стать x>0 => y>=2
).
Проблема состоит в назначении начала и конца смены сотрудникам (или 0, если они не работают сегодня). Я пытаюсь создать переменную, которая работает как индикатор того, работают ли они, чтобы использовать ее для последующего распределения затрат.
Я свел мой код к следующему:
using CP;
tuple TimeSlot {
key int day;
key int slotNo;
}
{TimeSlot} TimeSlots = ...;
{int} mondays = {t.slotNo|t in TimeSlots:t.day==1};
int monMax = max(t in mondays) t;
range monRange = 0..monMax;
range allEmployees = 1..10;
dvar int monStart[allEmployees] in monRange; //Start of monday shift
dvar int monEnd[allEmployees] in monRange; //End of monday shift
dvar int monAtWork[allEmployees] in 0..1; //Binary
//minimize ...
subject to{
forall(t in allEmployees)
{monStart[t] > 0 && monEnd[t]>0} => monAtWork[t] = 1; //Get error here
}
Я получаю ошибку syntax error, unexpected =
, Я пытался как разделить и перевернуть ограничение (например, monStart[t] == 0 => monAtWork[t] = 0;
) но безрезультатно. Я что-то пропустил?
2 ответа
Глядя на предоставленные примеры OPL (например, BasketballScheduling\acc.mod), я думаю, что часть "then", определяющая ограничение, должна иметь "==", а не "=". Это не задание, но заявление о том, что оба должны быть равны.
using CP;
tuple TimeSlot {
key int day;
key int slotNo;
}
{TimeSlot} TimeSlots = {<1,1>,<2,2>};;
{int} mondays = {t.slotNo|t in TimeSlots:t.day==1};
int monMax = max(t in mondays) t;
range monRange = 0..monMax;
range allEmployees = 1..10;
dvar int monStart[allEmployees] in monRange; //Start of monday shift
dvar int monEnd[allEmployees] in monRange; //End of monday shift
dvar int monAtWork[allEmployees] in 0..1; //Binary
//minimize ...
subject to{
forall(t in allEmployees)
(monStart[t] > 0 && monEnd[t]>0) => monAtWork[t] == 1; //Get error here
}
работает отлично