Логические ограничения в 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;), но безрезультатно. Я что-то упускаю?


person TracedWill    schedule 06.04.2017    source источник


Ответы (2)


Глядя на предоставленные примеры OPL (например, BasketballScheduling \ acc.mod), я думаю, что часть 'then', определяющая ограничение, должна иметь '==', а не '='. Это не задание, а заявление о том, что двое должны быть равны.

person TimChippingtonDerrick    schedule 06.04.2017
comment
Я попытался изменить его, и он выдал другую ошибку: Operator not available for {boolean} => boolean. Но, насколько я понимаю, это то, что они используют в приведенном вами примере. Странный. - person TracedWill; 07.04.2017
comment
Не могу редактировать комментарий. Удаление {} вокруг левой стороны решило последнюю часть проблемы. Кажется, что логических ограничений всего boolean => boolean. Спасибо. - person TracedWill; 07.04.2017

 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
}

работает отлично

person Alex Fleischer    schedule 18.04.2017