Я пишу модель оптимизации энергопотребления с помощью Pyomo. В этой модели у меня есть ограничение, которое обновляет уровень заряда накопителя энергии на каждом временном шаге, используя уровень заряда на предыдущем временном шаге (упрощенное уравнение):
Storage_level[t] = Storage_level[t-1] + Charge [t] - Discharge [t]
И есть дополнительное ограничение на начальный период:
Storage_level[1] = 0
Когда я запускаю задачу, я не получаю никакого полезного результата, а в окне вывода просто отображаются границы ограничений, например:
ev_soc_max : Size=24
Key : Lower : Body : Upper
1 : None : None : 0.0
2 : None : None : 0.0
3 : None : None : 0.0
4 : None : None : 0.0
5 : None : None : 0.0
...
и я также получаю эту ошибку для некоторых переменных:
ERROR: evaluating object as numeric value: p_bat_ch[1]
(object: <class 'pyomo.core.base.var._GeneralVarData'>)
No value for uninitialized NumericValue object p_bat_ch[1]
Подозреваю, что проблема связана с определением ограничений хранилища.
Вот как я закодировал это в Pyomo (я пришел к этому результату, объединив разные примеры, которые я нашел здесь и там в Интернете):
def bat_soc_ini_rule(model, t):
if t == 1:
return model.e_bat_t[t] == 0.
else:
return Constraint.Skip
model.bat_soc_ini = Constraint(model.T, rule = bat_soc_ini_rule)
def bat_soc_rule(model, t):
if t >= 2:
return model.e_bat_t[t] == model.eta_bat_cal * model.e_bat_t[t-1] + model.eta_bat_ch * model.p_bat_ch[t] - model.eta_bat_dis**-1 * model.p_bat_dis[t]
else:
return Constraint.Skip
model.bat_soc = Constraint(model.T, rule = bat_soc_rule)
Я также должен заявить, что я объявил набор model.T
с помощью model.T = RangeSet(24)
, а переменные объявлены следующим образом: model.e_bat_t = Var(model.T, within = NonNegativeReals)
И последнее: я использую GLPK в качестве решателя.
Мои вопросы:
Как мне объявить ограничение, которое вызывает предыдущий член набора? Правильно ли я делаю?
Как мне установить ограничение только для части набора (например, для ограничения инициализации)?
Правильно ли я считаю, что ошибка возникает из-за неправильного определения этого ограничения? Если нет, знаете ли вы, откуда могла взяться проблема?
model.pprint()
для распечатки модели и вручную проверить, соответствуют ли выражения ограничений ожидаемым вами. Вы также должны добавить параметрtee=True
к вашему вызовуsolve
, чтобы отобразить выходные данные решателя и проверить наличие там каких-либо проблем. - person Bethany Nicholson   schedule 18.02.2019