Целочисленное программирование: присвоение абсолютного значения (в зависимости от значения переменной)

Я относительно новичок в целочисленном программировании и (снова) застрял с формулировкой ограничения.

В моей упрощенной модели у меня есть (непрерывная) переменная с нижней границей LB ниже нуля и верхней границей UB выше нуля. Теперь я хочу присвоить значение переменной другим переменным в зависимости от значения, которое эта переменная приняла.

Логика, которую я хочу выразить, следующая:

LB > 0
UB > 0
-LB <= Variable1 <= UB

if Variable1 => 0:
    Variable2 = Variable1
    Variable3 = 0
else:
    Variable2 = 0
    Variable3 = abs(Variable1)

Как я могу описать это с помощью линейных (не) равенств?

Я думаю, я немного медленно осваиваю ...

Заранее спасибо!

** Изменить: для моделирования я использую Python, Pyomo и новейший решатель Gurobi.

*** Изменить: я сформулировал это следующим образом, используя двоичную переменную. (Я знаю, что он квадратичный, но позже его можно линеаризовать):

LB > 0
UB > 0

-LB <= Variable1 <= UB
0 <= Variable2 <= UB
0 <= Variable3 <= LB
Variable4 = Variable2 * BinaryVariable - Variable3 * (1-BinaryVariable)

Но теперь мне все еще нужно убедиться, что Variable3 равно 0, если Variable2> 0, и наоборот.

Любые идеи?


comment
смешанное целочисленное программирование .... внутри ... реальных ... Так это целочисленное программирование или с плавающей запятой (псевдореальное)? И о каком языке / фреймворке / платформе / программе вы здесь говорите? Выражение логики любого вида обычно требует использования определенного языка. А что не так с уже высказанной вами логикой? Что вы пробовали, и что из этого не работает?   -  person twalberg    schedule 12.02.2015
comment
Ой, извините, вы правы! Это целочисленное программирование, и переменные непрерывны (см. Мою правку). Я ищу способ описать это, используя (не) равенства. Для моделирования я использую Python, Pyomo и новейший решатель gurobi!   -  person Cord Kaldemeyer    schedule 13.02.2015


Ответы (1)


Сначала создайте двоичную переменную, которая равна 1, если Variable1 > 0 и 0, если Variable1 < 0:

Variable1 <= UB * BinaryVar
LB * (1 - BinaryVar) <= Variable1

(Если Variable1 > 0, тогда BinaryVar должно быть равно 1. Если Variable1 < 0, то BinaryVar должно быть равно 0. Обратите внимание, что если Variable1 = 0, то BinaryVar может равняться 0 или 1, но это не имеет значения для вашей проблемы, потому что если Variable1 = 0, затем Variable2 = Variable3 = 0 и приведенные ниже ограничения работают нормально.)

Теперь добавьте ограничения, обеспечивающие соблюдение значений для Variable2 и Variable3:

Variable2 = Variable1 * BinaryVar
Variable3 = -Variable1 * (1 - BinaryVar)

Это квадратичные зависимости, которые затем можно линеаризовать.

Линеаризация:

Variable2 <= UB * BinaryVar
Variable2 >= -LB * BinaryVar
Variable2 <= Variable1 + LB * (1 - BinaryVar)
Variable2 >= Variable1 - UB * (1 - BinaryVar)
Variable3 = Variable2 - Variable1
person LarrySnyder610    schedule 13.02.2015
comment
Спасибо за ответ, grendelsdad! Ваша формулировка мне кажется логичной. Но если я помещаю уравнения в свою модель, BinaryVar всегда устанавливается в 1, а Variable1, Variable2 и Variable3 устанавливаются в ноль (или SomeValue * e-13). Я уже проверил, остается ли Variable1 в пределах верхней и нижней границ, что имеет место. Пока не смог найти причину, почему это не работает ... - person Cord Kaldemeyer; 14.02.2015
comment
Проблема возникает со вторым неравенством (LB * (1 - BinaryVar) ‹= Variable1), если значение Variable1 отрицательное. Тогда неравенство не может быть выполнено, поскольку LB * (1 - BinaryVar) может быть только больше или равно нулю. Уже ищу решение .. - person Cord Kaldemeyer; 14.02.2015
comment
Формулировка второго неравенства в -LB * (1 - BinaryVar) ‹= Variable1 должна решить проблему, но если я сформулирую ее так, решатель также установит значения для Variable1 либо равными нулю, SomeValue x e-13 или -SomeValue x e -13 и в случае, если Variable1 равна нулю, значения для BinaryVariable случайным образом устанавливаются на 0/1. Я предполагаю, что проблема возникает в том случае, если Variable1 точно равна нулю .. - person Cord Kaldemeyer; 14.02.2015
comment
Кстати, я изменил формулировку вопроса на LB ›0, UB› 0 и -LB ‹= Variable1‹ = UB, так как это немного более интуитивно понятно .. - person Cord Kaldemeyer; 14.02.2015
comment
Интересно. В формулировке LB ›0 / UB› 0 / -LB ‹= Variable1‹ = UB / Variable1 ‹= UB * BinaryVar / -LB * (1 - BinaryVar)‹ = Variable1 двоичная переменная в большинстве случаев устанавливается правильно. Но почему-то верхняя и нижняя границы UB / LB для Variable1 не удовлетворяются, и возникают такие значения, как SomeValue x e-15 или -SomeValue x e-15. Для этих значений значение BinaryVariable установлено неправильно. - person Cord Kaldemeyer; 14.02.2015
comment
То, что вы описываете, звучит совершенно законно, учитывая ограничения, которые я предложил, и проблему, которую вы указали в OP. Если Variable1 = 0, то BinaryVar может быть равно 0 или 1 (это не имеет значения), и у нас должно быть Variable2 = Variable3 = 0. Я думаю, что ваша целевая функция хочет иметь Variable1 = 0, и в этом случае следуют все остальные переменные. - person LarrySnyder610; 15.02.2015
comment
Второе неравенство должно быть нормальным, даже если Variable1 < 0 при условии, что LB отрицательно (или положительно, но вы замените его на -LB) - если BinaryVar = 1, то Variable1 должно быть >= 0, а если BinaryVar = 0, то Variable1 не ограничено, что мы и хотим. - person LarrySnyder610; 15.02.2015
comment
Что касается вопроса e-15, я думаю, вам нужно будет указать конкретные значения всех переменных, а не просто словесное описание некоторых из них. И предоставление целевой функции также может помочь. - person LarrySnyder610; 15.02.2015
comment
Спасибо за помощь! Каким-то образом BinaryVar теперь правильно устанавливается на 1, если Variable1> 0, и на 0, если Variable1 ‹0 .. Но если я активирую ограничения присваивания, значения для Variable2 и Variable3 устанавливаются на ноль, независимо от того, имеет ли BinaryVar значение 1 или 0. Переменная 1 неявно устанавливается равной сумме 3 других переменных и не содержится в целевой функции. Также нет Variable2 и Variable3. Моя модель довольно сложна, и я думаю, размещение ее здесь, вероятно, будет слишком запутанным. - person Cord Kaldemeyer; 16.02.2015
comment
Но, похоже, мне осталось только решить задачу с назначением ;-) - person Cord Kaldemeyer; 16.02.2015
comment
Хорошо, надеюсь, этого достаточно, чтобы вы начали. - person LarrySnyder610; 16.02.2015
comment
После линеаризации двух последних неравенств, как описано здесь Работает отлично! Так что почему-то квадратичная формулировка не сработала. Спасибо!!! Ты снова спас мне неделю ;-) - person Cord Kaldemeyer; 17.02.2015
comment
Я добавил к вашему ответу линеаризацию! - person Cord Kaldemeyer; 17.02.2015