资讯动态

配电网韧性提升之MPS预配置:建模要点与Matlab实现全解析

发布时间:2026/10/22 16:26:25 来源:尧图企业网站定制
前阵子把一篇配电网韧性方向的一区论文的代码完整跑通了趁热把整个过程整理成一篇笔记。这篇文章的核心围绕应急移动电源MPS的两个紧密衔接的阶段展开灾前预配置和灾后动态调度。这次先聚焦上篇也就是最关键的MPS预配置部分——极端天气还没真正形成破坏之前手头那几台移动储能车到底该放到哪几个节点、每个节点放几台才能在灾害发生后把关键负荷的停电损失降到最低。这个问题听起来就是一个“选址定容”问题但真正动手建模才发现坑不少要考虑故障场景的不确定性、要考虑MPS从预配置点到供应点的移动距离还要为后续的动态调度留好接口。这篇文章适合正在做电力系统韧性、应急供电优化方向研究的研究生或者拿到代码想自己调参换算例验证的工程师参考。我尽量把从原理论证到Matlab实现中间那些文档里看不到的细节都写出来包括怎么处理两层变量耦合、怎么给求解器写目标函数、又踩了哪些数据量纲的坑。如果你想复现这类工作这篇笔记应该能帮你少走不少弯路。1. 项目整体拆解什么是配电网韧性为什么先做MPS预配置1.1 韧性与传统可靠性的本质差异配电网“韧性”这个词近几年在电力系统文献里出现频率越来越高但很多人还是一上来就跟传统可靠性混在一起。可靠性关心的是日常运行状态下系统有多大概率发生故障、平均停电多久对应的指标是SAIFI、SAIDI那一套。韧性关心的是另一件事当极端事件台风、冰灾、暴雨导致大面积多重故障的时候系统能不能扛得住、能不能快速恢复以及恢复过程有没有策略性。一个比较直观的类比是可靠性像日常体检查的是你平时身体有没有小毛病韧性像抗洪演练试的是大灾面前你能不能活下来并把重要功能维持住。这两个目标在数学刻画上差别很大可靠性常用概率期望韧性则更关注极端场景下的最坏表现。所以做韧性优化时目标函数里经常出现“worst-case”这类的min-max结构而不是简单的期望值最小化。配电网韧性提升的手段里MPSMobile Power Source即移动应急电源是这几年研究热度很高的一个方向。这里的MPS可以是移动储能车也可以是应急发电车。MPS最大的特点是“移动”意味着它可以在灾前把自己部署到相对安全且靠近关键负荷的位置灾后再根据实际断线情况灵活调整接入点这种灵活性是固定储能装置给不了的。而正因为MPS可以在时间和空间两个维度上进行调度对应的优化问题就会比传统的储能选址问题复杂一个量级。1.2 MPS预配置在整个恢复框架中的定位在典型的韧性提升两阶段框架里第一阶段叫pre-positioning也就是预配置第二阶段叫dispatch也就是动态调度。预配置发生在灾前通常是在气象预警发布之后、实际故障发生之前那段时间窗内。此时系统还没有断线但我们已经有了一定的预测信息比如台风的预测路径、可能的故障范围。决策者需要基于这些信息把手头有限的MPS放到最有利的节点上。这里有个容易被忽视的点预配置决策是“在不确定环境下做出的”。我们不知道哪些线路真的会断只能根据概率或场景估计。这就让问题天然带上了随机优化或者鲁棒优化的色彩。如果把所有场景都简化为一个最可能的确定性场景得到的预配置方案可能在真实故障场景到来时效果很差甚至完全失效。动态调度则是灾后决策此时故障场景已经部分或全部暴露我们可以根据实际断线信息指挥MPS从一个节点移动到另一个节点甚至规划移动路径和接入时序。上篇的预配置阶段必须为这个阶段提供好的“初始条件”因为MPS灾后不可能瞬间出现在任何位置从预配置点到实际接入点的移动时间直接决定了恢复速度。2. 数学模型与目标函数拆解预配置问题的三层结构2.1 预配置问题的决策变量与约束拆解先说清楚预配置阶段具体要决定什么。在最常见的模型里第一阶段决策变量通常是一组二值变量或整数变量x(i) 1表示在节点i预配置了MPSx(i) 0表示不在该节点配置。如果需要区分配置数量也可以用整数变量p(i)表示节点i处配置的MPS台数。这一类变量本质上回答的是“选哪些位置、各放几台”的选址定容问题。约束条件方面第一层是资源约束。MPS的总数是有限的比如整个配网片区一共只有5台可用那么所有节点配置数量之和不能超过5。如果每台MPS的租赁或采购成本不同还要加上成本预算约束目标函数中也会体现配置成本项。第二层是候选位置约束并非所有节点都适合放MPS。部分节点可能在灾害中同样面临断线风险部分节点周边道路不可达这些节点需要从候选集中剔除或引入逻辑约束。第三层是容量约束每个节点的MPS接入容量受配变和线路容量限制并不是想放几台就放几台。这一阶段如果单独建模其实只是一个相对简单的确定性问题。但预配置的难点在于它必须跟第二阶段联动。第二阶段要解决的问题是给定预配置方案故障场景发生后MPS怎么移动、怎么接入、系统怎么运行才能最大程度保住关键负荷。第二阶段的结果反过来会决定第一阶段方案的好坏因此预配置问题的完整模型不可能只写第一阶段那几个约束就完事。2.2 目标函数与最坏场景的刻画目标函数的写法决定了整个优化问题的性质。韧性提升研究里最常用的目标函数是“系统总失负荷量最小化”有些文献还会对重要负荷加权医院、数据中心、应急指挥中心这些关键用户优先级更高权重系数更大。综合来看预配置问题的典型目标函数可以写成minimize 第一阶段配置成本 灾后运行阶段的最坏情况失负荷惩罚这个“灾后运行阶段的最坏情况”正是鲁棒优化的核心。用一个min-max结构来表达外层min是第一阶段决策内层max是在不确定集合内选择最坏故障场景再内层min是在给定场景下做动态调度和最优潮流决策。这整套结构在文献中常被称为两阶段或三阶段鲁棒优化模型如果写成数学规划就是min-max-min结构。实际建模里不确定性集合不会简单枚举所有组合场景而是用一组约束来刻画。常见做法是定义元件故障的概率区间和“不确定性预算”B。预算B的含义是我们允许场景中包含最多B条故障线路这样既避免了枚举指数级场景组合又保留了不确定性集合的高维表达能力。B越大决策者越是悲观考虑的最坏情况越严重得到的预配置方案越保守B越小模型越乐观方案越经济但风险也越高。2.3 从非线性到混合整数线性规划的转换预配置加动态调度的完整模型直接写出来会包含非线性约束最典型的就是引入0-1变量后出现的变量乘积项。比如MPS是否在节点i接入、接入后是否向节点j负荷供电这两个0-1变量相乘就会出现非线性。求解器处理非线性的手段非常有限所以常规思路是把模型转化为MILP混合整数线性规划然后交给现成的商业求解器去解。线性化的手段主要有两种。第一种是Big-M法引入一个足够大的常数M把逻辑关系“若y1则某个约束生效”转化为线性不等式比如a ≤ b M(1-y)这种形式。第二种是McCormick包络专门处理两个连续变量或0-1变量乘积的线性松弛。在配网MPS问题里Big-M用的更多因为大部分非线性来自逻辑判断而不是连续变量乘积。这里特别提醒一点Big-M里的M取值非常讲究。M太小会错误地剪掉可行解导致模型不可行M太大又会让线性松弛变差求解器分支定界性能骤降甚至出现数值病态问题。规范做法是M取该约束物理含义上变量的上界而不是随意拍一个10000。比如线路容量约束中M可以取线路容量值再加一个裕量这样既不影响正确性又尽量紧。3. Matlab实现要点与代码架构从数学到可运行代码3.1 算例系统与基础数据准备复现这类工作第一步是搭一个能跑的测试系统。我用的算例是经典的33节点放射状配电网线路参数、负荷数据在很多开源代码库和教材里都有现成版本直接把节点数n33、线路数m32的拓扑数据读进来就行。这个系统规模不大MILP求解压力适中非常适合验证预配置模型。然后是故障场景的准备。这一步不需要真实的台风历史数据可以通过构造故障区域和随机抽样来生成场景集合。常用做法是先设定一个受灾中心区域离中心越近的线路故障概率越高然后基于这个概率分布随机生成若干故障场景每个场景记录哪些线路断线、对应的是哪组节点失电。场景数量从几十到几百不等数量越多模型越精确但计算时间也线性增长。候选预配置节点集合的选取可以基于两个原则一是负荷重要性高的节点优先二是考虑MPS停放位置的可达性和安全性。实际操作中可以先在所有节点里用逻辑筛选剔除联络开关处、配变容量极小的节点再人工检查一遍。下面是我整理的一份数据准备清单数据类别具体内容数据格式拓扑数据线路首末端节点编号、电阻电抗n×4矩阵负荷数据各节点有功无功负荷、用户重要度权重n×3矩阵线路参数容量上限、故障概率分布m×3矩阵MPS参数台数、单台容量、单位移动成本标量/向量场景数据场景序号、故障线路集合结构体/数组这里容易踩的坑是量纲不统一。我遇到过有人把负荷单位写成MW线路阻抗却用的标幺值系统最后潮流约束完全对不上。建议全部统一到标幺制基准功率取1 MVA或10 MVA算完结果再折算回有名值能省很多排查问题的时间。3.2 核心约束的编程映射模型翻译成Matlab代码最顺手的工具是YALMIP建模工具箱配合Gurobi求解器。YALMIP的优势在于你可以用接近数学表达式的语法写约束比如 binvar 定义0-1变量sdpvar 定义连续变量然后直接写约束和目标函数它负责把模型自动转成求解器能吃的标准形式。MPS预配置部分的变量定义和关键约束如下% 定义第一阶段决策变量节点是否预配置MPS x binvar(nb, 1, full); % 定义第二阶段相关变量示意节点负荷削减量 alpha sdpvar(ns, nb, full); % 预配置资源约束MPS总台数限制 cons [cons, sum(x) N_mps]; % 候选节点约束只允许在特定节点配置 cons [cons, x(candidate_nodes) 1]; % 强制配置 cons [cons, x(forbidden_nodes) 0]; % 禁止配置 % 重要负荷恢复约束只有配置MPS的节点才能恢复对应负荷 for i 1:nb cons [cons, alpha(:, i) P_load(i) * sum(x(i))]; end这段代码看起来简单但背后有几个关键逻辑。第一个约束是说MPS总数不能超过手头可用数量这是预配置阶段的资源天花板。第二个和第三个约束表达候选节点集这个在实际算例中一般是根据道路可达性、设备存放条件预先筛好的。第四个约束是预配置变量和灾后恢复之间的逻辑衔接不在节点i放MPS该节点在灾后就无法通过MPS恢复供电所以负荷恢复量被强制清零反过来说放了MPS的节点也只是“有恢复可能”最终能否恢复还要看调度阶段和网架拓扑。DistFlow线性潮流约束的编程实现是另一个重点这里给出最常见的线性化形式% DistFlow线性潮流方程忽略网损高阶项 for k 1:nl i from_bus(k); j to_bus(k); cons [cons, V(j) V(i) - 2*(r(k)*P_line(k) x(k)*Q_line(k))]; end % 节点功率平衡 for i 1:nb cons [cons, P_inj(i) sum(P_line(find(from_busi))) - sum(P_line(find(to_busi))) P_gen(i) - P_load(i)]; endV表示节点电压幅值的平方P_line和Q_line是线路有功无功潮流P_gen是MPS注入功率。这套DistFlow模型的特点是精度较高且保留了线性的结构MILP求解器能直接处理。如果你用的MPS模型是纯有功出力型比如应急发电车那无功变量和电压约束可以进一步简化但加上无功约束会让结果更真实因为实际配电线路电阻电抗比并不小。3.3 求解器调用与结果可视化模型建好之后求解器设置这一步也直接影响复现成败。YALMIP里最简单的调用方式是ops sdpsettings(solver, gurobi, verbose, 2, gurobi.TimeLimit, 3600); sol optimize(cons, objective, ops); % 检查求解状态并输出结果 if sol.problem 0 disp(最优解找到); x_val value(x); fprintf(预配置节点); disp(find(x_val 0.5)); else disp([求解失败, sol.info]); endGurobi求解器参数里TimeLimit和MIPGap最常用。大规模场景下MILP求解时间增长很快设置一个合理的时间上限比如3600秒和可接受的gap比如1%是常规操作。不是说非要等它收敛到0.01%才算解完工程上gap小于1%的次优解对韧性评估来说已经完全够用。结果可视化建议用Matlab自带绘图函数把配网拓扑画出来用不同颜色标注预配置节点和普通节点。这个图对于论文展示和方案解释都很加分。我一般还会加一个表格列出预配置的MPS数量、所在节点、对应的场景最坏失负荷量方便横向对比不同预算B下的方案变化。4. 实操复盘那些文档里看不到的坑与调参技巧4.1 复现过程中的常见报错与排查代码第一次跑通基本是不可能的我把这个过程中遇到的高频问题整理成一个速查表给同样在复现这类模型的读者一个排查思路现象可能原因处理方法求解器报“No suitable solver”YALMIP找不到Gurobi/Cplex路径检查yalmiptest输出确认Gurobi安装并addpath模型infeasibleBig-M取值太小截断了可行域逐个检查M取值取各约束物理上界的1.2倍求解时间爆炸场景数太多或预算B设置过大先跑单场景调试再逐步增加场景数和B结果出现非0/1的小数整数变量松弛未被严格处理确认binvar声明正确不要用sdpvar代替目标函数值为NaN负荷或阻抗数据中存在0/Inf检查原始数据清洗尤其注意除零场景Big-M过小导致的不可行问题是复现这类论文最阴间的坑。举个例子如果线路容量上限是5 MW你M取3那么当潮流达到4 MW时本应可行的解被M限制剪掉了整个模型直接infeasible。反过来M取100万又会让线性松弛很差分支定界树狂长几千个节点就卡死。另一个高频坑是场景数据与拓扑数据顺序不一致。比如你生成的故障场景是按线路编号1到32排序的但配网数据里线路编号是乱的导致断线集合张冠李戴算出来的“最坏失负荷”完全对不上。这个问题的排查方法是打印几个小场景的人工核对结果而不是直接盯着最坏场景值看。4.2 参数调优的经验之谈从保守到实际不确定性预算B是最值得花时间调试的参数。B0的场景等价于不看任何故障所有线路完好那预配置问题退化成普通的MPS选址结果必然乐观B32等价于所有线路都可能断这是极度保守的假设结果会要求在几乎所有重要节点都放MPS成本高且不现实。实际复现中建议先做B从1到5的灵敏度扫描观察最坏失负荷量的变化曲线找到拐点后再在拐点附近选取B值。MPS台数N_mps同样要做敏感性分析。我个人的经验是对于33节点系统2到5台的区间内方案变化非常明显超过8台之后边际收益迅速递减因为候选节点和线路容量已经接近饱和。画一张“MPS数量-最坏失负荷量”的曲线几乎能直接作为结论用在论文里。负荷权重系数也是容易被忽视却对结果影响巨大的参数。给医院类负荷权重设成10普通居民设成1那方案会明显倾向于在重权负荷附近布点。如果论文要求算例公平权重系数需要交代清楚取值依据否则审稿人很容易质疑结果的普遍性。4.3 Matlab环境与工具箱的搭配建议YALMIPGurobi的组合是我试过最顺手的。YALMIP值得一提的是它对CVX用户的友好度如果你之前用过CVX求解凸优化上手YALMIP几乎没有学习成本只是把cvx_begin改成yalmip的变量声明而已。Cplex也可以但许可证和接口配置比Gurobi稍微麻烦一点。如果不想用商业求解器MATLAB自带的intlinprog也能解中小规模的MILP但33节点加上百个场景后性能差距就很明显了一个几分钟一个几小时。关于YALMIP的安装建议下载后把文件夹路径加进Matlab的setpath里然后运行yalmiptest输出诊断结果。注意新版Matlab对YALMIP的兼容性偶尔有问题如果报函数冲突可以考虑用旧版本YALMIP或者升级Matlab到2023b以上。另外如果你的算例系统是63节点或者119节点这类更大的配网预配置阶段加上几十个场景的MILP规模会迅速膨胀这时候单纯依赖单线程求解很容易卡住。Gurobi默认并行线程数可以通过参数设置调高同时尽量用稀疏矩阵存储所有约束数据能显著降低内存占用。开始算之前可以用optimize第三个参数options里的cachesize选项调节缓存调大一点对迭代较深的模型有帮助。5. 后续扩展从预配置走向动态调度预配置阶段解完之后整个框架的另一半是灾后动态调度。这一部分的核心是把MPS的移动过程显式建模灾后每个MPS从预配置节点出发沿着某条路径去往目标节点整个过程需要考虑道路通行的时间窗口和MPS自身的电量续航。动态调度通常会写出一个带时间索引的优化模型节点状态变量变成三维时间×节点×设备模型规模比预配置直接大一个量级。动态调度和预配置的衔接方式也值得说一下。严格意义上动态调度的起点即是预配置的解预配置阶段给出的x_val会成为调度阶段的一个边界条件。如果你打算把两个阶段合并成一个大模型求解变量数量会非常大更常见的做法是解耦成两个阶段迭代求解预配置阶段先输出候选方案调度阶段再针对这个方案求解最坏场景下的失负荷量如果结果不满意就回到预配置阶段调整约束和参数重新求解。我个人在实际操作中的一个体会是先别急着把模型复杂度拉满第一版代码务必只求“能跑通”。哪怕先用单场景加B0的简化设定都能把代码逻辑完整走一遍再去加场景集合、加预算B、加动态调度模块。分阶段验证的好处是每一步出问题都能精准定位不至于到最后所有模块叠在一起报个infeasible都不知道该查哪块约束。这个思路帮我在这类多层优化问题上节省了大量排查时间值得你试一次。

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

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

免费获取报价 →
↑