给出诸如电力消耗,太阳能电池板的发电量,价格(在给定时间t内全部)的输入,我们有一个电池,并且我们想评估它在任何给定时间应该(放电)/充电多少。 问题可以表述为:
Pt = price of electricity at time t
Lt = consumption of electricity at time t
Zt = charge of battery at time t (how much is in the battery)
St = Electricity generated from solar generator at time t
Qt = amount the battery (dis)/charges at time t
我们正在尝试优化的功能是
Ct = Pt *(Lt - St - Qt)
这旨在最大程度地减少购电量
受以下约束:
Lt - St - Qt >= 0 (our demand has to be non-negative)
Qmin <= Qt <= Qmax ( the battery can only (dis)/charge between certain values at any given time)
Zmin <= Zt <= Zmax. (the battery has to be within its capacity, i.e. you can't discharge more than the battery holders, and you can charge more than the battery can hold)
Zt+1 = Zt + Qt+1 ( this means that the battery level at the next time step is equal to the battery level at the previous time step plus the amount that was (dis)/charged from the battery)
问题我有如何用python(Scipy)公式化的问题,尤其是更新电池电量。
我知道其他图书馆(Pyomo,Pulp)也存在,欢迎提出解决方案。
答案 0 :(得分:1)
以我的经验(线性/ MIP),优化是此类应用程序的有效方法。在我看来(是的),Pyomo是一个很棒的工具:
该文档非常详尽,位于以下位置: https://pyomo.readthedocs.io/en/latest/index.html
您可以在此处找到更多材料: https://pyomo.readthedocs.io/en/latest/tutorial_examples.html
此外,this是对Pyomo的大量介绍的链接,该文章涉及诸如随机优化和双层问题之类的高级主题。
最后,与您的案子有关的唯一特定问题是您可能希望对电池的充电和放电造成损失。请注意,定义两个独立的充电和放电变量(两个均为非负变量)可能是一个好主意,以便您可以将电池的能量平衡写为链接能量状态(SOE)的约束。 )(时间t
的SOE)。
祝你好运!
答案 1 :(得分:1)
您很幸运,Giorgio回答了我学习pyomo的动机(我主要使用PULP),因此将您的问题作为确保我理解所有界面的机会。我将其发布在这里,以便以后自己再次找到它:
import pyomo.environ as pyomo
import numpy as np
# create model
m = pyomo.ConcreteModel()
# Problem DATA
T = 24
Zmin = 0.0
Zmax = 2.0
Qmin = -1.0
Qmax = 1.0
# Generate prices, solar output and load signals
np.random.seed(42)
P = np.random.rand(T)*5.0
S = np.random.rand(T)
L = np.random.rand(T)*2.0
# Indexes
times = range(T)
times_plus_1 = range(T+1)
# Decisions variables
m.Q = pyomo.Var(times, domain=pyomo.Reals)
m.Z = pyomo.Var(times_plus_1, domain=pyomo.NonNegativeReals)
# objective
cost = sum(P[t]*(L[t] - S[t] - m.Q[t]) for t in times)
m.cost = pyomo.Objective(expr = cost, sense=pyomo.minimize)
# constraints
m.cons = pyomo.ConstraintList()
m.cons.add(m.Z[0] == 0.5*(Zmin + Zmax))
for t in times:
m.cons.add(pyomo.inequality(Qmin, m.Q[t], Qmax))
m.cons.add(pyomo.inequality(Zmin, m.Z[t], Zmax))
m.cons.add(m.Z[t+1] == m.Z[t] - m.Q[t])
m.cons.add(L[t] - S[t] - m.Q[t] >= 0)
# solve
solver = pyomo.SolverFactory('cbc')
solver.solve(m)
# display results
print("Total cost =", m.cost(), ".")
for v in m.component_objects(pyomo.Var, active=True):
print ("Variable component object",v)
print ("Type of component object: ", str(type(v))[1:-1]) # Stripping <> for nbconvert
varobject = getattr(m, str(v))
print ("Type of object accessed via getattr: ", str(type(varobject))[1:-1])
for index in varobject:
print (" ", index, varobject[index].value)