资讯动态

混合配电系统规划与可靠性评估:多目标优化与蒙特卡洛实战

发布时间:2026/10/17 5:27:59 来源:尧图企业网站定制
做电网规划的这几年我越来越觉得这个活儿的难点从来不在某一个单点上而在“权衡”。要在经济性和可靠性之间权衡要在投资和运行之间权衡要在好几套备选方案里反复权衡。尤其当分布式电源和储能大规模接入之后配电网变成真正意义上的“混合配电系统”这种权衡的复杂度又往上跳了一个台阶。我最近整理了一套基于经济与可靠性双目标的混合配电系统规划及可靠性评估方法核心逻辑是把“规划方案生成”和“可靠性评估”组合成一个完整的闭环外层用多目标进化算法搜方案内层用序贯蒙特卡洛模拟算可靠性最后输出一组Pareto最优解给决策者挑。整套代码用Python实现也是我个人在多个项目里反复调整之后比较顺手的一套框架。这篇文章适合谁看如果你在做配电网规划相关的研究、设计或工程落地需要把分布式电源、储能和传统配电网揉在一起做方案比选或者你手头已经有评估算法但不知道怎么把可靠性指标和经济成本真正放进同一个优化框架里那这篇内容应该能帮上忙。我不打算只堆公式而是把模型怎么建、代码怎么写、坑在哪里都按实际操作的顺序讲清楚。1. 混合配电系统规划到底在解决什么问题1.1 “混合”这个词带来的规划难点传统配电网是单向供电、辐射状结构电源在上游负荷在下游规划的核心无非是线路扩容、变电站增容。但现在系统里接入了光伏、风电、储能、电动汽车充电设施甚至微电网情况就完全变了潮流方向不再固定设备利用率波动变大可靠性评估也不能再简单按“故障—停电”的静态逻辑来算。这种“混合”属性的直接后果是规划人员要同时决定多个层次的问题。常规电网改不改、新增DG往哪接、储能配多大、开关和自动化设备怎么布这些决策彼此影响。比如你在一端接入大量光伏如果不配套储能和线路改造可能白天电力溢出送不出晚上又不够用。反过来如果规划得保守冗余装备一堆投资回报就成问题。所以混合配电系统规划本质上是一个组合优化问题决策变量类型多、约束多、目标相互冲突。这也是它比单一设备规划难一个数量级的原因。1.2 为什么一定是“经济可靠性”双目标规划这件事最终要落到底层就是两个问题花多少钱以及靠不靠得住。经济性指标涵盖设备投资、运行维护、电能损耗、购电成本这些看得见的费用可靠性指标则考核用户侧能感知到的停电频率、停电时长、缺供电量。这两个目标天然互相矛盾提高可靠性的手段比如增设联络开关、配置冗余线路、增加储能备用容量每一项都要花钱而压缩投资的最直接方式就是砍掉那些“平时用不上、关键时刻救命”的设备。如果只按经济性最优来规划算出来的方案成本最低但可靠性可能让用户无法接受如果只按可靠性最优来规划系统会冗余到成本失控。所以工程上需要同时优化两个目标让决策者看到完整权衡关系再结合实际情况选一个落地方案。1.3 双目标如何定量描述我把两个目标分别写成标量函数评价一个规划方案时同时计算这两项经济目标全生命周期等年值成本单位万元/年数值越低越好可靠性目标可以用SAIDI也可以用年期望缺供电量ENS单位小时/户·年或MWh/年同样越低越好这里一个很实用的建模思路是把可靠性指标折算成缺电损失成本塞进经济目标里。这样规划代码里就有了两个维度一个是净经济成本一个是纯可靠性水平。前者包含缺电损失但它是货币化的后者是物理指标。两个目标从不同视角评价方案比单纯混成一个总费用更有分析价值。2. 可靠性评估的原理、选型与Python实现要点2.1 指标体系怎么选才够用算可靠性第一步是选指标。我常用的四个指标是SAIFI系统平均停电频率指标、SAIDI系统平均停电持续时间指标、ENS缺供电量和ASAI供电可用率。指标含义单位SAIFI系统用户平均停电次数次/户·年SAIDI系统用户平均停电时间小时/户·年ENS年期望缺供电量MWh/年ASAI供电可用率%规划阶段我通常重点看SAIDI和ENS。SAIDI反映的是用户的停电感受适合用来做约束比如“改造后SAIDI必须控制在2小时以内”ENS则直接跟缺电损失挂钩方便折算成经济成本放进目标函数里。2.2 解析法和蒙特卡洛怎么选可靠性评估有两大流派解析法和模拟法。解析法适合电网结构固定、规模较小的场景通过枚举故障模式或者求最小割集来计算指标速度快、结果稳定。但混合配电系统里DG出力的随机性、储能充放电策略、负荷转移和开关动作逻辑都带有时序特征解析公式很难精确刻画。所以我更推荐序贯蒙特卡洛模拟。它就是把系统一年的运行过程逐年“演”无数遍每一年里元件的故障和修复按概率分布随机抽样然后统计平均停电指标。这个方法的好处是能容纳各种复杂的运行策略只要你把策略用代码写清楚评估逻辑就能反映出来。代价也很直观——慢。在规划优化里每个候选方案都要做一次全系统的可靠性评估如果蒙特卡洛采样年数不够结果抖动还特别大直接导致进化算法分不清两个方案谁更优。2.3 序贯蒙特卡洛的Python实现细节核心数据结构是元件状态时间序列。一个元件通常用两状态模型正常运行状态和故障停运状态。故障率λ次/年、平均修复时间r小时这两个参数是基础输入。实现时我一般这么处理import numpy as np def generate_component_states(years, failure_rate, repair_hours): # 将年转换为小时 total_hours years * 8760 states np.ones(total_hours, dtypeint) # 1表示正常0表示故障 t 0 while t total_hours: # 抽样正常运行持续时间指数分布 uptime np.random.exponential(1.0 / failure_rate) * 8760 t uptime if t total_hours: break # 抽样故障修复时间这里假设指数分布指定平均修复小时 downtime np.random.exponential(repair_hours) end min(int(t downtime), total_hours) states[int(t):end] 0 t end return states这段代码的关键点有两个一是把年故障率换算成小时尺度时要乘以8760二是修复时间直接用小时。单位不统一是刚开始跑这个程序时最容易出的问题我早期有一次算出来的SAIDI离谱地小排查半天才发现是故障率换算时少乘了一个8760。有了每个元件的状态序列之后下一步是逐小时判断系统哪些负荷失电。这一步要结合网络拓扑和潮流结果某个元件故障后先判断有没有转供路径有的话尝试恢复部分负荷没有的话故障范围内的负荷全部停电。统计每一小时的失电负荷和停电用户数累加除以总用户数和总年数就能得到SAIFI和SAIDI。2.4 评估速度优化的三个方向蒙特卡洛慢是公认痛点。我在一个33节点算例里实测过如果用纯Python循环逐小时判断跑一个方案要一分钟以上。三个方向的优化效果最直接向量化采样把逐小时循环改成numpy数组批量生成状态序列避免Python循环场景缓存同一故障场景在不同采样年里重复出现按故障模式查表避免重复计算相同的恢复策略并行评估pymoo支持多进程并行评估种群个体多核机器上接近线性加速这三点做完33节点系统跑一轮可靠性评估能压缩到几秒级别整个优化流程才可能在实际项目中落地。3. 经济性建模与NSGA-II多目标优化框架3.1 经济性目标到底包含哪些钱经济性目标我按全生命周期口径计算一般分五块设备投资成本、运行维护成本、网络损耗成本、向上级电网购电成本、缺电损失成本。投资成本包括线路新建或改造、变压器增容、DG和储能设备购置费用。运行维护成本按设备类型的年维护费率计算光伏、储能、常规配变的维护费率差异很大。网络损耗成本要基于典型日负荷曲线做潮流计算把年损耗电量折算成购电成本。这里必须强调设备寿命不同不能直接把建设总费用和年运行费用相加。要把投资成本折算成等年值——先算现值再用资金回收系数换算成年值。资金回收系数的公式是CRF r * (1 r)^n / ((1 r)^n - 1)其中r是贴现率n是设备寿命。同样一笔投资寿命15年的线路和寿命10年的储能年化成本完全不是一回事。3.2 为什么我不用单目标加权法把两个目标加权合成一个单目标逻辑上很简单实际操作却非常难受。最核心的问题是权重不好定。经济性单位是万元可靠性单位是小时或MWh不同量纲、不同数量级权重本质上代表了主观偏好你定多少都会被人问一句“凭什么”。更麻烦的是如果Pareto前沿是非凸的线性加权法根本求不出全部最优解。多目标进化算法就不存在这个问题。以NSGA-II为例它靠着非支配排序和拥挤度距离一次运行就能跑出一整片Pareto前沿。最终输出不是单个方案而是一串方案决策者可以从前沿上根据实际偏好挑点。3.3 pymoo里的实现组织方式Python里的多目标优化库我推荐pymoo它自带NSGA-II、NSGA-III等主流算法API比较清晰。DEAP也可以但算子灵活度要求高更适合自己定制算法的人。我在pymoo里的实现套路是这样的定义个体编码线路改造状态用二进制DG接入容量用实数储能配置功率和容量用实数在问题类里实现_evaluate方法输入个体矩阵输出经济成本和可靠性指标两个目标值约束写在问题类里比如节点电压上下限、支路容量、辐射状拓扑约束一个典型的pymoo问题定义框架from pymoo.core.problem import Problem import numpy as np class DistributionPlanningProblem(Problem): def __init__(self): n_var 20 # 根据具体决策变量数量调整 super().__init__(n_varn_var, n_obj2, n_ieq_constr5) def _evaluate(self, X, out, *args, **kwargs): # X是一批个体需要逐个解码并评估 results_cost [] results_saidi [] for individual in X: plan decode_individual(individual) cost evaluate_economic(plan) reliability evaluate_reliability(plan) results_cost.append(cost) results_saidi.append(reliability) out[F] np.column_stack([results_cost, results_saidi]) # 不等式约束小于0为满足 out[G] np.column_stack([...])这里要提醒一个重点评估函数里可靠性评估是最耗时的一环。NSGA-II每一代要评估整个种群几百个个体做几十上百次蒙特卡洛如果评估函数写得粗糙整个优化流程会拖到无法接受。所以正式跑优化之前一定要先单独验证评估函数的速度。4. 33节点算例从零跑通全流程4.1 算例设计先小后大别贪规模第一次跑通这套框架不建议直接上几百节点的实际馈线。我推荐从IEEE 33节点标准算例开始它26条支路、32个负荷节点规模适中既能体现辐射状配电网的全部特征又方便人工核对结果。算例数据要包含几类各节点年峰值负荷和典型日负荷曲线、线路阻抗和容量参数、上级电源位置和容量、DG候选接入节点和容量范围。负荷曲线很重要不能只用峰值负荷做静态评估否则蒙特卡洛无法体现负荷时序变化对可靠性的影响。我先不加任何DG跑一遍基础潮流和可靠性评估得到“投资为0但缺电损失较高”的基准方案。这个基准值后面非常关键所有优化方案的改善幅度都拿它作为对比参照。4.2 代码结构从第一天就分好模块代码结构直接影响后期的调试效率。我的目录组织是这样project/ ├── data/ # 算例数据文件csv或excel ├── models/ # 配电网模型、元件参数类 ├── evaluation/ # 潮流计算、可靠性评估模块 ├── optimizer/ # NSGA-II配置与主循环 ├── results/ # Pareto前沿输出与图表 └── main.py # 总入口强烈建议把评估部分独立成模块不要和优化逻辑揉在一起。原因有两个一是调试可靠性评估时可以单独跑一个方案不用启动整个进化流程二是后续如果想替换评估逻辑比如从序贯蒙特卡洛换成准序贯只需要动评估模块优化器不用改。4.3 潮流计算和可靠性评估如何配合潮流计算我用pandapower它内置了牛顿法和直流潮流读取网络参数之后直接求解。对33节点这种规模速度和收敛性都不是问题。可靠性与潮流的配合关系我总结成三步对规划方案先跑正常状态潮流检查线路负载率和节点电压是否越限在蒙特卡洛模拟的每个故障场景中先判断失电区域然后搜索相邻的联络开关或转供路径尝试恢复非故障区域负荷恢复之后再做一次潮流校验如果线路过载或电压不合格就需要继续削减部分负荷直到潮流收敛且满足约束这一点特别重要如果只判断“拓扑是否连通”就认定负荷恢复不考虑容量和电压约束评估出来的可靠性指标会明显偏乐观。我早期跑结果时发现SAIDI比文献值好很多检查半天才发现是恢复策略里漏掉了重载校验。4.4 NSGA-II主循环的参数设置pymoo里跑NSGA-II参数我一般这样设from pymoo.algorithms.moo.nsga2 import NSGA2 from pymoo.operators.crossover.sbx import SBX from pymoo.operators.mutation.pm import PM from pymoo.operators.sampling.real_random import RealRandomSampling from pymoo.optimize import minimize algorithm NSGA2( pop_size100, samplingRealRandomSampling(), crossoverSBX(prob0.8, eta15), mutationPM(prob0.1, eta20), eliminate_duplicatesTrue ) res minimize(problem, algorithm, (n_gen, 200), seed42, verboseTrue)种群规模100最大代数200交叉概率0.8变异概率0.1随机种子固定方便复现。这个设置在我跑过的中低压配网算例里收敛表现都不错。跑完后保存每一代记录的Pareto前沿。横轴画经济年成本纵轴画SAIDI或ENS能非常直观地看出成本和可靠性之间的权衡关系。4.5 从Pareto前沿里挑最终方案优化结束不是直接把第一个解交付而是从前沿上选点。前沿上每个解都代表一种“偏好”越靠左经济性越好但可靠性差越靠右可靠性好但花钱多。我常用的筛选逻辑有三个一是看前沿上的“拐点”也就是斜率突变的位置这里往往是性价比最高的区域二是先设定一个可靠性约束比如SAIDI必须小于2小时在前沿上圈出可行解选成本最低的那个三是用熵权TOPSIS这类多属性决策方法给前沿解打分适合需要走评审流程的项目。不过说句实在话真正做规划项目时最靠谱的方式还是把几套关键方案的前沿图和相关指标拿到评审会上跟决策者一起讨论。优化算法解决的是“有哪些好方案”的问题最终怎么定还得结合现场条件和政策要求。5. 常见问题与排查技巧实录5.1 蒙特卡洛结果不稳定怎么办蒙特卡洛指标本质上是统计估计值不是精确值。如果你发现同一个方案跑两次SAIDI差20%以上那说明采样年数不够。我的经验是用方差系数来控制采样量。每累计一定采样年数就计算SAIDI的方差系数低于0.02~0.05就可以停止。但注意进化算法内部如果每个个体都动态调整采样年数会让比较失去基准。我建议固定采样年数比如5000年保证方案之间可比。为了减少计算负担可以用两级评估前期用1000年粗评估筛掉明显差的个体最后对精英解再用5000年精评估。实测下来这个策略能省掉大半计算时间同时保住结果可信度。5.2 不可行解太多怎么办规划问题的约束一大堆随机生成的个体很可能不可行最常见的是破坏了辐射状拓扑或者电源容量不足导致潮流不收敛。不可行解一多进化算法大部分时间都在评估无效方案收敛自然慢。我的处理办法是“修复优先于惩罚”。以辐射状约束为例检测到一个个体存在环网结构时就随机断开一条成环支路把拓扑修复为辐射状。惩罚函数当然也能用但惩罚系数要反复调调不好会让算法向不可行区域偏移。5.3 整条流程太慢从哪里突破整套流程最重的瓶颈就是序贯蒙特卡洛评估。所以优化性能要盯住三个点向量化采样、场景缓存、多进程并行。pymoo的并行评估可以设置use_gpuFalse用多进程方式同时评估多个个体。这里有一个坑多进程模式下如果每个子进程都重新加载算例数据和潮流模型开销会非常大。我的解决办法是把只读数据放全局变量子进程初始化时只加载一次。三件事都做完以后33节点系统跑200代NSGA-II从原来的一天压到几个小时这个速度对研究级项目已经足够了。5.4 一个最不起眼但最致命的问题数据质量最后说一个最容易被忽视、但后果最严重的坑数据错误。算例数据里一个负荷节点编号写错、一条线路的阻抗数量级不对可靠性评估结果会悄无声息地变形而且很不容易察觉因为报错很少数值看着也“像那么回事”。我养成的习惯有这几条。解析完算例数据先画网络拓扑图人工核对节点编号和支路连接这一步能拦住大部分拓扑错误。做一次“无DG、无改造”的基准可靠性评估跟公开文献或标准算例的结果对比偏差太大就一定有问题。最后把经济成本的各个分量单独输出检查投资成本、网损成本、缺电损失是不是都在合理区间。没有哪个算法能对抗脏数据。我在这套流程上踩过的所有“灵异问题”最后追根溯源几乎都回到了数据表本身。所以我把这条放在最后讲它是整套方法能不能复现的底线。以上就是我个人在混合配电系统规划及可靠性评估里积累的一套完整实践。说实话优化算法本身已经比较成熟真正拉开方案质量差距的是模型建得够不够贴近实际评估逻辑有没有把恢复策略、时序出力这些细节考虑进去以及拿到结果之后能不能做出正确的权衡判断。如果你也正在处理类似的规划问题建议先从小算例把评估流程跑通再逐步加实际网络数据过程中务必把数据校验当成第一道工序。这样遇到问题的时候你才能有底气说结果对不上一定不是模型和代码先出问题。

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

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

免费获取报价 →
↑