Моделирование кусочной функции в ГЛПК

Я пытаюсь использовать GLPK для решения задачи оптимизации, для которой у меня есть кусочная функция (2 подфункции). Короче говоря, проблема заключается в минимизации затрат на электроэнергию в окружающей среде путем планирования работы определенных (электрических) приборов. Также рассматривается производство энергии, поэтому моя целевая функция сводится к минимуму следующей функции:

целевая функция

Идея состоит в том, что для каждого момента balance [i] будет хранить общий энергетический баланс (то есть разницу между потребляемой и произведенной энергией). Следовательно, если balance [i]> = 0, количество потребляемой энергии превышает производство, и нам нужно покупать энергию из сети; в противном случае производство превышает потребности, и мы можем продавать излишки энергии в сеть.

Для каждого момента времени значение баланса [i] будет зависеть от производства энергии, фиксированного потребления энергии (оба были известны ранее, поэтому проблемных переменных не было) и от потребления энергии запланированными приборами (рассчитывается как функция переменных задачи).

Пытаясь смоделировать это в GLPK, я ввел двоичную переменную, которая для каждого момента i сообщает сигнал balance [i]. Идея состоит в том, чтобы записать целевую функцию как:

минимизировать объект: сумма {i в k} (z [i] * баланс [i] * покупка + (1-z [i]) * баланс [i] * продажа)

Таким образом, я хочу, чтобы z [i] было 1, когда balance [i]> = 0, и z [i] было 0 в противном случае (balance [i] ‹0).

Как я могу определить ограничения на z [i]? Я знаю, что в GLPK можно определять условные ограничения, но, насколько мне известно, я не могу писать:

s.t. zUpperi {я в k: баланс [я]> = 0}: z [я] = 1;

потому что balance [i] зависит от переменных задачи ... Есть ли другие способы выразить это ограничение? Или это вообще невозможно в ГЛПК?


person jpleitao    schedule 25.07.2018    source источник


Ответы (1)


Ваш подход

minimize obj: sum {i in k} (z[i]*balance[i]*buy + (1-z[i])*balance[i]*sell)

делает задачу нелинейной (квадратичной) при умножении двух переменных. В целом мы умеем:

minimize obj: sum {i in k} (posbal[i]*buy + negbal[i]*(-sell)) 

# constraints 
posbal[i] - negbal[i] = balance[i]
posbal[i] <= z[i]*maxbal[i]
negbal[i] <= (1-z[i])*maxbal[i]

# bounds
posbal[i] >= 0, negbal[i] >= 0
-maxbal[i] <= balance[i] <= maxbal[i]
z[i] binary

где maxbal[i] - постоянная граница balance[i]. Я предполагаю, что sell,buy - константы.

Часто эту конструкцию можно еще больше упростить, но это зависит от деталей модели.

person Erwin Kalvelagen    schedule 25.07.2018
comment
Нет, ваш вывод неверен. Ни в каком виде я не избавился от переменной balance. - person Erwin Kalvelagen; 25.07.2018
comment
Спасибо за ваше предложение! Да, buy и sell - константы. Если я понял ваше предложение, это убирает вычисление balance[i], верно? Мы заменяем продукт z[i]*balance[i] на posbal[i] (и то же самое для negbal[i]). Проблема для меня в том, что, хотя balance[i] вычисляется на основе проблемных переменных, мне все равно нужно использовать значения, присвоенные им в других ограничениях, и путем наложения верхних границ на posbal[i] Я не думаю, что смогу добиться согласованности значений с другими переменными. Может это нельзя сделать в LP ... Или я что-то недопонимаю? - person jpleitao; 25.07.2018
comment
Моя ошибка, ты прав. posbal и negbal имеют желаемые значения. Это решает мою проблему! Еще раз спасибо - person jpleitao; 25.07.2018