混合配电系统双目标规划:NSGA-II与序贯蒙特卡洛的Python实现
发布时间:2026/10/2 9:09:27来源:尧图网络
摘要混合配电系统交流/直流混合配电、含分布式电源与储能的多能源配电系统的规划问题本质上是一个在投资经济性与供电可靠性之间寻找最优平衡的多目标优化问题。传统方法要么只做经济性单目标优化用惩罚项近似可靠性要么在规划完成后单独做可靠性校验发现不达标再回头调整方案迭代效率低且容易错过全局最优。本文提出一种基于经济与可靠性双目标的混合配电系统规划模型采用NSGA-II多目标进化算法求解Pareto前沿并在规划方案生成的同时内嵌序贯蒙特卡洛可靠性评估模块实现规划-评估一体化。全文给出完整的Python代码实现包括配电网拓扑参数化建模、基于线性化DistFlow的潮流约束、计及N-1准则与负荷转供的可靠性指标计算SAIDI、SAIFI、EENS以及基于Pareto前沿的决策辅助方法。算例基于IEEE 33节点系统扩展而成验证了双目标模型相比单目标模型在可靠性提升上的显著效果同时分析了分布式光伏、储能容量配置对双目标权衡关系的影响。1. 问题背景与研究动机1.1 为什么混合配电系统规划必须同时考虑经济性与可靠性混合配电系统的混合二字在工程实践中有两层含义。第一层是供电方式的混合即交流配电网与直流配电网并存直流负荷、分布式光伏、储能装置通过换流器VSC接入交流网络第二层是电源结构的混合即传统变电站供电与分布式电源DG、储能系统ESS联合供电。这两层混合给规划带来的直接后果是投资决策变量大幅增加、运行方式更加灵活、故障后的转供路径更加复杂而传统的先定网架、再算可靠性的串行规划模式越来越难以满足工程要求。举个实际例子。一个规划人员面对新建园区配电网如果只做经济性优化最优方案往往是尽可能减少线路长度、减少开关设备、减少备用容量因为这些都是真金白银的投资。但这个方案投运后一旦某条主干线路故障负荷可能全部失电——年停电时间可能从原来的2小时飙升到20小时这在工业用户占比高的园区里是不可接受的。反过来如果一味追求高可靠性配置双回路、双变压器、全联络开关投资可能翻倍但很多设备年利用率不到5%经济性同样不达标。因此经济性与可靠性本质上是两个相互冲突的目标提升可靠性几乎必然伴随投资增加而压缩投资几乎必然牺牲可靠性。解决这类冲突的标准数学框架就是多目标优化——不再寻找唯一最优解而是寻找一组Pareto最优解让决策者根据实际工程偏好从中选择。1.2 现有方法的核心缺陷我调研了近五年的相关文献发现现有研究大体分为三类第一类是经济性为主、可靠性为辅的单目标加权法。做法是将可靠性指标如EENS乘以停电损失费用折算成货币成本与投资运维成本加和构成单目标函数。这种方法的问题很明显权重系数需要人为给定而不同用户类型工业、商业、居民的停电损失差异巨大权重稍有变化最优方案就完全变了。第二类是规划与评估分离的串行法。先做经济性优化再对最优方案做可靠性评估如果可靠性不达标就增加线路或设备再重新优化。这种方法的致命缺陷是规划阶段完全没有可靠性信息的引导修改一次网架就要重新跑一遍优化收敛慢不说最终方案是否为全局最优也完全没有保证。第三类是启发式规则法。比如通过设置最大供电能力转供能力校验等工程规则来约束网架结构。这类方法工程上很实用但规则本身是静态的难以适应分布式电源出力波动、负荷增长模式变化等动态因素。本文采用的技术路线与上述三类都不同在NSGA-II的多目标进化框架中将可靠性评估模块作为适应度函数的一部分每个候选规划方案在生成后立即进行序贯蒙特卡洛可靠性评估计算其SAIDI、SAIFI、EENS指标与经济性指标共同构成双目标。进化过程同时朝经济最优和可靠最优两个方向搜索最终得到一组Pareto解集。2. 双目标规划模型构建2.1 决策变量与规划场景设定本文针对的是中压混合配电系统的网架规划与设备定容问题。规划场景设定如下系统电压等级交流侧10kV直流侧±10kV经VSC互联候选新建线路若干条待建交流线路和直流线路候选分布式光伏PV接入点在部分节点配置光伏容量在0~2MW之间连续可调候选储能系统ESS接入点在部分节点配置储能容量在0~1MWh之间连续可调功率在0~0.5MW之间连续可调负荷数据各节点峰值负荷已知负荷曲线采用典型日24小时曲线缩放同时考虑季节差异四季各取一个典型日。基于此场景决策变量分为两部分二进制变量线路投建状态。设候选线路集合为 L_cand每条候选线路 i 对应决策变量 x_i ∈ {0,1}x_i1 表示投建该线路。连续变量分布式光伏配置容量 {P_pv,j} 和储能配置容量/功率 {E_ess,k, P_ess,k}。一个完整的规划方案由以上所有变量共同构成。在NSGA-II中每个个体的基因编码为二进制线路投建段 实数PV容量段 实数ESS容量段的组合。2.2 经济性目标函数经济性目标采用全生命周期成本Life Cycle CostLCC模型将规划期内的所有费用折算到投资现值。规划周期设为20年折现率取8%。经济性目标函数包含以下四部分投资成本 C_inv$$C_{inv} \sum_{i \in L_{cand}} x_i \cdot c_{line,i} \cdot L_i \sum_{j \in N_{pv}} c_{pv} \cdot P_{pv,j} \sum_{k \in N_{ess}} c_{ess} \cdot E_{ess,k}$$其中 c_line,i 为第 i 条候选线路的单位长度造价万元/kmL_i 为线路长度kmc_pv 为光伏单位容量造价万元/MWc_ess 为储能单位容量造价万元/MWh。运行维护成本 C_om$$C_{om} \sum_{t1}^{T} \frac{C_{om,t}}{(1r)^t}$$其中 C_om,t 为第 t 年的运行维护费用包含常规设备维护费按投资额的一定比例计取和分布式电源/储能的年度运维费。T20为规划周期r0.08为折现率。网损成本 C_loss网损成本按典型日运行模拟结果折算对每个典型日用DistFlow潮流计算全系统日网损电量乘以电价后折算为年度费用再按折现率折算为现值。停电损失成本 C_eens这里我先说明在单目标经济性优化中EENS的货币化转换是必须的但本文的双目标模型中EENS作为独立的可靠性目标出现不再需要人为设定停电损失单价。因此经济性目标函数为$$f_1 C_{inv} C_{om} C_{loss}$$停电损失不再货币化避免了权重设定的主观性这正是双目标模型的优势之一。2.3 可靠性目标函数可靠性目标选取系统级指标EENS期望缺供电量作为主目标同时计算SAIDI和SAIFI作为辅助输出指标。EENS的定义为$$EENS \sum_{h1}^{8760} E_{ns,h}$$其中 E_ns,h 为第 h 小时系统的缺供电量MWh。EENS综合反映了停电频率、停电持续时间和缺供负荷量三个维度的信息是经济性关联最紧密的可靠性指标。本文的可靠性评估采用序贯蒙特卡洛模拟法Sequential Monte CarloSMC其核心思想是对系统中的每个元件线路、变压器、VSC换流器、分布式电源、储能建立故障/修复状态时序模型生成一个完整年度8760小时的系统运行状态序列对每个小时进行故障影响分析含网络重构与转供统计缺供电量。多年度重复模拟直至指标收敛。2.4 约束条件体系模型需要满足以下约束辐射状拓扑约束交流网络重构后必须保持辐射状运行不允许闭环。本文在规划阶段通过图论的生成树校验保证每个方案对应的交流网络连通且无环。节点电压约束交流节点电压偏差不超过±7%直流节点电压偏差不超过±5%。线路容量约束各线路潮流不超过其允许载流量N-1校核时允许短时过载30%。储能运行约束储能荷电状态SOC保持在[0.1, 0.9]区间充放电功率不超过额定值且满足日充放电能量平衡日内净充电量为零保证储能不会变成永动机。光伏出力约束光伏出力不超过配置容量且受光照曲线约束。3. 求解算法与Python实现架构3.1 为什么选择NSGA-II多目标优化算法中NSGA-IINon-dominated Sorting Genetic Algorithm II至今仍是电力系统规划领域应用最广泛、最成熟的算法。相比后来的NSGA-III、MOEA/D等算法NSGA-II的优势在于非支配排序拥挤度距离的机制实现简单代码可读性强便于工程技术人员理解和二次开发在决策变量规模不大本文约50~100个变量的问题上与更复杂的算法相比收敛性差距不大但实现成本低得多已有大量现成的Python库如pymoo、deap提供成熟实现可以快速集成自定义的评估函数。选用pymoo库作为NSGA-II的实现框架主要原因是它的接口设计更现代支持自定义Problem类且对Pareto前沿的可视化支持较好。3.2 整体代码架构整个Python实现分为五个模块如下表所示模块文件职责数据定义data_model.py节点、线路、负荷、DG、ESS参数定义系统拓扑初始化潮流计算power_flow.py基于DistFlow的交流潮流求解含VSC换流器模型可靠性评估reliability.py序贯蒙特卡洛模拟N-1转供分析指标统计规划模型planning_problem.py定义决策变量、约束条件、双目标函数封装为pymoo的Problem类求解与可视化optimize.pyNSGA-II迭代求解Pareto前沿绘制方案对比分析各模块的依赖关系为optimize.py→planning_problem.py→reliability.py/power_flow.py→data_model.py。可靠性评估模块内部需要反复调用潮流计算所以二者之间是紧耦合关系。3.3 核心数据结构设计在data_model.py中系统拓扑用networkx的图对象表示。节点分为交流节点和直流节点两类用节点属性dc_flag区分线路分为候选线路和已有线路用边属性candidate区分。这个设计有两个好处一是networkx提供现成的连通性检查和生成树算法方便实现辐射状约束二是候选线路的投建状态可以通过边的active属性动态开关评估不同方案时无需重新建图。节点对象的核心属性包括class Bus: def __init__(self, bus_id, bus_type, dc_flag, p_load, q_load, v_min, v_max, pv_capacity0.0, ess_capacity0.0): self.bus_id bus_id self.bus_type bus_type # substation, load, dg, ess self.dc_flag dc_flag self.p_load p_load # 峰值有功负荷kW self.q_load q_load # 峰值无功负荷kVar self.v_min v_min self.v_max v_max self.pv_capacity pv_capacity # 光伏配置容量kW self.ess_capacity ess_capacity # 储能配置容量kWh注意pv_capacity和ess_capacity在规划阶段是决策变量在评估阶段是已知参数——同一个数据结构在优化循环中被反复赋值这在Python中天然支持不需要额外的复杂机制。3.4 决策变量的编码与解码NSGA-II中个体向量的长度为决策变量总数。本文将决策变量组织为三段第0~N_line-1位候选线路投建状态二进制第N_line~N_lineN_pv-1位光伏配置容量连续实数单位MW范围0~2第N_lineN_pv~N_lineN_pvN_ess-1位储能配置容量连续实数单位MWh范围0~1在planning_problem.py的_evaluate方法中首先对个体向量进行解码def decode_individual(self, x): line_status np.round(x[:self.n_line]).astype(int) pv_capacity x[self.n_line:self.n_lineself.n_pv] ess_capacity x[self.n_lineself.n_pv:] return line_status, pv_capacity, ess_capacity二进制决策变量在pymoo中需要特殊处理——NSGA-II的默认变异算子是为实数变量设计的。为此我重写了Mutation和Sampling对二进制段使用“位翻转变异”对连续段使用“多项式变异”对实数段使用“均匀抽样”。这个细节如果不处理算法会跑出大量非整数的线路投建状态导致约束判断逻辑出错。4. 潮流计算与运行模拟4.1 DistFlow潮流模型及线性化处理交流配电网潮流采用DistFlow模型。对于辐射状网络中的支路 i→jDistFlow方程描述为$$P_{j} P_{i} - r_{ij} \cdot \frac{P_{i}^{2} Q_{i}^{2}}{V_{i}^{2}} - P_{L,j}$$$$Q_{j} Q_{i} - x_{ij} \cdot \frac{P_{i}^{2} Q_{i}^{2}}{V_{i}^{2}} - Q_{L,j}$$$$V_{j}^{2} V_{i}^{2} - 2(r_{ij}P_{i} x_{ij}Q_{i}) (r_{ij}^{2} x_{ij}^{2}) \cdot \frac{P_{i}^{2} Q_{i}^{2}}{V_{i}^{2}}$$其中 P_i、Q_i 为支路首端流过的有功和无功功率r_ij、x_ij 为支路阻抗P_L,j、Q_L,j 为节点 j 的负荷功率。DistFlow方程是非线性的直接迭代求解速度慢而且在蒙特卡洛模拟中需要调用成千上万次必须做线性化处理。本文采用文献中广泛使用的线性化DistFlow——忽略电压偏移对功率损耗的影响将方程简化为$$P_{j} P_{i} - P_{L,j}$$$$V_{j} V_{i} - \frac{r_{ij}P_{i} x_{ij}Q_{i}}{V_{0}}$$这个线性化精度在配电网场景下足够节点电压偏差通常不超过7%对潮流计算结果的影响在可接受范围内。线性化后整个网络的潮流可以通过一次前推回代直接求解不需要迭代单次计算耗时从毫秒级降到微秒级——这对蒙特卡洛模拟来说至关重要。4.2 VSC换流器与直流网络潮流建模交流网络和直流网络通过VSC换流器连接。VSC在潮流计算中的模型为交流侧节点注入功率 P_ac直流侧节点注入功率 P_dc两侧满足功率平衡关系$$P_{ac} P_{dc} P_{loss,vsc}$$其中 P_loss,vsc 为换流器损耗按传输功率的2%近似计算。VSC的容量约束为$$\sqrt{P_{vsc}^{2} Q_{vsc}^{2}} \leq S_{vsc}^{rated}$$直流网络潮流采用直流潮流模型——只计算有功不考虑无功和电压相角$$P_{dc,i} \sum_{j \in N_{dc}} b_{ij} \cdot (V_{dc,i} - V_{dc,j})$$其中 b_ij 为直流线路的电导。需要注意的一个工程细节是VSC换流器的控制模式对潮流计算结果影响很大。本文设定VSC采用定有功-定无功控制P-Q控制交流侧系统作为松弛节点平衡功率差额。在故障场景下当VSC连接的交流侧节点失电时VSC自动退出运行相关直流负荷由其他VSC或储能继续供电——这个逻辑在可靠性评估的故障分析中需要显式建模。4.3 时序运行模拟经济性目标中的网损成本需要基于全年运行模拟计算。为平衡计算精度和速度本文采用四季典型日 × 24小时的简化时序模拟每个季节取一个典型负荷日包括日负荷曲线光伏出力取对应季节的典型光照曲线储能按启发式充放电策略运行光伏大发时充电、晚高峰时放电分别计算四个典型日的网损电量加权外推为全年网损。这里我在代码中特意做了模块化处理simulate_daily_operation()函数输入负荷曲线、光伏出力和储能策略输出各时段潮流结果与网损。后续如果要扩展为全年8760小时逐小时模拟只需要替换数据输入部分核心潮流计算代码不用动。5. 序贯蒙特卡洛可靠性评估5.1 元件时序状态模型序贯蒙特卡洛的核心是为每个元件建立时间序列状态。对于线路、变压器、VSC等可修复元件采用运行-故障-修复-运行的两状态模型。元件寿命和修复时间均假设服从指数分布通过随机抽样生成每次故障的发生时刻和修复时长。def sample_component_sequence(comp, horizon_hours8760): 生成单个元件在周期内的故障-修复时序状态序列 返回: [(start_hour, end_hour, state)] state0正常运行, 1故障 events [] t 0 while t horizon_hours: # 抽样正常运行持续时间指数分布均值MTTF uptime np.random.exponential(comp.mttf) fail_start t uptime if fail_start horizon_hours: break # 抽样故障修复时间指数分布均值MTTR downtime np.random.exponential(comp.mttr) fail_end min(fail_start downtime, horizon_hours) events.append((fail_start, fail_end, 1)) t fail_end return events这里有一个容易被忽略的细节MTTF平均无故障时间和MTTR平均修复时间的单位必须统一。很多文献中元件的故障率λ以次/年为单位而修复时间以小时为单位换算时要把λ转换为次/小时再算期望值。具体换算公式$$MTTF \frac{8760}{\lambda}$$这样MTTF的单位就是小时。如果λ0.1次/年则MTTF87600小时——一个相当长的正常时间模拟中抽到这样长的正常运行时间是常态。5.2 故障影响分析与负荷转供策略元件故障后需要对系统进行故障影响分析。核心步骤如下将故障元件从网络中隔离检查各负荷节点是否仍然连通通过生成树的连通性检查对失电负荷节点尝试通过网络重构闭合联络开关恢复供电对无法恢复的节点记录缺供电量并按其重要程度一级/二级/三级负荷确定停电损失。步骤3是工程上最复杂的一环。实际配电网中故障后的负荷转供需要满足三个条件转供路径上所有线路不过载、节点电压不越限、转供操作时间在允许范围内。本文将转供问题近似建模为以失电区域为起点、以联络开关所在节点为终点的最短路径搜索问题然后对转供后的网络运行一个快速潮流校验如果电压或载流越限则按优先级逐级甩负荷。需要特别指出的是在故障影响分析中分布式电源和储能的存在会显著影响可靠性评估结果。故障隔离后如果某个失电区域内部有光伏和储能可以形成孤岛运行模式为孤岛内的负荷继续供电。本文在评估中考虑了孤岛运行但设定了两个限制条件一是孤岛内电源总出力必须大于总负荷的1.2倍考虑负荷波动和光伏出力的不确定性二是孤岛运行时间不超过储能的最大支撑时间或故障修复时间。5.3 指标收敛判据序贯蒙特卡洛模拟需要重复模拟多年直到指标达到收敛条件。常用的收敛判据是EENS的方差系数Coefficient of VariationCV小于设定阈值$$CV \frac{\sigma_{EENS}}{\mu_{EENS} \cdot \sqrt{N_{sim}}} \leq \varepsilon$$其中 σ_EENS 为EENS的样本标准差μ_EENS 为样本均值N_sim 为模拟年数ε 取0.05。同时设定最大模拟年数不超过5000年防止极端情况下计算时间过长。这里我分享一个实操经验在NSGA-II的进化过程中对每个个体都做完整的5000年蒙特卡洛模拟会非常耗时。我的做法是分两级评估——第一级在进化前期用较粗的精度CV≤0.1模拟年数500年快速筛选淘汰明显劣质的解第二级在进化后期对Pareto前沿上的候选解用高精度CV≤0.03模拟年数5000年重新评估精修前沿。这样可以在几乎不损失精度的情况下将整体计算时间缩短60%左右。5.4 SAIDI和SAIFI的计算逻辑在统计EENS的同时程序同步统计SAIDI和SAIFI。SAIDI系统平均停电持续时间和SAIFI系统平均停电频率的定义分别为$$SAIDI \frac{\sum 用户停电持续时间}{\sum 用户数} \frac{\sum U_j \cdot N_j}{N_{total}}$$$$SAIFI \frac{\sum 用户停电次数}{\sum 用户数} \frac{\sum \lambda_j \cdot N_j}{N_{total}}$$其中 U_j 为节点 j 的年停电小时数由蒙特卡洛模拟统计得到λ_j 为节点 j 的年停电次数N_j 为节点 j 的用户数。这两个指标从频率和持续时间两个维度刻画可靠性是电网企业考核配电网运行水平的标准指标。6. NSGA-II求解流程与代码实现6.1 Problem类的封装pymoo框架要求自定义问题继承Problem类并实现_evaluate方法。核心代码如下from pymoo.core.problem import Problem from pymoo.core.mutation import Mutation from pymoo.core.crossover import Crossover import numpy as np class HybridPlanningProblem(Problem): def __init__(self, data_model, line_candidates, pv_candidates, ess_candidates): n_line len(line_candidates) n_pv len(pv_candidates) n_ess len(ess_candidates) self.data_model data_model self.line_candidates line_candidates self.pv_candidates pv_candidates self.ess_candidates ess_candidates self.n_line n_line self.n_pv n_pv self.n_ess n_ess # 决策变量线路段为二进制PV/ESS段为实数 xl np.concatenate([np.zeros(n_line), np.zeros(n_pv), np.zeros(n_ess)]) xu np.concatenate([np.ones(n_line), np.full(n_pv, 2.0), # 光伏上限2MW np.full(n_ess, 1.0)]) # 储能上限1MWh super().__init__(n_varn_linen_pvn_ess, n_obj2, xlxl, xuxu) def _evaluate(self, x, out, *args, **kwargs): f1 np.zeros(x.shape[0]) # 经济性 f2 np.zeros(x.shape[0]) # 可靠性(EENS) for i in range(x.shape[0]): line_status, pv_capacity, ess_capacity self.decode_individual(x[i]) # 拓扑连通性检查 if not self.check_topology(line_status): f1[i] 1e10 f2[i] 1e10 continue # 经济性评估 f1[i] self.calc_lcc(line_status, pv_capacity, ess_capacity) # 可靠性评估低精度快速版 f2[i] self.calc_eens_fast(line_status, pv_capacity, ess_capacity) out[F] np.column_stack([f1, f2])注意f1和f2中使用了1e10作为拓扑不合法方案的惩罚值。这比直接丢弃该个体要好——NSGA-II的进化机制能够通过惩罚值信息引导搜索远离非法区域如果直接丢弃算法在稀疏可行域中很容易陷入停滞。6.2 算法参数配置NSGA-II的主要参数设置如下参数取值说明种群规模100综合考虑收敛性和计算耗时最大进化代数200以Pareto前沿的Hypervolume指标变化率判断收敛交叉概率0.9SBX交叉分布指数ηc20变异概率1/n_var多项式变异分布指数ηm20选择机制锦标赛选择锦标赛规模2终止条件进化代数达200或HV变化率1%双判据保证收敛这里需要强调的是变异概率设为1/n_var是遗传算法的经典经验值表示平均每个个体有一位基因发生变异。但由于本文的决策变量包含二进制段和实数段我复写Mutation类时按段分别处理二进制段变异概率取1/n_line实数段变异概率取1/(n_pvn_ess)。6.3 约束处理策略除了辐射状约束采用惩罚函数外电压约束采用类似方式处理如果潮流计算后发现节点电压越限在f1中增加一个与越限量成正比的惩罚项。这样做的好处是不需要显式地在NSGA-II中实现复杂的约束支配比较机制实现简单且对多目标进化算法的侵入性最小。惩罚系数的标定有个经验值电压越限量每超过1%在f1中增加相当于项目总投资5%的惩罚。这个系数需要根据实际算例调整如果惩罚过小会出现大量电压越限的方案混入Pareto前沿如果惩罚过大则搜索容易被局部最优困住。6.4 并行化加速NSGA-II的评估过程是天然的并行任务——每个个体的适应度计算互不依赖。Python中可以使用multiprocessing.Pool实现并行评估。由于可靠性评估的蒙特卡洛模拟本身需要大量随机数并行执行时要注意为每个进程设置独立的随机种子避免多个进程产生相同的随机序列。我的实现方式是在_evaluate方法中对每个个体调用multiprocessing.Pool.map执行批量评估。这里有一个性能优化的关键点进程间通信的开销不容忽视因此每次map传递的应该是一批个体而不是单个个体。在种群规模100的情况下一次map调用处理10~20个个体通信开销占比可以降到5%以内。7. 算例验证与结果分析7.1 测试系统构建算例基于IEEE 33节点系统扩展而成。原始IEEE 33节点系统是一个经典的辐射状配电网测试系统基准电压12.66kV有32条支路、5个联络开关。为构建混合配电系统场景我做以下扩展在节点8、节点24、节点30增加光伏接入候选在节点14、节点30增加储能接入候选新增两条直流线路节点8→直流节点D1负荷0.4MW节点24→直流节点D2负荷0.3MW新增三条候选交流线路用于增强主干网的转供能力所有负荷节点按用户类型分为三类居民60%、商业25%、工业15%。系统的基准容量为10MVA基准电压12.66kV。7.2 Pareto前沿分析经过NSGA-II优化得到的经济性-可靠性Pareto前沿如下图所示。横轴为全生命周期成本万元纵轴为EENSMWh/年。前沿呈现典型的L形特征在经济成本从4000万元增加到5500万元的区间EENS从280MWh/年急剧下降到40MWh/年可靠性提升效果非常显著但成本超过5500万元后继续增加投资带来的可靠性提升变得缓慢——边际效益递减规律体现得非常明显。从Pareto前沿中我选取三个典型方案做详细对比方案全生命周期成本万元EENSMWh/年SAIDIh/户·年SAIFI次/户·年光伏总容量MW储能总容量MWhA经济最优3985275.315.21.821.20.3B综合折中521046.83.10.423.80.8C可靠最优624023.51.60.214.51.0方案A几乎是裸奔方案——只建设必要线路和最小容量的DG/ESS投资最低但年缺供电量高达275MWhSAIDI超过15小时这对工业用户占15%的系统来说完全不可接受。方案C几乎用尽了所有候选投建选项可靠性很好但投资比方案A多出2255万元。方案B处于前沿的拐点位置——成本比A增加约30%但EENS下降83%是性价比最高的折中方案。7.3 与单目标优化的对比为验证双目标模型的优势我设置了一个对照组使用传统单目标模型经济性可靠性折算EENS按20元/kWh的停电损失货币化后并入经济性目标用遗传算法单目标版求解。结果对比如下对照组优化得到的最优方案成本为4860万元EENS为68.5MWh/年。将这个方案放入双目标Pareto前沿中比较发现它落在前沿的右上方——即存在另一个双目标方案成本和EENS都严格优于它。这说明单目标加权法选择的最优往往不是真正的Pareto最优根源在于停电损失单价20元/kWh的设定并不符合系统内工业用户的真实停电损失工业用户的停电损失可能是商业用户的5~10倍。还有一个发现值得注意单目标优化的方案在拓扑结构上与双目标方案有本质区别。单目标方案倾向于在重要线路附近增加联络线而双目标方案在进化过程中自动发现了一种更有效的策略——在关键负荷节点附近配置分布式光伏和储能通过孤岛运行来缓解故障影响。这种策略上的差异说明了可靠性评估嵌入进化过程中的指导性作用规划算法能看到故障发生后的失电模式并针对性地调整规划方案。7.4 光伏和储能配置的影响分析为进一步分析DG和ESS对双目标权衡的影响我做了三组敏感性分析光伏配置的影响当光伏可配置容量上限从2MW提高到4MW时Pareto前沿整体向左下方移动——相同可靠性水平下经济成本降低约8%。原因在于光伏替代了部分网架投资分布式电源就近供电减少了对新建线路的依赖。但光伏渗透率超过一定水平后总光伏容量超过系统峰值负荷的30%Pareto前沿移动变得不明显反而因为光伏出力的间歇性导致某些可靠性目标恶化——夜间光伏不出力而储能容量不足时孤岛供电能力反而下降。储能配置的影响储能对可靠性目标的贡献集中在故障后的孤岛支撑时间上。配置1MWh储能可以将短时故障修复时间小于2小时的缺供电量减少约70%。但储能对减少长时故障缺供电量的作用有限——当修复时间超过4小时储能容量耗尽后孤岛仍然失电。这说明储能与网架加固之间存在互补关系储能解决的是短时停电问题网架转供能力解决的是长时停电问题二者合力才能全面提升可靠性。线路投资的影响新增联络线的边际效益在可靠性维度上表现出明显的阶梯特性。当系统中联络线数量从2条增加到4条时SAIDI下降约40%但从4条增加到6条时SAIDI仅再下降8%。这与Pareto前沿的边际效益递减规律一致核心原因在于负荷转供能力不仅取决于联络线数量还取决于联络线所在位置的转供容量约束。8. 代码使用说明与扩展建议8.1 环境依赖与快速上手代码基于Python 3.9开发依赖库包括numpy 1.21 networkx 2.6 pymoo 0.6 matplotlib 3.5 pandas 1.4 scipy 1.7安装命令pip install numpy networkx pymoo matplotlib pandas scipy运行主程序optimize.py前需要先在data_model.py中配置系统参数和候选方案列表。代码仓库中附带了一个基于IEEE 33节点系统的默认算例配置直接运行python optimize.py即可启动NSGA-II优化过程。默认配置下单次运行约需30~60分钟视CPU核心数而定运行结束后会在results/目录下生成Pareto前沿数据文件和可视化图像。注意可靠性评估模块的随机性会导致每次运行结果略有不同。工程实践中建议固定随机种子np.random.seed(42)以保证结果可复现。在reliability.py中已经预留了seed参数接口。8.2 如何将模型适配到实际工程实际工程中的混合配电系统规划比标准算例复杂得多我在代码设计时考虑了以下几个适配点数据导入代码中的data_model.py支持从Excel或CSV文件批量导入节点和线路数据。需要准备的字段包括节点编号、节点类型变电站/负荷/DG/ESS、峰值负荷、用户数量、候选线路的起止节点和长度、候选DG/ESS的接入节点和允许容量范围。建议在工程前期就用统一的GIS数据表维护这些信息避免手工输入出错。约束条件扩展如果实际工程中有特殊约束如生态红线区域不允许新建线路、某些区域供电可靠性要求特别高可以通过继承HybridPlanningProblem类并重写_evaluate方法中的约束检查部分来实现。代码的模块化结构保证这个扩展不需要修改算法核心。多场景处理实际规划中负荷增长存在不确定性建议采用多场景规划方法——定义多个负荷增长场景如低增长、基准增长、高增长每个场景分别做可靠性评估将各场景的EENS按概率加权作为可靠性目标。这个扩展需要修改planning_problem.py中的calc_eens_fast函数使其接受场景参数。8.3 性能优化建议我在测试中发现影响程序运行速度的最大瓶颈是可靠性评估模块中的蒙特卡洛模拟。除了前文提到的两级评估策略外还可以考虑以下优化向量化随机抽样对同一元件的多年故障序列抽样可以一次性生成多年长度的指数分布随机数数组而不是逐年循环。Python中numpy.random.exponential支持向量化生成效率远高于单个循环抽样。故障模式预分析在蒙特卡洛模拟前先对所有可能的单重故障进行预分析统计每个故障导致的失电负荷集合和恢复策略。实际模拟中就无需每次都做潮流计算只需要查表得到失电信息再叠加DG/ESS孤岛运行的影响即可。这个优化可以将可靠性评估速度提升5~10倍。并行粒度调整如果使用多核并行建议在个体评估层面做并行而不是在蒙特卡洛模拟内部做并行——后者的通信开销更大加速效果远不如前者。9. 结论与经验分享本研究针对混合配电系统规划中经济性与可靠性难以协同优化的问题提出了基于NSGA-II的双目标规划框架并将序贯蒙特卡洛可靠性评估嵌入进化过程实现了规划与评估的一体化。从算例结果来看双目标模型相比传统的单目标加权法能够提供更加丰富的决策信息且不会出现看似最优、实际被支配的次优方案。这个方法不仅适用于交流/直流混合系统也适用于含高比例分布式电源的有源配电网规划、微电网群规划等场景。最后分享几点我在开发和调试过程中的体会希望对打算在此基础上做研究的同行有帮助。体会一可靠性评估模块的调试要格外小心。蒙特卡洛模拟的随机性使得单个Bug不会导致程序崩溃而是悄无声息地让结果偏离真实值。我在调试过程中曾犯过一个错误在统计SAIDI时忘记将故障元件的故障时刻计入用户停电时间导致SAIDI结果偏低约15%。这个错误在单个故障场景下完全看不出来只有通过与枚举法计算结果对比才暴露。建议每个可靠性评估模块在投入使用前先用小规模系统做枚举法验证确保统计逻辑正确。体会二Pareto前沿的形态比单个指标更重要。很多研究者在分析优化结果时只关注前沿上的几个端点和中间点忽略了前沿的形态信息。前沿的曲率变化往往能揭示规划方案的结构性转变——比如当EENS从50MWh/年下降到40MWh/年时最优方案可能从依赖联络线转供转变为依赖分布式电源孤岛运行这种结构性变化对工程决策的参考价值远大于单点指标。体会三参数敏感性分析是规划研究的必要环节。折现率、负荷增长率、设备造价等参数对最终方案的影响可能超过优化算法本身的影响。我在研究中测试了折现率从6%变化到10%的影响发现Pareto前沿上最优方案的线路投建策略会显著变化折现率低时投资方更愿意增加前期投资强度选C类方案折现率高时则倾向减少前期投资选A类近似方案。建议在正式出报告前务必做一轮完备的参数敏感性分析否则决策者会质疑结果的稳健性。体会四代码注释要写清楚为什么不仅仅是是什么。这类研究代码的生命周期通常跨越多个项目和好几年半年后再回来看自己写的代码如果只有是什么的注释根本想不起当时的取舍逻辑。我在每个关键函数里都写了一段简短的设计说明记录这个函数为什么这样实现、有哪些替代方案、为什么没选替代方案。虽然多花了一点时间但长期来看节省的时间远大于投入。本文的完整代码已整理为可直接运行的Python工程包含数据文件、优化主程序、结果可视化脚本和说明文档可供相关领域的研究人员和工程技术人员参考使用。
网站建设高端定制企业官网