CPLEX中的逻辑约束

时间:2017-04-06 09:30:26

标签: cplex constraint-programming opl

我是使用CPLEX的初学者,我遇到了创建逻辑约束的问题(如果......那么......)。我使用的是IBM ILOG CPLEX Optimization Studio 12.7版。根据{{​​3}},它应该能够通过使用“=>”来处理逻辑约束(例如,“if 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 个答案:

答案 0 :(得分:0)

查看提供的OPL示例(例如BasketballScheduling \ acc.mod)我认为定义约束的'then'部分应该具有'=='而不是'='。这不是一项任务,而是宣布两者必须相等。

答案 1 :(得分:0)

 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
}

工作正常