как я могу отделить отрицательные и положительные переменные? - PullRequest
0 голосов
/ 09 мая 2019

Пусть у меня есть переменная UT [i, j, k, r], значение которой определяется как сумма двух других переменных.

UT[i,j,k,r]= U[i,j,k,r]+D[i,j,k,r]

Теперь я хочу написать некоторые ограничения только для положительного UT [i, j, k, r]! что я могу сделать?

Я пробовал много способов: я определил двоичную переменную, которая равна 1, если UT положительна, и 0 в противном случае, но это не решило мою проблему, потому что умножение их затруднительно. Есть ли способ сохранить индексы, где UT является положительным?

Ответы [ 2 ]

2 голосов
/ 09 мая 2019

Предположим, что BT[i,j,k,r] - ваша двоичная переменная. Затем, если вы используете CPLEX, Gurobi или Xpress в качестве решателя, вы можете написать «ограничение индикатора», например:

BT[i,j,k,r] = 1 ==> *your constraint*

Это самый простой способ. В качестве альтернативы, для любого решателя, если ваше ограничение является линейным, то можно преобразовать ограничение индикатора в эквивалентное линейное ограничение, не умножая двоичную переменную на какие-либо другие переменные. (Если ваше ограничение нелинейное, то также может быть преобразование.) Чтобы узнать о том, как выполняются такие преобразования, посмотрите ответ @ LarrySnyder610 на , если условие в amp .

0 голосов
/ 09 мая 2019

Один из вариантов - разделить UT на две части: UTplus и UTminus, каждая из которых> = 0. Затем определите UT = UTplus - UTminus.

Теперь вам нужно добавить ограничение, которое говорит, что вбольшинство из двух может быть ненулевым.Для этого есть несколько вариантов:

  1. Вы можете использовать ограничение индикатора, как вы предложили и как объяснил 4er.Используйте двоичную вспомогательную переменную, чтобы указать, что если эта переменная равна 1, то UTminus должен быть равен нулю, а если вспомогательная переменная равна 0, тогда UTplus должен быть равен нулю.Если вы можете вывести верхнюю границу M для UTplus и UTminus, то вы также можете просто добавить ограничение UTplus <= M*binary и UTminus <= M*(1 - binary).Если M не слишком велико, это может повысить производительность.
  2. Вы можете использовать ограничение SOS, содержащее UTplus и UTminus (вам нужен один SOS для каждого индекса в переменной).Это также гарантирует, что самое большее одно из двух может быть ненулевым, но не вводит никаких новых переменных.Является ли это более эффективным, чем индикатор или big-M, должно быть проверено.
  3. Если и UTplus, и UTminus имеют положительный коэффициент в целевой функции (для минимизации), то есть вероятность, что в любом оптимальном решении одиниз двух будет ноль автоматически .Это зависит от того, что именно представляет переменная UT в вашей модели.Посмотрите на свою модель и посмотрите, сможете ли вы доказать это свойство.Тогда вам не нужны никакие дополнительные ограничения или переменные.
...