江油网站制作,服务平台型网站,有限公司注册资金,小程序公司排名前十pymgrid是一个开源Python库#xff0c;用于模拟微型电网的三级控制#xff0c;允许用户创建或自行选择的微电网。并可以使用自定义的算法或pymgrid中包含的控制算法之一来控制这些微电网#xff08;基于规则的控制和模型预测控制#xff09;。
pymgrid还提供了与OpenAI Gy…pymgrid是一个开源Python库用于模拟微型电网的三级控制允许用户创建或自行选择的微电网。并可以使用自定义的算法或pymgrid中包含的控制算法之一来控制这些微电网基于规则的控制和模型预测控制。
pymgrid还提供了与OpenAI Gym API相对应的环境提供了连续和离散动作空间环境与强化学习算法一起使用以训练控制算法。
pymgrid试图提供简单、直观的API让用户能够专注于他们的特定应用程序。
1. 用于人工智能研究的开源的Python微电网模拟器pymgrid
微电网是能够与主电网断开连接的独立电网在通过减少二氧化碳排放来缓解气候变化和通过提高基础设施弹性来适应气候变化方面都具有潜力。由于其分布性质微电网往往是独特的因此对这些系统的控制是不平凡的。虽然存在微电网模拟器但许多模拟器的范围和可模拟的微电网种类有限。我们提出了pymgrid这是一个开源Python包用于生成和模拟大量微电网也是第一个可以生成600多种不同微电网的开源工具。pymgrid抽象了大部分领域专业知识允许用户专注于控制算法。特别是pymgrid是一个强化学习RL平台它包括将微电网建模为马尔可夫决策过程的能力。pymgrid还引入了两个预先计算的微电网列表旨在允许微电网设置中的研究再现性。
1.1. pymgrid概述
pymgrid由三个主要组件组成包含用于“种子”微电网的负载和光伏产生时间序列的数据文件夹名为MicrogridGenerator的微电网生成器类以及名为Microgrid的微电网模拟器类。
1.1.1. 数据集
为了方便地生成微电网pymgrid提供了负荷和光伏发电数据集。负荷数据来自于DOE OpenEI基于TMY3天气数据光伏数据也基于TMY3由DOE/NREL/ALLIANCE提供。这些数据集包含了五个城市的负荷和光伏文件每个城市处于美国不同的气候区域时间序列为一年时间步长为一小时共8760个数据点。
1.1.2. Microgrid
该类包含一个微电网的完整实现包括时间序列数据和一个微电网的具体规模。Microgrid实现了三类函数控制循环、两个基准算法和实用函数。
需要使用一些函数来与Microgrid对象交互。函数run()用于前进一个时间步长它以控制字典为参数并返回微电网的更新状态。控制字典集中了需要传递给微电网的所有电力指令以在每个时间步骤中操作每个发电设备。一旦微电网到达数据的最后一个时间步骤其done参数将传递为True。函数reset()可用于将微电网重置为其初始状态清空跟踪数据结构并重置时间步长。一旦将控制操作应用于微电网它将通过检查函数来确保命令符合微电网约束条件。
对于强化学习基准和更普遍的机器学习另一个额外的函数是有用的train_test_split()允许用户将数据集分为两个部分即训练集和测试集。用户还可以使用reset()从训练集转到测试集在reset函数中使用testing True参数。列表中提供了一个示例。
1.1.3. MicrogridGenerator类
MicrogridGenerator包含生成微电网列表的功能。对于每个请求的微电网过程如下。首先随机生成负荷的最大功率。然后随机选择一个负荷文件并将其缩放到先前生成的值。下一步是自动随机选择微电网的架构。光伏和电池始终存在这可能会随着我们添加更多组件而发展 - 我们随机选择是否有柴油发电机genset、电网、没有电网或弱电网频繁停电的并网系统。在弱电网的情况下我们还实施备用发电机如果有电网或弱电网则随机选择电费。电力费率是由MicrogridGenerator生成的基于加州和法国的商业费率。
选择了体系结构之后需要对微电网进行尺寸调整。首先需要计算光伏穿透率由Hoke等人[2012]定义为负荷最大功率/光伏最大功率并使用该值随机缩放所选的光伏曲线。生成的电网尺寸保证大于最大负荷发电设备提供足够的功率满足峰值负载需求。最后电池能够在平均负载下提供三至五个小时的电能。
一旦选择并调整了不同的组件MicrogridGenerator将创建一个Microgrid对象。重复此过程以生成用户请求的多个微电网。
总体而言使用五个负荷文件、五个光伏文件、两个电费、三种电网类型和二元发电机选择该模型可以生成600多种不同的微电网-甚至没有考虑可能的不同光伏穿透率水平的数量。
1.2. 基准和讨论
除了上述功能我们还提出了两个标准微电网列表pymgrid10和pymgrid25分别包含10个和25个微电网。 pymgrid10被设计为供初学者使用的第一个数据集。它包含10个具有相同架构光伏电池发电机的微电网主要旨在获得有关仿真情况的直观感受。在pymgrid25中可以找到所有可能的架构超过25个微电网。其中有四个微电网只有发电机三个带有发电机和电网九个只有电网九个带有发电机和弱电网。由于我们提出这些微电网集合作为标准化测试集因此我们还实现了一套控制算法作为基准比较。具体而言我们实现了四种算法基于规则的控制、模型预测控制MPC、Q学习和决策树DT增强的Q学习。通过检查结果我们发现MPC具有完美预测时可以视为几乎最优而RBC可以视为下限因为它给出了简单算法可达到的性能。 正如上表所看到的算法的性能差异非常大。Q学习表现不佳然而增强了决策树的Q学习的表现优于RBC——RBC的平均成本约比DT增强Q学习高出44——而大部分差异发生在边缘情况其中RBC的表现较差因为缺乏算法复杂性。虽然增强决策树的Q学习可能表现良好但其必须使用离散的行动空间这个需求会减少Q学习器能够学习的行动范围并且很难确保在任何给定的离散行动空间中考虑到所有可能的行动。在6个微电网中RBC的表现优于增强决策树的Q学习这表明DT Q学习可能无法始终超过可接受的性能下限。这个问题通常出现在只有电网或带有电网和发电机组的微电网中。
虽然增强决策树的Q学习和MPC之间的差异经常看起来微不足道但需要记住的是这25个微电网的负载达到兆瓦级别因此13的差异可以带来4000万美元的额外成本。为了应对气候变化并集成更多可再生能源这项技术需要扩大规模超过部署的系统数千个。提高控制器性能的几个百分点可能会大大减少运营成本从而增加改进控制器性能的重要性。强化学习是实现这个目标的一种有前途的解决方案。
1.3. 结论和未来工作
pymgrid是一个Python软件包允许研究人员生成和模拟大量微电网并提供应用于强化学习研究的环境。我们为算法比较和可重复性建立了标准微电网场景并使用经典控制算法和强化学习提供了性能基线。为了改进基于强化学习的微电网控制器具有普适性和适应性的基准模拟器至关重要而pymgrid正是扮演这个角色的。一个有前途的新途径是利用从多个微电网生成的数据来增加性能或适应性。
未来计划包括增加更广泛的基准算法套件包括最新的强化学习方法。我们还计划允许增加其他微电网组件、更复杂的应用场景和更精细的时间分辨率。此外我们希望增加实时数据获取的功能。最后关于二氧化碳使用和数据的功能对于用户控制碳效率非常有价值同时也允许用户考虑碳税在未来能源发电中可能扮演的角色。
2. 安装pymgrid
pip安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pymgrid安装要求与依赖
python3.6安装依赖包 pandas, numpy, cvxpy, statsmodels, matplotlib, plotly, cufflinks, gym, tqdm, pyyaml
下载源码安装 https://github.com/Total-RD/pymgrid.git
# 进入pymgrid工程根目录下
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple .3. 快速开始
定义一个简单的微电网创建控制它的操作并读取结果。微电网可以通过定义一组模块然后将它们传递给微网格构造函数来定义也可以通过YAML配置文件来定义。
3.1. 定义微电网
定义微电网的一些组件。我们将定义两个电池一个快速充电容量为100千瓦时另一个慢充但容量为1000千瓦时。
import numpy as np
import pandas as pd
np.random.seed(0)
from pymgrid import Microgrid
from pymgrid.modules import (BatteryModule,LoadModule,RenewableModule,GridModule)small_battery BatteryModule(min_capacity10,max_capacity100,max_charge50,max_discharge50,efficiency0.9,init_soc0.2)large_battery BatteryModule(min_capacity10,max_capacity1000,max_charge10,max_discharge10,efficiency0.7,init_soc0.2)随机数据定义负载和光伏pv模块例如以小时为单位定义90天的太阳能发电数据。
load_ts 100100*np.random.rand(24*90) # random load data in the range [100, 200].
pv_ts 200*np.random.rand(24*90) # random pv data in the range [0, 200].load LoadModule(time_seriesload_ts)
pv RenewableModule(time_seriespv_ts)最后我们定义了一个外部电网来填补任何能源缺口。电网时间序列必须包含三列或四列。前三个表示电网购电价、上网电价和每千瓦时二氧化碳产量。如果存在第四列则表示电网状态以布尔形式如果没有则假定网格始终处于启动和运行状态。
grid_ts [0.2, 0.1, 0.5] * np.ones((24*90, 3))grid GridModule(max_import100,max_export100,time_seriesgrid_ts)基于上述数据构造微电网并使用’pv’定义光伏发电。默认情况下会添加一个平衡模块来跟踪任何未满足的需求或过剩的生产。可以通过unbalanced_energy_moduleFalse来禁用但不建议这样做
打印输出微电网将告诉我们微电网中包含的模块。
modules [small_battery,large_battery,(pv, pv),load,grid]microgrid Microgrid(modules)
print(microgrid)输出
Microgrid([load x 1, pv x 1, balancing x 1, battery x 2, grid x 1])我们可以通过名称或关键字key访问微电网中的模块
print(microgrid.modules.pv)
print(microgrid.modules.grid is microgrid.modules[grid])3.2. 控制微电网
您必须通过每个可控模块的动作来控制微电网。固定模块存储在属性microgrid.controlleble中
microgrid.controllable{battery: [BatteryModule(min_capacity10, max_capacity100, max_charge50, max_discharge50, efficiency0.9, battery_cost_cycle0.0, battery_transition_modelNone, init_chargeNone, init_soc0.2, initial_step0, raise_errorsFalse), BatteryModule(min_capacity10, max_capacity1000, max_charge10, max_discharge10, efficiency0.7, battery_cost_cycle0.0, battery_transition_modelNone, init_chargeNone, init_soc0.2, initial_step0, raise_errorsFalse)],grid: [GridModule(max_import100, max_export100)]}我们的“负载”、“电池”和“电网”模块是固定的。
我们还可以通过从微电网获得空动作来查看我们需要传递动作的模块。在这里必须替换所有None值才能将此操作作为控制传递。
print(microgrid.get_empty_action())重置微电网然后检查其当前状态。
microgrid.reset()
microgrid.state_series()随机运行一步。
microgrid.run(microgrid.sample_action())
microgrid.current_step
# 查看一步后的状态
# microgrid.state_series()我们将尝试使用可用的可再生能源然后对电池进行放电以满足169.646919的负载需求。对于电池我们将尝试产生较低的超额负载和最大产量。
load -1.0 * microgrid.modules.load.item().current_load
pv microgrid.modules.pv.item().current_renewablenet_load load pv # negative if load demand exceeds pvif net_load 0:net_load 0.0battery_0_discharge min(-1*net_load, microgrid.modules.battery[0].max_production)
net_load battery_0_dischargebattery_1_discharge min(-1*net_load, microgrid.modules.battery[1].max_production)
net_load battery_1_dischargegrid_import min(-1*net_load, microgrid.modules.grid.item().max_production)control {battery : [battery_0_discharge, battery_1_discharge],grid: [grid_import]}
control{battery: [13.68159573726988, 7.0], grid: [83.6066548705889]}把这些放在一起我们可以控制。
注意正值表示进入微电网的电量负值表示离开微电网的能源。
然后我们可以用这种控制来运行微电网。由于此控件未进行归一化因此我们传递normalizedFalse。
obs, reward, done, info microgrid.run(control, normalizedFalse)3.3. 分析结果
将控制传递给微电网后可以通过查看微电网或任何模块的日志来查看结果。微电网日志中的每一项操作都有一行。动作例如满足的负载量和状态例如当前负载都有值。
请注意状态值是采取操作之前的状态值。
这些列是一个pd.MultiIndex有三个级别模块名称、模块名称枚举例如我们所在的每个模块名称的编号和属性。例如由于有一个加载它的所有日志条目都将在关键字“加载”0下可用。由于有两个电池因此将同时有电池0和电池1。
microgrid.log.loc[:, pd.IndexSlice[load, 0, :]]microgrid.log.loc[:, pd.IndexSlice[pv, 0, :]]microgrid.log.loc[:, battery]3.4. 绘制结果
我们还可以利用pandas绘图功能来查看结果。为了说明这一点我们将用随机采样的动作使微电网再运行24步。
for _ in range(24):microgrid.run(microgrid.sample_action(strict_boundTrue))microgrid.log[[(load, 0, load_met),(pv, 0, renewable_used),(balancing, 0, loss_load),(grid, 0, grid_import),(battery,0,charge_amount),(battery,1,charge_amount)]].droplevel(axis1, level1).plot()3.5. 微电网日志数据表
microgrid.log展开查看电网“grid”数据
microgrid.log[[(grid)]]4. API概述
4.1. 微电网
Microgrid类用于定义和模拟具有各种模块的环境。
方法
方法名称说明Microgrid.run(control[, normalized])运行微电网一步。Microgrid.reset()重置微电网并清除日志Microgrid.sample_action([strict_bound, …])在微电网的动作空间内获得随机动作。Microgrid.get_log([as_frame, drop_singleton_key])收集微电网的控制和响应日志。Microgrid.get_forecast_horizon()获取微电网中包含的时间序列模块的预测范围。Microgrid.get_empty_action([sample_flex_modules])在没有设置值的情况下对微电网进行操作。
Serialization/IO/Conversion——序列化/IO/转换
名称说明Microgrid.load(stream)从yaml缓冲区加载微电网。Microgrid.dump([stream])将微电网保存到YAML缓冲区。Microgrid.from_nonmodular(nonmodular)从旧式老版本NonModularMicrogrid转换为Microgrid。Microgrid.from_scenario([microgrid_number])加载一个pymgrid25基准微电网。Microgrid.to_nonmodular()将Microgrid转换为旧式NonModularMicrogrid。
4.2. 模块
pymgrid.modules.GridModule一种电网模块。 默认情况下GridModule是一个固定模块它可以通过GridModule.as_flex转换为flex模块。GridModule是唯一一个既可以是固定模块又可以是柔性模块的内置模块。
pymgrid.modules.RenewableModule可再生能源模块。 可再生能源的经典例子是光伏和风力涡轮机。
pymgrid.modules.BatteryModule一个电池模块。 电池模块是固定的当调用Microgrid.run时您必须通过电池控制。 如果您定义了battery_transition_model那么如果您计划序列化您的电池模块或包含电池的任何微电网那么它必须是YAML可序列化的。 例如您可以将其定义为一个具有__call__方法的类并将yaml.YAMLObject定义为其元类。有关详细信息请参阅PyYAML文档。 pymgrid.modules.GensetModule发电机组/发电机模块。 该模块是一个可控源模块当用作微电网中的模块时必须向其发送发电生产请求。
pymgrid.modules.UnbalancedEnergyMod
4.3. 预测
Forecasting可用于时间序列预测的类以及允许用户定义自己的预测者的类。
get_forecaster()获取时间序列模块的预测函数。
4.4. 强化学习RL环境
使用OpenAI Gym API进行强化学习的环境类。
Discrete
具有离散动作空间的环境。
DiscreteMicrogridEnv(modules[, …])
一种离散的环境将优先级列表作为微电网上的操作来实现。
Continuous
具有连续动作空间的环境。
ContinuousMicrogridEnv(modules[, …])
具有连续动作空间的微网格环境。
4.5. 控制算法
pymgrid中内置的控制算法以及可以部署的外部算法的引用
基于规则的控制
通过优先级列表部署模块的启发式算法。
RuleBasedControl(microgrid[, priority_list, …])
在微电网上运行基于规则的启发式控制算法。
模型预测控制
依赖于未来预测以及状态转换模型来确定最佳控制的算法。
ModelPredictiveControl(microgrid[, solver])
在微电网上运行模型预测控制算法。
强化学习
将微电网视为马尔可夫过程的算法并通过与环境的重复交互来训练黑箱策略。有关使用强化学习来训练此类算法的示例请参见后续文章。
参考原文 pymgrid documentation Gonzague Henri (Total). pymgrid: An Open-Source Python Microgrid Simulator for Applied Artificial Intelligence Research (Papers Track). Neurips 2020