Как возможно утверждение if с переменными решения в CPLEX? - PullRequest
0 голосов
/ 06 ноября 2018

Как мне сформулировать мою модель, чтобы она выполняла техническое обслуживание на 450 и чистку на 150?

forall(w in W, t in T, s in S, p in P, m in M)  
   (450<=hub[m][w][t][s])<=(b_maint[w][m][t][s]==1);

forall(w in W, t in T, s in S, p in P, m in M)  
   (hub[m][w][t][s]>=150)<=(b_clean[w][m][t][s]==1);

Я также хочу, чтобы после моего обслуживания концентратор был снова установлен в 0 (мой объем производства). Правильно ли написана эта формулировка?

forall(w in W, t in T, s in S, p in P, m in M)  
   (b_maint[w][m][t][s]==1)==(hub[m][w][t][s]==0);

И могу ли я также моделировать границы следующим образом:

forall(w in W, t in T, s in S)  
   (135<=sum(p in P, m in M)r_x[m][w][p][t][s] && sum(p in P, m in M)r_x[m][w][p][t][s]<=185)==(b_clean[w][t][s]==1);

Я тоже попробовал вот так:

(135<=sum(p in P, m in M)r_x[m][w][p][t][s] <=185)==(b_clean[w][t][s]==1);

но это тоже не работает ...

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Вы написали

forall(w in W, t in T, s in S, p in P, m in M)    
   (450<=hub[m][w][t][s])<=(b_maint[w][m][t][s]==1);

который вы могли бы написать

forall(w in W, t in T, s in S, p in P, m in M)    
   (450<=hub[m][w][t][s])=>(b_maint[w][m][t][s]==1);

=> означает ПОДХОДИТ

Это то, что вы имели в виду? Возможно, вы имели в виду обратное ограничение:

forall(w in W, t in T, s in S, p in P, m in M)    
       (b_maint[w][m][t][s]==1)=>(450<=hub[m][w][t][s]);
0 голосов
/ 06 ноября 2018

вы можете использовать логические ограничения:

(x==1) => (y<=2);

означает, что если (x == 1), то y будет меньше 2.

Вы также можете использовать эквивалентность:

(x==3) == (z>=3)

1009 * привет *

...