Обработка поведения включения/выключения в задачах оптимизации MILP в GEKKOPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Обработка поведения включения/выключения в задачах оптимизации MILP в GEKKO

Сообщение Anonymous »

Я пытаюсь понять, как эффективно реализовать поведение ВКЛ/ВЫКЛ в задачах оптимизации, которые необходимо решить в GEKKO.
Рассмотрим следующий сценарий:
  • 2 генератора мощности, с верхней и нижней границей
  • у одного генератора потери мощности составляют 30%
  • общая вырабатываемая мощность должна удовлетворять внешнюю потребность в электроэнергии.
  • цель состоит в том, чтобы минимизировать потери энергии.
Вышеупомянутое проблема реализована на Python:

Код: Выделить всё

import numpy as np
from gekko import GEKKO
import matplotlib.pyplot as plt

timesim = 24*1      # hours
timesteps = 1   # steps/hour
n = np.int64(timesim*timesteps + 1) # this is the vector length in GEKKO

Edh_demand =np.ones(timesim+1)*80;
Edh_demand[int(7*n/24):int(10*n/24)] = 200
Edh_demand[int(3*n/4)-1:int(3*n/4)+2] = 300

m = GEKKO(remote=False)             # initialize gekko, körs lokalt
m.time = np.linspace(0, 24, 25)      # Gekko-tid

Egen1 = m.Var(value = 30, lb = 30, ub = 200)
Egen2 = m.Var(value = 30, lb = 30, ub = 200)
Eloss = m.Var(value = 30*.3)
Eprod = m.Var(value = 30)
Edemand = m.Param(value = Edh_demand)

cost = m.Param(value = 10)

m.Equation(Eloss == Egen1*.3)
m.Equation(Eprod == Egen2 + Egen1 - Eloss)

m.Minimize(Eloss)

m.Equation(Eprod >= Edemand)

m.options.SOLVER = 3
m.options.IMODE = 6
# m.options.COLDSTART=2
m.options.COLDSTART=0

m.solve(disp=True)

plt.figure(5)
plt.subplot(2, 1, 1)
plt.plot(m.time, Egen1, label='gen 1')
plt.plot(m.time, Egen2, label='gen 2')
plt.legend()

plt.subplot(2, 1, 2)
plt.plot(m.time, Edemand, '--r')
plt.plot(m.time, Eprod)

plt.show()
У меня есть следующие вопросы/проблемы:
  • Как это реализовано сейчас, gen1 переходит к своей нижней границе как ожидал. Я хочу ограничить gen1 так, чтобы он мог работать либо на нижней границе, либо на 0, но не между 0 и gen1_lb.
  • Я хочу наказать за выключение и включение gen1.
    Я хочу ограничить поколение 1, чтобы при каждом его выключении требовалось 2 интервала выборки, прежде чем его можно будет снова включить.
  • Есть ли лучшие способы (в основном для эффективности алгоритма, но также и для удобочитаемости) реализовать такую ​​проблему?
Я считаю, что один из способов решить эту проблему — создать целочисленную переменную (gen1_onoff) и умножьте все вхождения gen1 на gen1_onoff. Также можно добавить следующее ограничение

Код: Выделить всё

m.Equation(gen1 * gen1_onoff 

Подробнее здесь: [url]https://stackoverflow.com/questions/79042147/handling-on-off-behavior-in-milp-optimization-problems-in-gekko[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Обработка поведения включения/выключения в задачах оптимизации MILP в GEKKO
    Anonymous » » в форуме Python
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Обработка поведения включения/выключения в задачах оптимизации MILP в GEKKO
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Как использовать изображение для ползунка включения-выключения?
    Anonymous » » в форуме CSS
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Обнаружение включения/выключения нажатия клавиши Android
    Anonymous » » в форуме Android
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Кто-нибудь знает целое число ИК-шаблона для кондиционера Daikin (я хочу имитировать сигнал включения/выключения)
    Anonymous » » в форуме JAVA
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»