簡體   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