0

Я относительно новичок в целых программировании и (опять же) застрял в формулировке ограничения.Целочисленное программирование: назначение абсолютного значения (в зависимости от значения переменной)

В моей упрощенной модели у меня есть (непрерывная) переменная с нижней границей 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 и наоборот.

Любые идеи?

+0

"смешанное целочисленное программирование" .... "в ... реале" ... Так это целочисленное программирование, или с плавающей точкой (псевдо-реальный)? Также на каком языке/каркасе/платформе/программе вы говорите здесь? Выражение логики любого типа обычно требует использования определенного языка. И что не так с логикой, которую вы уже выразили? Что вы пробовали, и что не работает? – twalberg

+0

О, извините, вы правы! Это целочисленное программирование, а переменные непрерывны (см. Мое редактирование). Я ищу способ описать это с помощью (in) равенств. Для моделирования я использую Python, Pyomo и новейший решающий робот! –

ответ

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 и ограничения ниже удается OK.)

Теперь добавит ограничения исполнившего значение 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 
+0

Спасибо за ваш ответ, grendelsdad! Ваша формулировка кажется мне логичной. Но если я положу уравнения в свою модель, BinaryVar всегда будет установлен в 1, а Variable1, Variable2 и Variable3 будут установлены на ноль (или SomeValue * e-13).Я уже проверял, остается ли Variable1 в верхней и нижней границах. До сих пор я не мог найти причину, почему это не работает ... –

+0

Проблема возникает при втором неравномерности (LB * (1 - BinaryVar) <= Variable1), если значение Variable1 отрицательное. Тогда неравномерность не может быть выполнена, поскольку LB * (1 - BinaryVar) может быть только выше или равна нулю. Я уже ищу решение .. –

+0

Формулирование второй неравномерности к «-LB * (1 - BinaryVar) <= Variable1» должно устранить проблему, но если я сформулирую ее так, то решатель также устанавливает значения для Variable1 либо ноль, SomeValue x e-13 или -SomeValue x e-13, а в случае, если Variable1 равно нулю, значения для BinaryVariable будут установлены случайным образом на 0/1. Я думаю, проблема возникает в случае, когда Variable1 точно равна нулю. –

Смежные вопросы