【问题标题】:Constraint error with greater than operator大于运算符的约束误差
【发布时间】:2019-05-01 13:26:03
【问题描述】:

我曾经遇到过 Cplex 的麻烦,我不知道为什么。 所以我附上一段sn-p的代码:

 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 之间使用 >。

【问题讨论】:

  • 您不能在线性规划和 MILP 等相关变体中使用严格不等式。这是因为约束定义了可能解的空间,并且必须将其边界边缘和曲面上的点包含在可行解集中。检查几乎所有关于 LP 和 MILP 的基本文本。

标签: constraints cplex


【解决方案1】:

正如您回答的其中一个 cmets 中所述,线性规划理论不支持严格的不等式。但是,既然您知道表达式的两边都是整数,

a > b

等价于

a >= b + 1

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

【讨论】:

    【解决方案2】:

    Tim 的评论实际上是一个完全有效的答案:“您不能在线性规划和 MILP 等相关变体中使用严格不等式。这是因为约束定义了可能解决方案的空间,并且必须包括其边界边缘上的点和在一组可行的解决方案中的表面。检查几乎所有关于 LP 和 MILP 的基本文本。"

    【讨论】:

    • 是的,我不知道为什么我没有想到这一点。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-12
      相关资源
      最近更新 更多