繁体   English   中英

约束误差大于运算符

[英]Constraint error with greater than operator

我曾经在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之间使用>。

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

a > b

相当于

a >= b + 1

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

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

使用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]);
 } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM