微电网中电池调度的约束优化
Posted
技术标签:
【中文标题】微电网中电池调度的约束优化【英文标题】:Constrained Optimization of battery scheduling in microgrid 【发布时间】:2019-11-19 23:29:20 【问题描述】:给定输入值,例如电力消耗、太阳能电池板的发电量、价格(所有在给定时间 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),欢迎提供解决方案。
【问题讨论】:
您在描述问题方面做得非常出色。您尝试过什么解决方法,遇到了什么问题? 好吧,我可以使用强化学习来解决这个问题,但从实际意义上讲,这个问题与安全性和决策证明有关。我正在尝试使用 Scipy/pyomo/pulp 使用线性方法来做到这一点。我知道人们已经使用了 MATLAB 中的 fmincon 函数,并使用了文献中的 Pyomo 库,但我不确定如何实际制定问题以使其适合该公式。真正的问题是电池更新,因为它依赖于之前的“tilmestep”/变量 我没有看到问题。你熟悉lps吗?当存在线性依赖时,链接你的变量,“你的问题”是很自然的。约束看起来与呈现的完全一样。你尝试了什么?您提供的功能还允许以相同的价格出售能量敌人来购买它。不知道你是否想要那个。 我不确定/无法重新表述要在 python 中使用的问题。 LP 中的约束要求不等式或等于零。这里的问题是如何以LP形式写 【参考方案1】:根据我的经验(线性/MIP)优化是此类应用程序的有效方法。在我看来(意见,是的),Pyomo 是一个很棒的工具:
它是用 Python 编写的 整体设计很棒 它具有其他建模语言(AMPL、GAMS...)中最常见的功能 它为大多数求解器提供了简单的界面 维护得很好(查看 Github 页面)文档非常广泛,托管在此处: https://pyomo.readthedocs.io/en/latest/index.html
您可以在此处找到更多材料: https://pyomo.readthedocs.io/en/latest/tutorial_examples.html
另外,this 是对 Pyomo 相当广泛的介绍的链接,它涉及到相当高级的主题,例如随机优化和双层问题。
最后,与您的案例有关的唯一具体问题是,您可能希望将损失应用于电池的充电和放电。提醒一下,为充电和放电定义两个独立变量(它们都是非负的)可能是一个好主意,这样您就可以将电池的能量平衡写成连接能量状态 (SOE) 的约束) 在时间 t
与 SOE 在时间 t+1
。
祝你好运!
【讨论】:
【参考方案2】:您很幸运,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)
【讨论】:
这里有一个有趣的情况。变量 S 不能是倍数(就像您将 L 乘以 2)。出现错误,无法初始化值 Q[0]。您认为这与正在使用的求解器有关吗?似乎无法找到某个最佳点并因此找到解决方案? 是的,这似乎是当问题不可行时它给出的信息。通过增加太阳能发电量并保持m.cons.add(L[t] - S[t] - m.Q[t] >= 0)
约束(即不向电网出口/出售能源),您似乎需要更大的电池才能解决问题。没有给出更具描述性的错误消息令人恼火 - 其他人知道这对于 pyomo 模型是否正常?
因此,最好的克服方法是允许将多余的电力卖回电网。这是我想尝试的模型复杂性的下一步,但我想我会从最基本的案例开始。以上是关于微电网中电池调度的约束优化的主要内容,如果未能解决你的问题,请参考以下文章
优化调度基于matlab改进粒子群算法求解微电网优化调度问题含Matlab源码 052期
微电网优化基于matlab粒子群算法求解微网经济调度和环境友好调度优化问题含Matlab源码 2283期
微电网优化基于matlab粒子群优化算法的微电网调度(光伏储能电动车电网交互)含Matlab源码 2190期
微电网优化基于matlab遗传算法求解微电网经济优化问题含Matlab源码 2062期