约束误差大于运算符

时间:2019-05-01 13:26:03

标签: constraints cplex

我曾经在Cplex遇到麻烦,不知道为什么。 因此,我附上了一段代码:

 dvar int+ soglia[pazienti][giorni][slot];
 dvar int+ sogliar[pazienti][giorni][slot];
 dvar int+ soglial[pazienti][giorni][slot];

 forall(k in giornidue, w in slot)  sum(j in pazienti)(soglia[j,k,w]+sogliar[j,k,w]+soglial[j,k,w]) > sum(j in pazienti)(soglia[j,k-1,w]+sogliar[j,k-1,w]+soglial[j,k-1,w]);

并得到此错误:

Function operator >(dexpr int, dexpr int) not available in CPLEX context

我不明白为什么我不能在int之间使用>。

3 个答案:

答案 0 :(得分:2)

如对您的答案的评论之一所述,线性规划理论不支持严格的不等式。但是,由于您知道表达式的两边都是整数,所以

a > b

等同于

a >= b + 1

后者不需要严格的不等式。像这样重写约束应该起作用。

答案 1 :(得分:0)

Tim的评论实际上是一个完全正确的答案:“您不能在线性编程和类似MILP的相关变体中使用严格的不等式。这是因为约束条件定义了可能的解决方案的空间,并且必须在其边界边上包括点,并且在一组可行的解决方案中进行搜索。请检查几乎所有有关LP和MILP的基本文字。”

答案 2 :(得分:0)

使用CPLEX的任何建模API,您将无法在变量之间进行严格的不等式。

您应该使用ˋ<=ˋ

以下内容将消除此错误

 range pazienti = 1..10;
 range giorni = 1..10;
 range giornidue = 2..10;
 range slot = 1..10;

 dvar int+ soglia[pazienti][giorni][slot];
 dvar int+ sogliar[pazienti][giorni][slot];
 dvar int+ soglial[pazienti][giorni][slot];

 subject to {
   forall (k in giornidue, w in slot)  
      sum(j in pazienti)(soglia[j,k,w]+sogliar[j,k,w]+soglial[j,k,w]) >=
     sum(j in pazienti)(soglia[j,k-1,w]+sogliar[j,k-1,w]+soglial[j,k-1,w]);
 }