создать логические ограничения в CPLEX

Я использую OPL в CPLEX 12.9

В моей модели у меня есть два логических значения dvar, X[p][t] и Y[t]. Я хочу написать:

(Y[t] == 1) => (X[u][t] == 0);

Но также должно быть возможно, что

(Y[t] == 0) && (X[u][t] == 0);

Но не работает. Надеюсь, у кого-то есть идея.


person Frieda12    schedule 23.09.2019    source источник


Ответы (2)


если вы напишете

(Y[t] == 1) => (X[u][t] == 0);

единственный сценарий, который невозможен, это

(Y[t] == 1) && (X[u][t] == 1);
person Alex Fleischer    schedule 23.09.2019
comment
Да, сценарий должен быть только таким: (Y [t] == ​​1) = ›(X [u] [t] == ​​0); или (Y [t] == ​​0) && (X [u] [t] == ​​0); но если я напишу (Y [t] == ​​1) = ›(X [u] [t] == ​​0); программный вывод для всех переменных решения не имеет значения - person Frieda12; 23.09.2019
comment
Это означает, что ваша модель неосуществима по другим причинам. Что вы можете сделать дальше, так это назвать свои ограничения, и тогда вы получите некоторое расслабление / конфликты. - person Alex Fleischer; 24.09.2019
comment
Спасибо за совет! Не могли бы вы привести пример того, как я могу назвать свои ограничения? Если я назвал свои ограничения, следует ли мне использовать CP Solver? Или я могу решить с помощью OPL - person Frieda12; 24.09.2019
comment
ct: x ‹= 2; например. См. Конкретную документацию по адресу ibm.com/support/knowledgecenter/SSSA5P_12.7.0/ - person Alex Fleischer; 24.09.2019
comment
Дэвид Нехме и Алекс Флейшер большое спасибо за вашу помощь и советы! Ваша помощь решила мою проблему! - person Frieda12; 25.09.2019

Условие (y [t] == ​​1) => (x [u] [t] == ​​1) может быть выражено следующим линейным ограничением.

y[t] + x[u][t] <= 1

Пока y и x являются двоичными. Если y [1] равно 1, тогда x [u] [t] может принимать только значение 0. Если y [t] равно 0, x [u] [t] может быть либо 0, либо 1.

person David Nehme    schedule 24.09.2019