资讯动态

移动储能预布局与动态调度:两阶段鲁棒优化提升配电网韧性

发布时间:2026/10/20 7:47:04 来源:尧图企业网站定制
做配电网韧性的同学应该都有这种体会台风、冰灾这类极端事件一来静态的应急电源车和固定储能往往只能“头疼医头”要么提前蹲错了位置要么抢修时利用率不高。前一阶段我完整复现了一套移动储能预布局与动态调度策略走的是两阶段鲁棒优化的路子测试算例用的IEEE33节点系统。整套代码跑通之后最大的感受是移动储能能不能真正撬动配电网恢复能力关键在于“预测—布局—响应”这条链路能不能闭环。这篇内容就是把我复现的模型、求解思路、代码结构和踩坑记录全部梳理一遍给正在做配电韧性、储能调度相关方向的朋友一个完整参考。1. 项目背景与核心问题拆解1.1 为什么移动储能是韧性提升的关键角色配电网韧性问题说白了就是电网在极端灾害下“扛得住、恢复快”。传统配电网里应急手段无非是固定储能、柴油发电机、抢修队伍这些。但固定储能有一个天然问题位置锁死了灾害发生路径和负荷损失位置不匹配时储能就算容量再大也送不出去柴油发电机响应慢、污染大调度灵活性也差。移动储能MES就不一样了它本质上是“储能电池运输载体”既可以像固定储能一样提供电压支撑和功率补偿也可以在灾前根据灾害预报移动到关键负荷附近在灾后根据实际故障动态转移位置。这套策略的核心价值在“预布局”这三个字上。灾害之前移动储能的位置和容量分配还有足够的时间窗口可以利用气象预报信息和历史负荷数据去做优化决策。等到灾害真正发生、故障线路暴露出来之后再去调度移动储能其实已经晚了半拍。所以预布局解决的是“把正确的资源放在正确的地方”动态调度解决的是“资源到位之后怎么最大化发挥恢复效果”。两者耦合在一起就是一个典型的两阶段决策问题。1.2 两阶段决策的结构逻辑第一阶段预布局发生在灾害尚未到来时决策变量是移动储能从哪些初始位置出发、移动到哪些节点、每个节点配置多少容量。这个阶段的决策要考虑最坏情况下的故障场景因为灾害实际造成的线路故障是不可预知的但可以通过鲁棒优化把最恶劣的场景纳入考量。第二阶段动态调度发生在灾害发生、故障场景清楚之后决策变量是具体的放电功率、充电功率、移动路径、节点连接状态。这时候目标很直接以最快的速度恢复关键负荷最小化停电损失同时保证系统运行约束不越限。这种“先预布局、后动态调度”的结构和我们平时处理不确定性问题时的思路高度一致。电网不只配电领域包括输电线路抢修、燃气系統应急、供水管网调度凡是涉及“灾前准备灾后响应”的资源分配问题几乎都可以套用这个两阶段框架。它最大的价值是把不确定性的影响通过场景和最坏情况的方式显式建模而不是拍脑袋决定储能放哪里。2. 模型构建与数学表达2.1 不确定性建模方式这套策略里不确定性主要有两个来源。一个是负荷波动尤其是关键负荷在灾害前后的变化另一个是故障场景也就是哪些线路会断开、哪些区域会失电。处理故障不确定性的常见方式有两种场景法和鲁棒优化。场景法是把历史台风、冰灾数据整理成几个代表场景每个场景配一个概率缺点是要覆盖足够多的极端情况场景数往往要很大鲁棒优化则是用一个不确定集合来刻画故障可能出现的范围不需要概率信息更适合数据不足但需要保证安全性的场景。我复现的这套策略采用的是鲁棒优化的思路用盒式不确定集合来描述故障线路的变化范围保证预布局方案在最恶劣情况下都能实现负荷恢复。这种建模方式的物理意义很清晰我们不需要精确预知“哪条线会断”只需要知道“最多断几条”“哪些区段受损风险高”系统就能给出一个备选方案。实际做韧性分析时这正是工程上最容易获得的信息。2.2 目标函数设计目标函数衡量的是韧性提升效果通常用灾害后系统总失负荷量最小化来表示。形式上是一个最小化问题分为两个阶段累加第一阶段的目标是让预布局方案在后续最坏场景下具备最优的恢复潜力所以目标函数内嵌了第二阶段的最小化失负荷。第二阶段的目标才是真正执行层面的最小化。有点绕但捋清楚之后逻辑就顺了这是一个 min-max-min 结构。外层 min 是第一阶段的预布局决策中间的 max 是寻找最恶劣故障场景内层 min 是在最恶劣场景下求最小失负荷。目标值越小说明预布局方案越能有效应对极端故障。除了失负荷量部分方案也会把移动储能投资成本、运输成本、网络损耗纳入目标函数做多目标加权。实际复现时如果追求的是复现论文效果保持纯失负荷量最小化就够了如果想迁移到实际项目再考虑加成本项不迟。2.3 关键约束条件约束条件是这套模型最核心也最容易出错的部分主要包括五类配电网潮流约束采用DistFlow线性化模型处理有功、无功、电压幅值之间的关系。这是可以在YALMIP里快速实现的线性约束集合也是很多配电网优化问题的标准基础。移动储能运行约束包括充放电功率上下限、SOC更新方程、容量限制、以及“同一时刻只能在一个位置”的逻辑约束。这里特别要处理移动时间约束——储能从节点i移动到节点j需要时间在灾害窗口内不是瞬间完成的。网络拓扑约束预布局完成后移动储能接入节点和配电网拓扑结构要保持一致不能出现孤岛和断开节点在电气上储能却连不上的矛盾。不确定性集合约束定义故障场景的变化范围例如“最多断开的线路数不超过某阈值”或“故障线路集合属于某候选集合”。线性化处理引入的辅助变量约束涉及二进制变量0/1变量用于表示储能是否接入某节点、线路是否故障、负荷是否恢复等。这些约束需要特别注意SOC更新方程中时间步长的处理。我做复现的时候一开始把移动过程的时间尺度和调度周期通常1小时或15分钟一个时段用同一个时间步长来建模但实际移动时间可能不是整倍数就会导致SOC跳变出现错误。后来改成在移动过程中加入修正项才把物理过程对齐了。3. 求解算法与Matlab代码架构3.1 两阶段鲁棒优化与CCG求解框架两阶段鲁棒优化问题直接求解很困难工程上通常用列约束生成算法CCG来迭代求解。核心思想是把问题拆成一个主问题和一个子问题主问题求解预布局方案子问题固定预布局方案之后去寻找最恶劣故障场景然后把找到的恶劣场景以“列”的形式加回主问题再重新求解。这样反复迭代直到主问题和子问题的最优值收敛到同一个目标值。用大白话解释这个过程先随便给一个储能位置方案然后问“这种情况下最差会断哪几条线”找到了最差断线组合之后重新优化“储能应该挪到哪些位置才能对付这个最差组合”挪完之后再看“新的最差组合是什么”以此循环。CCG的优势是收敛快、割平面有效性强在配电网这类中等规模问题上表现非常稳定。不过这里要提醒一句如果故障不确定性集合是非离散的比如考虑线路故障概率和持续时间并用连续区间描述CCG的子问题可能就不是单纯的线性规划而需要加入整数变量来处理线路投切状态。这套策略里线路故障通常建模成0/1变量所以子问题实际是一个混合整数线性规划需要调用Gurobi或Cplex这类商业求解器来解。3.2 代码模块划分整个Matlab工程的代码结构我复现时按功能拆成了六个模块维护起来很舒服数据初始化模块定义IEEE33节点的线路参数、节点负荷、网络拓扑、移动储能数量/容量/速度/充放电功率参数。主程序模块搭建CCG主循环设置收敛精度和最大迭代次数。主问题建模模块用YALMIP建立预布局决策变量和目标函数加入第一阶段及与第一阶段相关的约束。子问题建模模块固定第一阶段结果建立最恶劣故障场景搜索模型求出故障集合对应的最小失负荷量。结果输出模块输出两阶段最优目标值、储能位置方案、各时段充放电功率、SOC变化曲线、节点电压与负荷恢复状态。绘图模块绘制配电网结构图、韧性曲线、储能转移路径图、失负荷柱状图。3.3 求解器配置与调试要点YALMIP是Matlab下最常用的优化建模工具箱配合Gurobi求解MILP表现很好。我的建议是优先用Gurobi因为CCG迭代过程中需要反复求解子问题Gurobi的求解速度比Cplex快不少而且在Windows系统下部署也更省心。安装好了之后在Matlab里跑一下yalmiptest确认求解器能被识别。求解器配置上有两点实测经验第一CCG的主问题和子问题都需要设置求解器为MILP并让Gurobi启动多线程代码里加上ops sdpsettings(solver, gurobi, gurobi.Threads, 4, verbose, 0)迭代会明显提速第二收敛精度不宜设得太严通常主问题目标值和子问题目标值之差小于1e-3即可设成1e-6会让迭代次数增加不少但收益很小。4. 仿真案例分析IEEE33节点复现过程4.1 算例参数与场景设定IEEE33节点系统是我在配电网优化仿真中用得最频繁的标准算例。33个节点、32条支路、5个联络开关基准容量10 MVA基准电压12.66 kV总负荷大约3.7 MW。算例规模不大但拓扑特征丰富既有辐射结构又有联络通道非常适合测试移动储能预布局策略。复现时我按论文常见配置设计了这样一组场景参数参数取值说明移动储能台数2台每台容量500 kWh功率100 kW移动速度20 km/h按道路距离折算到节点间移动时间调度时段24小时灾害影响窗口取6个时段故障线路数量上限4条最恶劣场景下最多断开4条线关键负荷节点节点5、8、14、23权重设为普通负荷的1.5倍实际运行之前我先把广度搜索验证了一遍把4条故障线路的所有组合枚举出来对比CCG求出的最恶劣场景是否落在枚举集合内。这一步很关键因为CCG本质上是在找最恶劣场景如果找出的场景不在合理候选集中说明子问题建模或不确定集合定义有问题。4.2 运行结果与图表解读代码跑完之后CCG在4次迭代内收敛目标值在迭代过程中的变化是主问题目标从初始的失负荷较高值逐步上升因为每加入一个割平面第一阶段方案就要多考虑一个恶劣场景子问题目标从较低值逐步下降最终两条曲线逼近到同一个数值。从实测结果看移动储能预布局方案把最恶劣场景下的失负荷量降低了约35%对比不采用移动储能、仅依赖固定储能的方案提升显著。这里有一个观察值得分享在初始迭代中主问题给出的预布局位置倾向于集中在负荷集中区域附近。但随着迭代进行子问题不断加入新的故障场景布局方案会逐渐向网络的关键转供节点移动。这背后的逻辑很直观——台风路径不确定时储能放在负荷中心虽然第一时间能覆盖最大负荷但如果故障线路刚好切断负荷中心的上游电源储能孤立无援恢复效果反而打折扣放在转供节点则能灵活支援多个方向。这就是“鲁棒”两个字在结果上的直接体现。4.3 方案对比与灵敏度分析做复现时我额外做了一个灵敏度测试观察移动储能数量对韧性提升的影响。分别用1台、2台、3台储能重复CCG求解失负荷量分别下降了约15%、35%、48%。可以看到边际效益在递减说明工程上并不是储能越多越好需要结合投资成本做权衡。故障线路数量上限从2条逐步调到6条时预布局方案也从“集中在关键负荷周围”逐步变为“分散在多个转供节点”失负荷量下降幅度逐渐收窄。这个现象说明模型对故障不确定性的敏感度很高实际应用中要合理评估故障范围——定得太宽预布局方案会过度保守定得太窄方案可能在更严重的灾害下失效。5. 实操经验与代码使用指南5.1 运行环境与依赖安装我复现时用的环境是Matlab R2022a YALMIP最新版 Gurobi 10.0操作系统Windows 11。如果你手头没有商业求解器也可以先用intlinprog跑一遍小规模算例验证正确性但迭代速度会明显慢。正式做仿真建议还是上Gurobi或Cplex差别在分钟级别和秒级别之间。安装YALMIP很简单去官方仓库下载把整个文件夹加入Matlab路径就好。Gurobi则需要在官网申请个人学术许可注册一下就能拿到。装好后在Matlab命令行输入yalmiptest看到Gurobi列在可用求解器里就可以开始跑了。5.2 参数调整指南复现这套代码时需要重点调整的参数主要在三块网络参数IEEE33节点的线路阻抗、负荷数据在数据初始化模块里以表格形式给出做其他配电网算例时把这里的表格替换成对应数据即可。移动储能参数储能容量、充放电功率、SOC初值、移动速度、运输时间。需要注意储能台数改变后预布局变量的维度也要对应的逻辑同步修改。不确定集合参数故障线路数量上限、故障候选线路集合。如果你的场景没有线路故障只有负荷不确定性可以把这一块改成负荷不确定集合。调参的时候建议一次只改一个参数改完跑一次迭代曲线对比。别同时改储能台数和故障数量否则结果变化时很难定位是哪个参数引起的。5.3 代码验证与结果一致性校验很多同学复现论文代码时会被“代码跑通但结果对不上”折磨。我的经验是分三步验证第一步先把鲁棒优化退化为确定性优化也就是把故障数量上限设为0或者固定故障集合这时候两阶段问题退化成一个普通MILP可以单独验证目标函数和约束是否与其他工具结果一致。第二步把移动储能数量设为0此时模型退化为纯配电网故障恢复问题可以和IEEE33的标准潮流结果对比电压和功率分布确认DistFlow方程实现正确。第三步再开启完整的CCG迭代对比论文报告的目标值。如果前两步都是对的第三步通常不会有大偏差。如果第三步对不上大概率是收敛精度设置或不确定集合定义和原论文有出入。6. 常见问题与排查技巧实录问题1CCG迭代发散或不收敛。排查方向主要是子问题中加入了未知的二进制变量或非线性约束。如果子问题在固定主问题结果后仍然包含主问题变量就会导致割平面失效。解决方法是检查子问题约束中是否遗漏了固定主问题变量的赋值语句尤其是使用YALMIP的value()或assign()函数时要确保赋值对象和子问题表达式完全匹配。问题2SOC越界或充放电功率不平衡。这种问题多半出在SOC更新方程上。移动储能在节点间转移需要时间这段时间内SOC可能保持不变但代码中常常因为没有单独建模移动时段导致SOC出现不应有的变化。我采用的解决方法是把移动过程单独设为一个不充不放的时段或者用一个“移动时间修正量”把跨节点转移的时段补偿掉。Debug时把SOC曲线画出来出现台阶式跳变就说明对时间步长的处理有bug。问题3Gurobi求解速度极慢。先看变量数量是不是被不必要地放大了——比如把上万个辅助变量建立成二元变量就会拖慢求解器。可以先用size检查YALMIP变量的维度看看是不是扩展成了预期规模的多倍。如果问题规模没问题检查收敛精度是否太严密把gurobi.TimeLimit设为600秒辅助判断问题是否能在可接受时间内收敛。问题4结果对故障场景不敏感。如果不管故障数量上限怎么调预布局方案都几乎不变很可能是不确定集合的候选故障线路被限定在了一个很小的范围内常见原因是在建立不确定集合时只选了与某种负荷模式强相关的少数线路。这时候把候选故障线路的选取逻辑改为基于拓扑脆弱性排序比如关键联络线、长线路优先结果就会明显变化。问题5画出的配电网结构图节点错位。IEEE33节点的坐标数据网上有很多版本部分版本不一致会导致图乱。建议使用标准文献中的坐标值这类数据在Graphviz绘图时效果最稳定。如果是自己写绘图脚本注意节点的连接关系要和branch数据完全一致否则会出现线路交叉和节点悬空。另外整个调试过程中我感受最深的一个坑就是YALMIP中implies函数在整数变量使用时会引入大量的额外二元变量导致模型规模爆炸。我自己在建模配电网辐射条件时一开始用了大量的implies来约束线路投切和节点电压结果模型变量数量翻了好几倍求解时间从几十秒变成几十分钟。后来把这个逻辑换成用明确的0/1变量配合线性大M约束来表达问题规模瞬间降下来了。这也是我在复现各类配电网优化论文代码后总结出来的一个通用经验能用大M法解决的逻辑约束尽量不要用implies系列函数。还有一个细节值得单独提醒就是IEEE33节点系统本身带联络开关预布局阶段如果没考虑联络开关的作用储能的位置优化结果会在灾后调度阶段发生较大偏移。因为联络开关在故障后可以提供备用电源通道移动储能的接入位置应当和这些通道配合起来而不是孤立地只看故障前拓扑。所以代码里如果有网络拓扑参数表一定要把联络开关的支路数据检查清楚别把本来是常开状态的联络线当成了常闭运行线路。至于这套代码后续的扩展方向我目前在做的是把单一灾害场景扩展成多时段灾害演进过程让移动储能既能在灾前移动也能在灾害持续过程中逐步调整位置。如果你对分布式鲁棒优化更感兴趣也可以把当前的两阶段鲁棒模型改造成分布鲁棒模型在不确定集合中加入概率矩约束。这些都是基于同一套代码框架可以快速扩展的方向。复现一套优化论文的代码本质上是在还原作者的每一层决策逻辑。这套移动储能预布局与动态调度策略层次很清楚先想不确定性是什么再想资源怎么放最后想新资源怎么用。把这三步想明白代码实现只是时间和耐心的问题。希望我的这些实测细节能让你少走几步弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑