Optimization 在OPL中使用条件forall时出错

Optimization 在OPL中使用条件forall时出错,optimization,cplex,opl,Optimization,Cplex,Opl,当我使用该约束时,OPL模型中出现错误: forall (j1,j2 in p: row[j1]==row[j2] && j1<j2) 错误如下所示: Decision variable row not allowed. 我不知道为什么这是不可能的,但如何解决这个问题?条件是切片应该是绑定的,不应该包含任何决策变量。您应该依赖于逻辑约束: range p=1..4; dvar int row[p] in p; subject to { forall(j1,j2

当我使用该约束时,OPL模型中出现错误:

forall (j1,j2 in p: row[j1]==row[j2] && j1<j2) 
错误如下所示:

Decision variable row not allowed. 

我不知道为什么这是不可能的,但如何解决这个问题?

条件是切片应该是绑定的,不应该包含任何决策变量。您应该依赖于逻辑约束:

range p=1..4;

dvar int row[p] in p;

subject to
{
 forall(j1,j2 in p) ((row[j1]==row[j2] ) => (row[j1]>=2));
}

这很好。

好,但这是线性约束还是非线性约束?这是逻辑约束。这很好。是的,我知道所有的工作,但我不知道从理论上讲这是不是线性约束。因为我需要所有类似的线性约束。严格地说,逻辑约束不是真正的线性约束。但是,由于它可以很容易地转换成线性约束(而CPLEX将自动完成),所以通常不进行区分。谢谢,对于Work@ G.S.,如果这个或任何答案已经解决了您的问题,请通过点击复选标记来考虑。这向更广泛的社区表明,你已经找到了一个解决方案,并给回答者和你自己带来了一些声誉。没有义务这样做。
range p=1..4;

dvar int row[p] in p;

subject to
{
 forall(j1,j2 in p) ((row[j1]==row[j2] ) => (row[j1]>=2));
}