ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于多目标退火算法的含P2X综合能源系统优化调度

基于多目标退火算法的含P2X综合能源系统优化调度 1. 从“风光弃电”说起为什么要做含P2X的综合能源系统调度做综合能源系统优化调度有一段时间的人应该都体会过那种“看着弃风弃光数据心疼”的感觉。尤其北方地区冬季供暖期风电大发时段和负荷低谷重叠弃风率经常能冲到两位数。单纯靠电储能、抽水蓄能这些手段只能平抑短时波动遇到长时间、大体量的富余电力传统储能的“肚子”根本装不下。P2XPower-to-X就是为解决这类问题出现的思路——把富余电力转化为其他形式的能源或物质X可以是氢Power-to-Hydrogen、天然气Power-to-Gas、热Power-to-Heat、甚至化工原料Power-to-Chemicals。在综合能源系统里引入P2X环节相当于给电网装了一个“可调节的胃口”用电低谷时把电转化成气、热、氢储存起来用电高峰或气热短缺时再释放出来实现多能源品种之间的时空转移。不过P2X引入之后调度问题的复杂度会明显上升。原来只需要盯着电负荷平衡现在要同时协调电、气、热三种甚至更多能源网络的供需还要考虑P2X设备在不同运行模式下的效率差异、转换成本、碳排放约束。这时候常规的单目标优化已经很难满足实际需要——电网公司关心运行成本用户关心供能可靠性政府层面关心碳排放指标几个目标之间经常是“按下葫芦浮起瓢”的关系。我这次用多目标退火算法来求解这个问题核心原因有两个一是退火算法本身有很强的全局搜索能力不容易陷入局部最优二是多目标框架能一次性给出一组帕累托前沿解让决策者根据实际偏好选方案而不是被迫接受某个单目标的“最优”。下面把整个建模和代码实现的过程拆开细讲。2. 问题建模调度模型里到底装了什么2.1 系统架构与设备组成先明确一下我的综合能源系统长什么样。为了贴近实际工程场景参考了一个典型园区级综合能源系统的结构风电、光伏作为可再生能源主力燃气轮机作为可控发电单元燃气锅炉负责供热电储能锂电池做短时调节P2X部分我选了Power-to-Hydrogen路线包含电解槽、储氢罐和氢燃料电池三个环节。这里要特别说明选Power-to-Hydrogen而不选Power-to-Gas的原因电转氢的能效链更短电解水制氢的效率可以做到60%到75%后续氢燃料电池发电效率也有50%左右整体往返效率比电转甲烷Power-to-Methane高出一截。而且氢能本身就是当前的热点方向未来可以通过氢能汽车、氢能工业等场景消纳扩展性好。模型里各类设备的连接关系是风电、光伏优先上网供给电负荷富余电力根据电价信号决定是进电储能还是进电解槽燃气轮机和氢燃料电池在风光出力不足时补充发电热负荷由燃气锅炉和余热回收共同承担燃气轮机发电时的余热也计入供热氢储能负责跨时段转移能量低谷期制氢存储高峰期放氢发电。2.2 目标函数成本、碳排放与能源利用率的博弈目标函数是整个调度模型的核心我设置了三个维度第一个目标是系统运行总成本最小化。包括购电成本、燃气轮机燃料成本、燃气锅炉燃料成本、设备启停成本、运维成本再扣除向电网售电的收入。这里有个容易忽略的细节P2X设备的启停成本不可小觑电解槽频繁启停会造成膜电极损耗我在模型里加了启停惩罚项避免优化结果中出现不切实际的频繁开关。第二个目标是碳排放总量最小化。碳排放来源主要是外购电力的上游排放和燃气轮机、燃气锅炉燃烧天然气的直接排放。外购电力碳排放系数按所在区域电网的平均排放因子取值我这里取的0.581 kg/kWh对应全国统一电网排放因子的常见取值。第三个目标我这里选了系统一次能源利用率最大化。严格说这是求最大但算法框架里统一转成求最小——用1减去系统输出总能量与输入一次能源总量的比值等价于最小化能量损失率。这样三个目标统一为最小化形式便于在退火算法的框架里统一处理。这里想提醒一点目标选几个、选哪些没有绝对标准。有的文献会考虑用户满意度、削峰填谷效果、设备寿命损耗等指标但目标数量越多帕累托前沿的可视化和决策难度越大。三个目标是我认为比较平衡的选择既有经济性、环保性又有系统能效维度适合作为研究框架的基底。2.3 约束条件等式约束与不等式约束优化调度问题的约束条件分两大类。等式约束主要是能量平衡方程。电功率平衡要求风电、光伏、燃气轮机、氢燃料电池、储能放电、购电之和等于电负荷加上储能充电、电解槽用电、售电之和热功率平衡要求燃气锅炉供热、燃气轮机余热、储热如果有供热之和等于热负荷氢平衡涉及电解槽产氢、储氢罐储放和燃料电池耗氢之间的数量关系。每个时段的平衡方程都要严格满足这部分是硬约束不满足直接淘汰方案。不等式约束则覆盖各类设备的运行边界发电设备出力上下限、爬坡约束储能设备的荷电状态SOC上下限、充放电功率限制以及充放电状态互斥储氢罐压力上下限和储氢量变化率限制联络线传输功率上限。特别要强调P2X设备的运行约束——电解槽制氢功率不能超过额定功率并且存在最小技术出力限制因为电解槽在低负载区间运行效率下降明显极端情况下会出现“产氢不如停机”的倒挂现象。另外我加了一个系统备用约束要求旋转备用容量不低于系统最大单机容量或总负荷的固定比例这就是保障运行安全性的关键——调度不能只算经济账关键时刻没有备用容量支撑再省钱的方案也没法落地。3. 多目标退火算法原理和设计要点3.1 从物理退火到调度优化模拟退火Simulated Annealing是研究优化问题绕不开的经典算法。它借用了金属退火过程的物理图像金属加热到高温后内部原子处于高能无序状态缓慢降温过程中原子逐渐趋于低能有序排列最终形成稳定的晶体结构。映射到优化领域算法的核心就两点状态空间和温度管理。当前解对应某种调度方案目标函数值对应系统能量算法通过“接受劣质解”的概率来跳出局部最优——温度高时接受较差解的概率大相当于原子在高温下剧烈运动随着温度降低接受劣质解的概率逐步缩小算法逐渐收敛到稳定区域。如果面对的是单目标问题直接套用经典退火流程就好。但我们的问题有三个目标如何定义“劣质解”就需要改动。常见的做法是把多目标通过加权求和转成单目标再退火缺点是权重不好定而且一次运行只能得到一个解必须跑很多次不同权重才能近似帕累托前沿效率不高。我采用的方案是结合帕累托支配关系的退火算法框架一次运行就能输出一组帕累托解集。简单说当生成新解时判断新解相对当前解是否支配——如果新解支配当前解直接接受如果互不支配则以一定概率接受保留解的多样性如果新解被支配则以随温度变化的概率接受跳出局部最优。3.2 算法流程的具体实现我在Matlab里实现的整体流程大致分七步第一步读取系统参数和预测数据。包括各时段的风电、光伏出力预测、电负荷预测、热负荷预测、电网分时电价和天然气价格。第二步初始化种群。随机生成一组满足所有约束的初始调度方案用外部存档External Archive保存当前找到的非支配解。第三步设定初始温度。我这里的初温设为100衰减系数取0.9最大迭代次数400次每个温度下执行200次内循环。第四步邻域搜索。在当前解的基础上随机选择一台设备在其出力允许范围内微调该时段出力值生成新解。如果调整后的调度方案违反约束直接弃用并重新搜索到最大尝试次数后再降温。第五步多目标评价。计算新解的三个目标函数值更新外部存档保证存档中的解都是互不支配的。第六步Metropolis准则判别。依据温度控制的接受概率判断是否用新解替换当前解。第七步降温并判断终止条件。达到最大迭代次数或连续多轮存档无更新就停止输出存档里的帕累托解集。3.3 为什么选退火而不是遗传算法或粒子群这里说点个人体会。综合能源系统调度问题是非线性、多约束、多目标的混合整数规划问题遗传算法GA和粒子群算法PSO也是常用选项。我第一次测试时三种算法都试过GA在处理离散变量设备启停状态时表现不错但在精细搜索阶段容易震荡PSO收敛快但早熟现象明显跑出来解多样性不足。退火算法胜在两点一是它的接受机制天然适合多目标框架下的exploration-exploitation平衡温度参数可以直接控制帕累托前沿分布的均匀程度二是它对非线性约束的处理更灵活邻域微调时可以逐项检查约束不像GA那样需要大量修补不可行解。当然退火也有短板——计算时间偏长。我的案例是24小时调度以1小时为步长决策变量维度96储能功率24维加电解槽功率24维加燃气轮机出力24维加锅炉出力24维再加若干状态变量单次运行在MATLAB里大概要跑两分多钟。如果时间尺度细化到15分钟决策变量翻四倍计算量增长远不止四倍这个要有心理预期。4. Matlab代码实现核心模块逐段拆解4.1 顶层框架主函数怎么组织Matlab实现这类问题第一优先级不是算法炫技而是模块划分清晰。我的主函数按“参数初始化—负荷数据接入—算法主循环—结果输出”四段组织。主循环部分我会调用一个核心函数simulated_annealing_multiobjective传入参数包括系统结构体sys_param、负荷预测数据结构体load_data、算法超参结构体algo_param。经过迭代计算输出帕累托解集pareto_set和对应目标函数值pareto_obj。每个调度方案我用一个结构体schedule表示字段包括各时段储能充放电功率p_sto、电解槽输入电功率p_p2x、储氢罐储氢量h_storage、氢燃料电池出力p_fc、燃气轮机出力p_gt、燃气锅炉热出力h_gb、联络线购售电功率p_grid以及从这些功率推算出来的设备启停状态。这么做的好处是调试阶段可以直观看到每个设备在每个时段的具体出力不需要反复索引大矩阵。4.2 邻域搜索的Matlab实现细节邻域搜索是整个算法能不能找到高质量解的关键环节。我的实现分三层第一层随机选设备。用randperm从设备列表中随机选一台需要调整的设备。第二层随机选时段。对选中的设备在其允许范围内随机选一个连续时段区间区间长度按当前温度控制——温度高时区间长全局探索温度低时区间短局部精调。第三层生成调整量。在设备出力上下限内生成一个服从正态分布的扰动量扰动幅度随温度衰减。比如燃气轮机当前第t时段出力是1000 kW温度T时扰动量为normrnd(0, 0.1 * (P_max-P_min) * T / T0)温度越低扰动范围越小。但这里有个很关键的坑直接生成扰动大概率会违反各种耦合约束。储能就是一个典型——充放电功率改了SOC上下限可能立刻越界。我的处理办法是写了一个check_constraints(updated_schedule)函数每次扰动后立即校验所有约束。如果不满足就先做一个贪心修复把越界的功率值拉回允许范围再看能量平衡方程是否满足如果修复不了就丢弃这个新解重新扰动。4.3 多目标评价与帕累托存档更新目标函数计算封装在evaluate_objectives(schedule)中返回三个值cost_total、carbon_total、energy_loss_rate。帕累托存档更新是算法中的重要环节每次计算出新解的三个目标值都要和存档里的所有解比较支配关系。如果新解被任何存档解支配丢弃如果新解能支配存档里的个别解则删除这些被支配解并加入新解如果互不支配直接加入存档。实现上有个小技巧给存档设置容量上限比如200。当存档超过上限时采用Crowding Distance拥挤距离策略删掉密度最高的解。这样保证帕累托前沿分布均匀不会出现一堆解挤在某个目标维度附近的情况。拥挤距离的计算在MATLAB里写起来很顺手按每个目标维度排序首尾解距离设Inf中间解取相邻解在该目标维度上差的绝对值之和归一化。4.4 约束处理的编码技巧调度问题的约束处理直接决定解的合法性和质量。我的经验是能解析表达的都写成解析式能预处理的预处理效率能差出好几倍。先说储能SOC的约束处理。SOC是一个“记忆性”变量当前时段状态依赖上一时段所以不能只检查当前SOC是否在[0.1, 0.9]区间内还要检查整个时间序列的连续性。我写了一个函数从第一个时段开始顺序计算每个时段的SOC一旦越界立即返回违规标志。这个函数会被邻域搜索调用多次必须轻量高效用向量化写法替代for循环尤为重要。再说P2X设备的运行约束。电解槽有一个明显特点是启动过程的功率爬坡有速率限制不能从零直接跳到满负荷。我在模型中给电解槽设置了最大爬坡速率等于额定功率的20%每小时。这个约束用前面的贪心修复不太好修需要在扰动生成时就限定调整范围——每次调整电解槽出力时先根据当前时段功率计算允许的上下界再在这个允许区间里随机扰动。这种“先约束后搜索”的做法比“先搜索后校验”效率高很多。最后是旋转备用约束。这类约束不直接对应某个设备而是系统级约束——要求各时段可用发电容量之和减去当前出力不小于备用要求。在目标函数里我加了一个罚函数项来弱化处理因为严格把这个约束作为硬约束会让邻域搜索的成功率大幅下降罚函数能保持搜索空间连通性。罚系数随温度升高而增大优化后期自动保证解满足备用约束。5. 实验设置与结果分析从帕累托前沿到决策建议5.1 典型日场景与参数设定为了展示方法效果我构造了春夏秋冬四个典型日场景。这里以冬季典型日为例详细说明风电出力夜间大白天小光伏出力集中在中午电负荷呈现“早晚双高峰”热负荷全天较高且夜间达到峰值——正好是P2X发挥价值的典型场景。冬季典型日24小时的风电、光伏出力预测曲线按比例缩放到系统装机容量范围内风电装机3000 kW光伏装机1500 kW电负荷峰值约4000 kW热负荷峰值约2500 kW。分时电价参考一般工商业电价峰段8:00-11:0018:00-23:000.9元/kWh平段0.6元/kWh谷段23:00-7:000.35元/kWh。燃气轮机额定功率2000 kW效率40%天然气价格2.8元/立方米热值按9.7 kWh/立方米计算。电解槽额定功率1000 kW效率68%储氢罐容量200 kg氢燃料电池额定功率500 kW发电效率50%。电储能容量2000 kWh最大充放电功率500 kW。5.2 帕累托前沿分布解读算法运行结束后输出三目标帕累托前沿。虽然三维图在后处理时不太方便展示但可以按两两目标组合投影观察。我这里以运行成本与碳排放为横纵轴观察前沿整体呈单调递减的曲线关系越往右下角成本越低、碳排放越高。靠近左上角的方案通常是燃气轮机满发、减少外购电力的方案碳排放低但天然气成本高靠近右下角的方案则更多依赖谷段购电和电解槽消纳风电成本低但外购电力隐含碳排放高。有意思的是前沿中段出现了一个“拐点”——在这个范围内再增加少量成本碳排放能显著下降过了拐点后继续增加成本换来的碳减排效果边际递减。这个拐点对实际决策非常重要如果企业或园区在意碳排放指标同时控制预算决策者应该选择拐点附近的折中方案而不是直接选碳排放最低的极端解。5.3 P2X设备对调度结果的影响分析为了验证P2X的引入价值我做了三组对比实验不含P2X、含电转氢但无氢燃料电池、含完整P2X电解槽加氢燃料电池。对比结果显示完整P2X场景的系统运行成本比不含P2X场景降低约7.8%碳排放降低约12.3%。主要原因是电解槽在夜间谷时段大量消纳低价风电制取的氢气在傍晚负荷高峰时段通过燃料电池发电替代了一部分高电价时段的外购电和天然气发电。一个更直观的数据是这样的冬季典型日中电解槽夜间23:00-7:00平均制氢功率约780 kW8小时内累计制氢约15.6 kg这15.6 kg氢在傍晚高峰时段通过燃料电池发电约260 kWh按照峰电价计算仅这部分替代就能省下约230元电费扣除电解槽运维和制氢设备损耗成本后仍有明显正收益。不过也要意识到P2X设备本身的投资成本较高如果在模型中加入年化投资成本结论可能会变化——这取决于设备利用小时数和寿命周期。所以在实际项目中P2X容量的优化配置是一个上游决策问题调度优化是在给定容量下做运行策略优化两者衔接时要注意边界条件的一致性。6. 实操中的问题排查与调试经验6.1 常见报错与解决方案速查表写Matlab代码求解这类复杂优化问题调试时间往往比写代码时间还长。我把常见问题整理成一张速查表方便遇到同样坑的人快速定位。异常现象可能原因排查方法初始解生成就报约束不满足初始随机生成时忽略耦合约束改用“先充能后调度”的方式生成初始解目标函数值出现NaN或Inf部分设备出力为0时成本计算公式除零在成本计算中加极小量eps帕累托前沿解数量极少温度衰减过快算法提前收敛降低衰减系数增加内循环次数储能SOC时间序列异常波动SOC更新公式方向写反或单位不一致打印SOC序列波形分段检查电量平衡算法收敛但跳出局部最优能力不足邻域扰动范围太小温度下降过快增大初温或加大扰动幅度系数氢能质量平衡不满足电解槽产氢量单位与储氢罐容量单位不统一统一用kg建立转换函数进行单位换算计算时间过长外部存档每轮全量比较复杂度太高定期裁剪存档或用支配关系快速判定函数6.2 代码调试的小技巧分享一个很实际的调试经验把目标函数计算单独抽出来写成独立的纯函数不依赖任何全局变量然后用yalmip或其他已知结果验证目标函数正确性。或者直接用一组简单的输入数据手工计算目标值和程序输出对照。目标函数一旦算错后面整个优化都是白跑。第二个经验是可视化调试。我用Matlab的plot和area函数把每个时段的设备出力、SOC曲线、储氢量曲线叠加绘制在同一张图里一眼就能看出能量平衡是否满足、P2X设备是否在工作区间的合理范围内。这种“先看图、再查数”的调试方式比盯着矩阵数据高效太多。第三个经验是定式测试先用一个非常简单的场景比如2个时段、2台设备跑通整个流程确认代码逻辑正确后再扩展到24小时复杂场景。别一上来就跑完整的算例报错信息会在庞大的代码栈里藏得你找不到北。6.3 算法参数整定的个人建议退火算法的参数整定没有一个“万能配方”但有一些经验范围可以参考初温T0一般取目标函数值平均幅度的1到3倍衰减系数取0.85到0.95温度越低衰减幅度越要小每个温度下的迭代次数可以取变量维度的1到3倍终温可以设初温的1%左右。我这里给的参数组合——初温100、衰减系数0.9、内循环200次、最大迭代400轮——在我这个尺度的问题上表现不错。但如果你换了更大的系统比如接入更多设备或者时间粒度更细参数需要重新整定。一个简单方法是先跑几组不同参数对比帕累托前沿的覆盖度和分布均匀性肉眼判断差异后再微调。7. 扩展方向从研究代码到工程应用目前这个Matlab实现可以作为研究的起点但距离真正的工程应用还有一段路要走。一个方向是加入不确定性因素。我当前的模型假设风电、光伏出力和负荷预测是确定值实际运行中这些参数都有明显的不确定性。可以考虑用鲁棒优化或场景随机规划处理退火算法框架也可以改造为两阶段——先确定设备启停计划再根据不确定性实现优化调整运行功率。另一个方向是设备模型细化。电解槽的效率不是常数和运行温度、电流密度密切相关氢燃料电池的低负荷运行时效率衰减更显著。如果把这些非线性特性拟合成分段线性函数放进模型求解结果会更有工程指导价值。再有一个方向是多园区协同。一个园区单独配置P2X设备可能利用率不够高如果多个邻近园区共享一套电解槽和储氢设施整体经济性会显著改善。这种情况下优化问题从单一系统调度变成多主体协同调度目标函数还需要考虑利益分配机制复杂度会上升一个级别。我用Matlab做这个项目前后折腾了两个多月最大的体感是算法本身不是最难的难点在于把工程问题抽象成数学模型的建模过程——目标选哪些、约束怎么简化、哪些细节可以忽略、哪些细节必须保留这些判断直接决定结果的实际意义。写这篇博文也是把中间踩过的坑和验证过的经验整理出来希望后来的人能少走弯路。当前版本代码在中小规模算例上表现稳定直接换数据就能跑如果有需要后续我也可以把一些关键模块的扩展思路单独写一篇。
返回列表