Соотнесите две переменные в ограничении CPLEX - PullRequest
0 голосов
/ 15 апреля 2020

Работая над линейной программой, я столкнулся с этим вопросом: можно соотнести два класса переменных, например, Xij (набор переменных, больший или равный нулю) и Yij (переменные решения) так, чтобы:

if Xij> 0 -> Yij = 1
if Xij == 0 -> Yij = 0

Спасибо всем заранее.

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Чтобы мое предложенное решение работало, сначала вам нужно определить значения Xij_min и Xij_max, чтобы представить минимальные и максимальные пределы переменной Xij, когда она равна Xij > 0.

Xij_min может быть таким же маленьким, как вы sh или имеет смысл, а Xij_max может быть сколь угодно высоким, если нет физических ограничений для ваших переменных.

Затем, добавив два следующих ограничения, можно достичь того, чего вы хотите:

Xij >= Xij_min * Yij
Xij <= Xij_max * Yij

Для примера рассмотрим Xij_min = 0.1 и Xij_max = 1000. Это создаст ограничения:

Xij >= 0.1 * Yij
Xij <= 1000 * Yij

Если Xij будет принимать значение от 0,1 до 1000 (которое мы определили как допустимый положительный диапазон), тогда Yij должно быть равно 1.

Теперь, если Xij становится 0, тогда для удержания этих ограничений Yij должно быть 0, чтобы иметь Xij <= 0 и Xij >= 0.

0 голосов
/ 15 апреля 2020

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

Например, для " если затем " в OPL CPLEX вы можете написать

int nbKids=300;
float costBus40=500;
float costBus30=400;



dvar int+ nbBus40;
dvar int+ nbBus30;

minimize
 costBus40*nbBus40  +nbBus30*costBus30;

subject to
{
 40*nbBus40+nbBus30*30>=nbKids;

 // with if nb buses 40 more than 3  then nb buses30 more than 7

 (nbBus40>=3)=>(nbBus30>=7);
 //(nbBus40>=3)<=(nbBus30>=7); //equivalent
}
...