尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

配电网韧性提升的MPS预配置:建模、Matlab实现与算例验证

配电网韧性提升的MPS预配置:建模、Matlab实现与算例验证 去年我们课题组复现了一篇SCI一区关于配电网韧性提升的文章核心是移动应急电源MPS的预配置和动态调度。当时最大的感受是论文里一张张精美的韧性提升曲线背后模型构建和代码实现的细节远比想象中复杂。尤其是第一阶段“MPS预配置”看似只是一个选址问题实际上要同时处理不确定场景生成、时序约束和混合整数规划的求解效率稍不留神就会陷入维度灾难或者结果不收敛的泥潭。这篇博文先写“上篇”聚焦MPS预配置部分从问题建模、场景处理、Matlab代码实现到算例验证完整梳理一遍我们的复现思路。配电网韧性提升是个系统工程预配置是“未雨绸缪”的第一环也是后续动态调度的基础这部分搞不通后面动态调度跑起来也没有意义。文章会包含可直接参考的代码框架和关键参数设置适合正在做电力系统韧性、移动储能调度、应急电源规划方向研究的学生和工程师。1. 为什么要做MPS预配置大停电之后的“最后一公里”救援1.1 极端天气下配电网的脆弱性配电网是整个电力系统中直接面向用户的最后一环也是极端天气下最容易出问题的一环。一场台风过境可能造成多条馈线同时跳闸变电站被迫停运大量负荷长时间失电。输电网往往有冗余通道和多级保护但配电网多为辐射状结构抗灾能力天然薄弱。传统配电网规划考虑的是N-1安全准则也就是单一元件故障下的可靠性但极端灾害往往是N-k故障多条线路同时受损常规手段根本防不住。韧性这个概念被引入电力系统就是用来描述系统在面对小概率、高影响的极端事件时抵御、吸收、适应和快速恢复的能力。和可靠性不同韧性更强调“极端场景下的生存与恢复”。学术界常用的量化方式是韧性曲线也就是系统性能随时间变化的曲线曲线与时间轴围成的面积越小说明系统在灾害中的性能损失越小、恢复越快。1.2 移动应急电源的定位从灾后调度到灾前预置移动应急电源英文一般叫Mobile Power Source或者Mobile Energy Storage System可以是移动储能车、应急发电车也可以是临时接入的柴发机组。这类设备最大的特点是“腿长”——可以灵活移动到故障区域临时接入配电网节点为关键负荷供电。但这里有个现实问题灾害发生时道路可能被倒伏树木阻断移动电源车想从驻地开到目的地可能根本过不去。即便道路畅通从接到调度指令到完成接线、并网供电也要几个小时。这段时间里医院、通信基站、供水系统这些关键负荷都处于失电状态。所以“预配置”的意义就凸显出来了在灾害预警发布后、灾害实际影响之前就把移动应急电源提前部署到预测的故障区域附近。这相当于在“最后一公里”提前放下了救援力量。等灾害真正造成停电时MPS已经在现场附近待命可以迅速接入大幅缩短停电时间。这就是MPS预配置的核心价值也是本篇文章所复现论文的上半部分。1.3 复现论文解决的问题边界需要明确的是预配置解决的是“灾前在哪里放”的问题而动态调度解决的是“灾后往哪里去、供多少电”的问题。这两者存在时序上的递进关系预配置阶段Pre-positioning在灾害事件发生前基于预测信息决定MPS的初始部署位置同时考虑预算限制、候选点容量约束等。动态调度阶段Dynamic Dispatching在灾害发生后根据实际故障情况实时调度MPS在不同节点间移动决定各时段的供电策略。上篇只讨论预配置。但预配置的决策结果会直接影响动态调度的可行空间所以在建模时必须把后续调度的预期收益考虑进来而不是简单地做一个静态选址。这个“前瞻性”是MPS预配置建模的关键也是我们复现时踩坑最多的地方。2. 预配置模型的数学拆解目标函数和约束到底在优化什么2.1 目标函数投资成本与预期失负荷成本的权衡MPS预配置本质上是一个带随机性的选址优化问题。目标函数要回答一个问题在预算有限的情况下MPS放在哪里能让灾害后的总损失最小损失包含两部分一部分是预配置本身的成本包括MPS的调用成本、运输到预置点的成本、预置点的场地占用成本等另一部分是灾害发生后由于MPS位置不理想或者数量不足导致部分负荷无法恢复供电而产生的失负荷惩罚费用。论文中常见的目标函数形式如下[ \min \quad \sum_{p \in P} C_p^{pre} \cdot x_p \sum_{\omega \in \Omega} \pi_\omega \cdot Q(\omega) ]其中( x_p ) 是0-1决策变量表示是否在候选点 ( p ) 预配置MPS( C_p^{pre} ) 是在候选点 ( p ) 预配置MPS的成本( \omega ) 表示一个随机故障场景( \pi_\omega ) 是该场景发生的概率( Q(\omega) ) 是在场景 ( \omega ) 下预配置方案投入后后续调度阶段的最优失负荷成本。( Q(\omega) ) 不是简单的常数它本身是一个优化问题的解对应的是灾后MPS动态调度的最优结果。也就是说预配置决策必须“向前看”评估它在每个故障场景下的后续表现。这就是典型的两阶段随机规划第一阶段在不确定事件发生前做决策第二阶段在事件发生后做调整。在Matlab实现时如果场景数量不多比如几十个可以直接把每个场景的调度变量显式写出构建一个大规模混合整数线性规划一并求解。但场景数量一旦上升到几百上千模型规模就会膨胀到难以求解这时候需要用到后文讲的场景削减或者分解算法。2.2 场景生成如何用蒙特卡洛模拟构建故障场景集MPS预配置的前提是知道灾害大概会造成哪些线路故障、故障持续多久。这是典型的随机不确定性建模问题常用的做法是蒙特卡洛模拟。具体做法分为几个步骤根据历史气象数据建立线路故障概率模型。通常用正态分布或者韦布尔分布描述风速再用风速与线路故障率的关联函数计算出每条线路在台风场景下的故障概率。对每条线路按故障概率进行随机抽样确定该场景下哪些线路故障生成一个故障场景。对故障持续时间进行抽样得到每个场景的停电时长。重复上述过程成百上千次得到大量样本场景。如果场景量太大用同步回代消除法或K-means聚类对场景进行削减得到有代表性的少量场景和对应的概率权重。这里有一个容易被忽视的点故障场景不仅要包含“哪些线路断了”还要包含“断多久”。因为MPS的动态调度是时变的持续1小时的停电和持续8小时的停电最优调度策略完全不同。我们在最初的复现中只考虑了故障线路集合导致预配置总是倾向于把所有MPS堆在负荷密度最高的区域忽略了长时间故障下需要轮换供电的问题后来把故障持续时间加入场景才得到合理的结果。2.3 约束条件预算、可达性、时序耦合预配置模型的约束需要覆盖以下几个方面预算约束预配置的MPS数量不能超过可用资源总数。这个约束把经济性直接落到决策变量上[ \sum_{p \in P} x_p \leq N_{max} ]候选点约束每个候选点最多预配置一台MPS尤其考虑到移动储能车的场地需求和安全距离要求。如果需要支持多台需要引入整数变量表示数量而非0-1变量。负荷恢复约束每个节点的恢复功率不能超过该节点的实际负荷需求同时要考虑配电线路的传输容量限制。时序耦合约束MPS接入节点后其电量水平随着供电过程消耗需要通过移动储能车的充放电模型表达。这在预配置模型里通常简化为第二阶段调度问题的内部约束但必须预留这部分接口。可达性约束预配置点必须在MPS从其驻地出发、在灾害影响到达之前可达的范围内。这部分可以用距离或行驶时间阈值约束也可以进一步考虑道路因灾受损的不确定性不过多数论文出于简化会忽略道路不确定性。上述约束中时序耦合约束是建模中最容易出问题的。因为预配置决策一旦做出MPS在后续调度中的初始位置就被固定了这个“固定”关系需要通过约束表达出来调度模型中的MPS初始位置变量必须等于预配置决策变量。如果这个约束漏了预配置和调度就成了两个互不相干的问题结果自然没有意义。3. Matlab实现的关键设计YALMIP建模与求解器配置3.1 为什么选YALMIPGUROBI而不是手写求解器MPS预配置问题最终要交给整数规划求解器处理。我们用的是YALMIPGUROBI的组合。YALMIP是Matlab环境下的一个免费建模工具箱可以非常简洁地描述优化问题然后交给背后的商业求解器求解GUROBI是目前整数规划领域公认性能最强的求解器之一对于中等规模的混合整数线性规划完全可以胜任。为什么不手写求解算法这个我多说一句。很多刚接触优化的同学容易陷入“自己实现分支定界或Benders分解”的误区。实际科研场景下除非你是在研究算法本身否则完全没有必要自己造轮子。YALMIP的建模效率极高一个几十行的模型YALMIP十几行就能描述清楚而且不容易出错。GUROBI内置了剪枝、启发式、割平面等大量优化技术求解性能远超手写实现。把精力花在问题本身的建模和结果分析上才是做复现和科研的正确姿势。对于GUROBI获取需要注意商业用途需要购买授权但学术用户可以在官网申请免费的学术LicenseGurobi对研究人员非常友好基本秒批。如果没有License也可以先用CBC求解器顶替它和YALMIP无缝对接虽然求解速度慢一些但小规模算例完全够用。3.2 变量定义与约束的代码实现用YALMIP描述MPS预配置模型核心代码框架如下% 基础数据:候选预配置点、服务节点关系、场景概率 n_pre 5; % 候选预配置点数量 n_scene 50; % 故障场景数量 N_max 3; % 最多预配置3台MPS C_pre [100, 120, 90, 110, 95]; % 各候选点预配置成本(万元) pi_omega ones(n_scene,1) / n_scene; % 各场景概率,这里简化为等概率 % 决策变量:是否在候选点p预配置MPS MPS_pre binvar(n_pre, 1, full); % 目标函数中投资成本部分 investment_cost C_pre * MPS_pre; % 预算约束:预配置数量限制 Constraints [Constraints, sum(MPS_pre) N_max]; % 目标函数为投资成本 期望失负荷成本 % 其中期望失负荷成本预留在后续场景循环中累加 objective investment_cost;这里有个细节需要注意YALMIP的binvar定义的是二进制变量括号里第三个参数full表示所有变量都是二进制的如果不加这个参数YALMIP默认单个变量定义。在定义向量变量时建议显式加上full否则可能出现变量维度不对齐的报错。3.3 场景循环与第二阶段调度的代码实现预配置决策和场景内的调度决策是耦合的。在数学上二阶段随机规划可以写成一个大KKT系统统一求解但在YALMIP里更简洁的做法是循环每个场景把每个场景的调度变量和目标函数逐步累加进去。% 对每个场景构造调度子问题 for w 1:n_scene % 该场景下的故障线路集合,由场景数据给出 failed_lines scene_data{w}.failed_lines; % 该场景下的负荷功率需求 load_demand scene_data{w}.load; % 该场景下的调度决策变量 % P_out(w,t): 场景w下t时刻MPS输出功率 % v_dispatch(w,t): 0-1变量,是否在t时刻接入节点i P_out sdpvar(n_pre, T, full); v_dispatch binvar(n_pre, n_node, full); % 第二阶段的约束:功率平衡、MPS电量连续性、供电路径约束等 for t 1:T % MPS输出功率不超过额定容量 Constraints [Constraints, P_out(:,t) 0, P_out(:,t) R_mps .* sum(v_dispatch,2)]; % 负荷恢复约束:每个节点恢复的功率不超过负荷需求 load_recovery model_power_flow(failed_lines, P_out(:,t), v_dispatch(:,:,t)); Constraints [Constraints, load_recovery load_demand]; end % 场景w下失负荷成本 lost_load_cost penalty * sum(sum(load_demand - load_recovery)); % 累加到目标函数 objective objective pi_omega(w) * lost_load_cost; end % 求解 ops sdpsettings(solver, gurobi, verbose, 2); optimize(Constraints, objective, ops);这里我特意省略了潮流计算的细节因为配电网MPS接入下的潮流约束需要用DistFlow或者线性化DistFlow描述比较复杂。实际复现时我们用的是线性化DistFlow模型也就是把支路潮流方程中的二次项在基准运行点处线性化转化为线性约束。这样整体模型仍然是一个MILPGUROBI可以稳定求解。3.4 场景削减几十个还是几千个场景蒙特卡洛模拟生成的原始场景动辄几千个如果全部塞进模型求解规模会指数级膨胀。学术论文里常用同步回代消除法Simultaneous Backward Reduction来削减场景。它的思路是在原始场景集中反复剔除那些对概率分布特征影响最小的场景直到剩下指定数量的代表场景。Matlab里可以用场景削减工具箱也可以自己写一个简单的实现。核心步骤如下计算所有场景之间的Kantorovich距离矩阵实际中常用欧氏距离替代。找到与其它场景距离之和最小的场景将其删除。将被删除场景的概率累加到与之距离最近的保留场景上。重复直到场景数量达到目标值。我们的实验表明原始2000个场景削减到50个左右预配置方案的误差可以控制在5%以内。再继续增加场景数量对预配置结果几乎没有改变只会线性增加求解时间。所以50个场景是个性价比很高的折中。4. IEEE 33节点算例测试从结果反推模型合理性4.1 算例参数设置模型写完之后必须用标准算例验证正确性。我们用的是经典的IEEE 33节点配电网系统。这个系统包含33个节点、32条支路基准电压12.66kV总负荷约3.7MW是配电网研究里最常用的测试系统。MPS参数设置如下参数数值说明MPS额定容量500 kW单台移动储能车输出功率上限MPS储电量2000 kWh满充状态下的可用电量MPS数量上限3 台预算约束下的可调用总数候选预配置点节点8、13、22、25、30分布在负荷中心和关键支路附近失负荷惩罚费用重要负荷1000 $/kWh普通负荷100 $/kWh体现关键负荷的优先级故障线路数量3 ~ 5条模拟台风导致的多重故障生成场景时我们假设每条线路的故障概率为0.1故障持续时间在2至8小时之间均匀分布。总共生成2000个原始场景削减到50个代表性场景。4.2 预配置方案解读模型求解后得到的预配置方案是节点8、13、25各放置1台MPS。这个结果从工程角度看是有意义的节点8位于馈线首端附近靠近关键负荷区域且作为上游节点可以向更多下游节点供电节点13处于馈线中部连接着多个分支负荷是一个枢纽节点节点25靠近系统的末端区域这条馈线相对独立一旦上游故障末端负荷很容易被完全隔离所以在末端预先布置一台MPS非常合理。这个方案体现了预配置的本质逻辑不是把MPS都堆在负荷最大的节点而是综合考虑节点在整个网络拓扑中的位置、故障隔离后的可达范围、以及下游关键负荷的价值。有些节点负荷很大但如果它靠近变电站市电恢复时间短预配置的边际效益反而低有些节点负荷不大但处在网络末端一旦隔离就完全失去供电预配置的价值反而更高。4.3 韧性提升效果对比为了验证预配置的有效性我们对比了三种方案无MPS预配置灾害后只能等待电网抢修恢复静态部署所有MPS放在负荷最大的节点优化预配置使用本文模型得到的预置点。结果对比如下指标无预配置静态部署优化预配置平均失负荷量(MWh)12.368.525.87重要负荷失电时间(h)6.84.22.5韧性提升比例—31.1%52.5%可以看到优化预配置相比简单的静态部署韧性提升效果几乎翻倍。这个差异就来自于预配置决策对不同场景的自适应性——静态部署只考虑了正常状态下的负荷分布而优化预配置把每种故障场景下的恢复效果都纳入了目标函数。4.4 场景数量敏感性分析我们还做了场景数量的敏感性分析主要想回答“到底需要多少个场景才够”。分别测试了10、20、30、50、100、200个场景的情况。结果显示场景数少于20时预配置方案波动很大偶尔会把MPS放到一个在更多场景下表现平庸的位置场景数达到30以后预配置方案趋于稳定50个场景与200个场景的预配置方案完全一致目标函数值差异不到3%。这个结论告诉我们在复现这类论文时场景削减不是越精细越好够用就行。过度追求场景精度只会增加求解负担对最终决策没有本质改变。5. 复现过程中容易踩的坑和我的调参经验5.1 YALMIP建模时的维度陷阱YALMIP的语法非常灵活但灵活带来的代价是维度错误很难排查。我们遇到的最典型的问题是把一个 ( n \times 1 ) 的列向量和一个 ( 1 \times n ) 的行向量做运算Matlab的broadcast机制在某些情况下不会报错而是自动广播成矩阵导致约束矩阵维度突然膨胀求解时间从几秒变成几小时甚至内存溢出。建议的排查方法是每次写完约束用size(Constraints)检查约束的数量用size(MPS_pre)检查变量的维度。调试阶段可以把每个约束单独注释掉对比求解结果快速定位是哪一行约束引入了问题。5.2 求解器参数对求解时间的影响GUROBI虽然强但默认参数未必适合所有的配电网模型。我们在求解过程中发现两个参数值得特别关注一是MIP Gap容忍度MIPGap。默认值通常是1e-4对于科研复现来说过于严格。预配置问题的目标是给出决策方案而不是精确计算成本把MIP Gap放宽到1e-2求解时间可以从几小时降到几分钟预配置方案几乎不变。二是求解的时间限制TimeLimit。在测试不同场景数量时如果求解时间超过预设上限GUROBI会返回当前最优整数解。这在探索性实验中非常有用先快速得到一个可行解确认模型没写错再逐步收紧Gap。ops sdpsettings(solver, gurobi, ... gurobi.MIPGap, 0.01, ... gurobi.TimeLimit, 600, ... verbose, 2);5.3 负荷权重不一致导致的结果畸形这是我们在复现中遇到的最隐蔽的数据问题。配电系统里各节点的负荷类型不同重要性也不同。如果直接把所有失负荷量乘以同一个惩罚系数模型不会区分医院和普通居民负荷这在韧性研究里是不可接受的。正确做法是给不同节点设置不同的失负荷惩罚系数。比如医院、通信基站这类重要负荷的上千美元每千瓦时普通居民负荷可能只有几十美元。实际建模时要形成一个惩罚系数向量节点与节点之间可以差一个数量级。这个细节决定了预配置方案会不会向重要负荷倾斜同时也直接影响目标函数值的物理意义。5.4 与动态调度下篇的衔接思路预配置模型跑通之后下一步就是动态调度。衔接时需要注意一个关键的接口问题预配置决策变量 ( x_p ) 的值要作为动态调度模型的参数传入。具体来说预配置方案确定了哪些候选点有MPS待命动态调度模型中MPS的初始位置集合就是这个预配置集合动态调度决策的是灾害发生后这些MPS从预配置点移动到哪个节点、在什么时间接入、输出多少功率。在代码实现层面可以设计一个主函数先调用预配置函数得到MPS_pre再把它作为参数传给动态调度函数。两个阶段共享一套场景数据、一套网络参数只是变量的时间尺度和决策逻辑不同。这样模块化的设计也方便后续把模型扩展到考虑移动时间、道路不确定性等更复杂的场景。5.5 一个值得留意的经验先跑小算例再上全模型最后分享一个我们从失败中得来的经验。最开始复现的时候我们直接上了IEEE 33节点全模型然后发现求解时间异常地长调试起来非常痛苦因为根本分不清是模型写错了还是求解器性能不够。后来学乖了先在一个手工搭的6节点小系统上把模型逻辑完全调通确认预配置结果符合直觉再搬到33节点系统上。小系统上的求解时间只有几秒调试效率高得多。等大系统跑出结果后再和小系统的结论进行对比如果两个系统上的方案逻辑一致基本就能确认模型没有结构性错误。这种“由小到大”的调试策略对于任何优化问题的复现都适用。科学复现的第一步永远是让代码在最小规模上完全正确而不是在最大规模上勉强跑通。MPS预配置是配电网韧性提升的第一步也是最容易被轻视的一步。很多人在做韧性研究时注意力天然被吸引到灾后动态调度的“精彩操作”上却忽略了灾前预置的决策质量决定了后续调度效果的天花板。预配置方案如果不可靠调度模型再精巧也只能在错误的初始条件下做局部优化。这轮预配置模型跑通之后接下来就可以进入动态调度部分的设计了。动态调度会遇到更多细节问题MPS的移动时间建模、充放电时序约束、多台MPS之间的协调以及如何从确定性调度走向更贴近实际的两阶段鲁棒优化。这些内容我们放到“下篇”继续展开。
返回列表