
做配电系统规划绕不开一个很现实的冲突投资预算有限但供电可靠性指标又年年被考核。这两件事在多数时候是矛盾的——多上一台联络开关可靠性确实上去了但账面上多出几十万投资少装一套储能经济性好看可夏天尖峰时段电压和停电次数又不好看。我这两年一直在做混合配电系统的规划项目逐渐摸到一套比较顺手的处理方式把经济性和可靠性拆成两个独立目标用多目标优化算法去跑帕累托前沿再用序贯蒙特卡洛做可靠性评估验证方案整套流程用 Python 串起来。这篇文章就把这套技术路线的完整实现逻辑拆开讲从数学模型怎么建、目标函数怎么量化到 NSGA-II 算法怎么和配电网潮流计算衔接再到最后可靠性评估的代码怎么写适合正在做配电网规划方向课题的研究生以及想从单一目标优化转向双目标优化的工程师参考。1. 双目标规划的源起为什么单一目标在配电系统里不够用配电系统规划的经典做法通常是先算负荷预测然后按容量满足、电压合格、短路电流不越限这几个约束条件去做网架方案比选。这个思路本质上是在给定可靠性水平下找费用最低的方案也就是把可靠性当成一个固定约束。问题是可靠性到底定在什么水平才算合理这本身就是一个决策问题。你把它当成约束等于预先替决策者把答案藏起来了。我在实际项目里遇到的情况是供电公司通常有一个明确的可靠性考核指标比如年户均停电时间不能超过多少小时但规划方案一旦涉及新增分布式电源、储能这类投资较大的设备领导层就会追问这些钱花下去可靠性到底提升了多少停电损失减少了多少这时候你拿单一目标优化的结果去汇报很难讲清楚为什么是这套方案而不是另外一套更便宜或更可靠的方案。双目标规划的价值就在这里。它把方案筛选从找唯一最优解变成生成一组候选方案集让决策者直观看到经济性和可靠性之间的此消彼长。在帕累托前沿上每个点都对应一套规划方案任何一个目标变好都会让另一个目标变差。决策者可以根据财政预算或者可靠性考核压力在前沿上挑一个偏好的落点。这个视角对实际工程的意义非常大因为规划本身就不是一次算出一个答案交差的事而是反复权衡、多方博弈的过程。1.1 经济性与可靠性的矛盾具体来自哪里单纯从设备投资看想让配电网更可靠最直接的办法是增加冗余。多敷设一条联络线、多装一台分段开关、多配置一套储能这些都能在故障时快速转供或支撑重要负荷但每一样都要花钱。而分布式电源的接入更复杂一些光伏和风机装多了发电量能冲抵网损和购电费用经济性看起来不错但出力的间歇性可能导致电压越限或保护配合问题反而降低可靠性指标。储能则正好反过来初始投资很大但削峰填谷和应急供电的价值在可靠性评估里能明显体现出来。这个矛盾不是线性的。投资少的阶段每投入一笔钱对可靠性的边际提升很可观但投资超过某个阈值之后再往上加钱的提升幅度会迅速衰减。这种边际递减特性决定了双目标问题的帕累托前沿通常是一个向下凸的曲线而不是一条直线。理解了这一点后面看优化结果时就不会觉得奇怪为什么帕累托前沿右半段的点那么密集因为在那一段花费大量投资只能换来零点几个小时的停电时间改善性价比已经很低了。1.2 混合配电系统的混合到底指什么这里说的混合不是指电压等级混合或者交流直流混合那种拓扑意义上的混合而是指配电系统内同时存在传统设备与新设备、可控电源与不可控电源、交流网架与电力电子接口。典型构成包括原有辐射状配电网、分布式光伏、风电机组、储能系统可能还有少量分布式柴油发电机或燃气轮机作为可控备用。这些设备的运行特性差异很大光伏和风电几乎零边际成本但有间歇性储能响应快但能量有限柴油机可靠可控但运维成本和燃料成本高。规划这类系统时决策变量既包含离散的设备选型与安装位置又包含连续性的容量配置约束条件也涉及潮流、电压、线路载流量等多个维度。数学上这是一个混合整数非线性多目标优化问题如果用传统的加权求和法把经济性目标和可靠性目标合并成一个单目标会面临权重系数怎么定、两次求解结果如何比较等一连串麻烦。我自己的经验是少吃把多目标压成单目标的亏直接上多目标进化算法让算法自己去探索帕累托前沿后续分析时灵活得多。2. 经济与可靠性双目标模型的数学化过程把规划问题写清楚核心是三个步骤确定决策变量、构造目标函数、明确约束条件。这一步看起来是纯数学工作但里面很多细节直接决定后面 Python 代码好不好写、优化算法跑起来快不快。2.1 年综合费用如何拆分经济性目标我通常用年综合费用来表示单位是万元/年。它的物理含义是把规划期内所有与方案相关的支出一律折算成等年值这样不同使用年限的设备之间可以公平比较。年综合费用的构成主要有这么几块投资等年值设备初始投资乘以等年值系数折算到每一年。等年值系数由折现率和设备使用寿命决定公式是 CRF r(1r)^n / [(1r)^n - 1]其中 r 是折现率n 是设备寿命。光伏板寿命通常取 20 年储能电池有些项目只按 8 到 10 年算柴油机则按 15 年。算出来的结果差别挺大规划时最好分开细分设备算不要图省事统一用一个系数。运行维护费用包括设备的检修、保养、人工、消耗品等一般按初始投资的百分比估算。光伏取 1% 到 2%储能取 2% 到 3%柴油机取 3% 以上。储能这块还要考虑电池替换成本我习惯把它单独列成一项折算成每千瓦时的更换费用避免混在运维费率里失真。网损费用由潮流计算结果得到系统总网损电量乘以平均购电价。分布式电源接入后系统网损可能变大也可能变小取决于安装位置和出力曲线这属于规划方案评估中容易忽略的隐藏成本。停电损失费用这是经济性目标和可靠性目标之间的桥梁。把可靠性评估算出的缺供电量乘以单位停电损失费用就变成经济损失并入年综合费用。不过要注意如果经济性目标里已经包含停电损失费用那可靠性目标可以换成纯技术性指标比如系统平均停电持续时间或者缺供电量期望值避免两个目标之间的耦合过强导致帕累托前沿形态退化。这一点在第三章建模时需要整体想清楚。我用一个具体的模型示例来说明。设决策变量有分布式电源的安装位置和容量、储能的功率和容量、联络线选择。那么年综合费用可以写成C_total C_inv C_om C_loss C_interruption其中 C_inv Σ设备投资额 × CRFC_om 是年运维费C_loss 年网损电量 × 单位购电价C_interruption 年缺供电量 × 单位停电损失费用。2.2 可靠性目标的量化从故障率到缺供电量可靠性评估的输出指标有很多规划阶段最常用的是期望缺供电量Expected Energy Not SuppliedEENS和系统平均停电持续时间SAIDI。前者单位是 MWh/年后者是 小时/户·年。两个指标对规划方案的经济性评估都有价值EENS 可以直接乘单位停电损失费用折算成钱SAIDI 则更容易与供电公司的考核指标对应。计算 EENS 需要输入元件级的可靠性参数主要包括馈线段的故障率和平均修复时间、开关的操作时间、故障隔离时间和联络开关的转供时间。这些都是规划人员从历史统计中获得的基础数据不同类型线路差别很大。架空裸导线的故障率明显高于电缆绝缘导线介于两者之间。沿公路敷设的电缆故障率低于穿农田的电缆因为外力破坏的概率不同。我做项目时一般按线路类型、敷设环境分类设定参数而不是整个网络用同一套故障率否则评估结果和实际差距会很大。可靠性指标对负荷点的计算本质上是在枚举所有可能的故障事件及其后果。辐射状配电网中某一元件故障后部分负荷可能通过联络线转供部分负荷必须等待故障修复部分负荷甚至可能被隔离后无法恢复。每一类负荷对应各自的停电时间乘以负荷功率后得到该故障事件下的缺供电量。所有故障事件遍历完成后求和取期望就是 EENS。2.3 决策变量与约束条件的取舍规划问题的决策变量常用一个编码向量来表示。针对一个候选节点集合每个节点可能安装的光伏、风机、储能容量都从离散档位里选比如 0 kW、100 kW、200 kW、300 kW 这样。线路改造或新增联络线则用 0/1 变量表示。把这些变量拼接起来就是粒子群或遗传算法里一个个体的完整基因。编码设计上要注意变量数量不能太多否则搜索空间爆炸收敛变慢。约束条件除了潮流方程本身还包含节点电压上下限约束通常取 0.93 到 1.07 倍标幺值支路电流不超过载流量极限分布式电源总渗透率不超过设定阈值这个阈值根据不同网络情况而定储能荷电状态在调度周期内保持在一定范围防止过度充放影响寿命辐射状网络结构约束特别是涉及网架改造时不能让网络出现环网或者孤岛。约束处理方式我常用罚函数法。把越限量加权加到目标函数中让优化算法自动淘汰不可行解。这种方法实现简单但罚函数权重需要调试。权重太小不可行解会混进帕累托前沿权重太大算法探索能力下降。我一般先跑一版看输出的方案里不可行解的比例再调整权重重新跑通常迭代两三轮就能找到合适的量级。3. 求解方法选型为什么最终选择 NSGA-II多目标优化问题的主流解法包括加权求和法、约束法、多目标进化算法MOEA。这个选择直接关系建模和代码实现的难度也影响最终结果的可用性。加权求和法最容易实现把两个目标分别乘上权重 w1、w2 再相加然后跑单目标优化。缺点也很明显权重怎么取没有客观标准而且如果帕累托前沿是非凸的加权法无法找到前沿中段的一些解。我见过不少论文用加权法算双目标给出的结果只有少数几个点说服力有限。约束法是把一个目标保留为目标函数另一个目标转成约束比如可靠性指标 SAIDI 小于给定值的前提下最小化年综合费用。这个方法技术上可行通过改变阈值可以扫出一组解但每次扫描都要重新求解一次单目标问题计算开销很大尤其在可靠性评估还嵌套蒙特卡洛仿真的情况下耗时让人难以接受。NSGA-II 是处理这类问题的成熟选择。它基于遗传算法框架一次运行能生成整个帕累托前沿不需要预先指定权重。它的核心机制有两点非支配排序和拥挤度距离。非支配排序把种群中所有个体按照支配关系分成若干层第一层是当前的帕累托前沿第二层是被第一层中某些个体支配的剩余个体依次类推。这样算法的选择压力始终朝向更接近真实前沿的方向。拥挤度距离则保证同一层内个体的分布尽量均匀防止算法收敛到前沿的某一小段区域。NSGA-II 还有一个精英保留策略下一代种群由父代和子代合并后的最优个体组成这意味着算法不容易丢失已经找到的优秀解。对于配电网规划这种单次评价成本较高的场景精英保留能显著提高样本利用效率。在具体编码上NSGA-II 的遗传操作包括选择、交叉、变异。选择阶段采用锦标赛选择法从种群中随机挑几个个体比较支配关系和拥挤度性能好的留下交叉阶段对两个个体对应的变量进行交换或算术组合变异阶段则随机扰动某个变量值保持种群多样性。配电网规划问题中变量离散性强交叉可以用单点或多点交叉算子变异则结合位翻转变异和重新采样的方式。这些操作在 Python 里手写起来并不复杂而且可控性强我最终在项目里就是全部自己实现的。3.1 用现成库还是手写算法Python 生态里有多目标进化算法库比如 pymoo、Platypus、DEAP。这些库封装得比较完善直接调用 NSGA-II 很方便。但我实际用下来发现一个问题规划问题的评价函数耦合了潮流计算和可靠性评估而这些计算又依赖自定义的数据结构和前推回代求解器库自带的接口适配需要额外写不少胶水代码。与其绕一圈去适配不如把 NSGA-II 的核心逻辑自己实现评价函数直接调用自己的潮流函数。这样代码结构更清晰调试定位问题也更快。当然手写 NSGA-II 也有代价。非支配排序的经典实现是 O(MN²) 复杂度M 是目标数量N 是种群规模。规划问题里种群规模通常 100 到 200目标数只有 2这个复杂度完全可以接受。如果以后要扩展到三目标或大规模问题可以再引入快速非支配排序的优化版本或者观察是否需要上 MOEA/D。做项目时先跑通为主后续优化留到有真实需要时再说。3.2 NSGA-II 与配电系统评价函数的耦合方式优化算法和评估函数之间的关系是整条技术路线的关键桥梁。一个个体解码后是一套完整的规划方案评估它需要两步走。第一步是潮流计算。给定这个方案下的网络结构、分布式电源出力和负荷数据用前推回代法计算各支路电流、各节点电压和系统网损得到经济性评价所需的网损费用。如果潮流不收敛说明该方案极不可行直接给一个很大的罚值。第二步是可靠性评估。用序贯蒙特卡洛模拟法输入该方案对应的网络拓扑和元件可靠性参数随机模拟若干年的元件故障、修复和转供过程统计系统的缺供电量和停电时间指标。这一步是整个流程中计算量最大的部分。两者的顺序也很讲究。如果潮流算法已经判断方案不可行比如电压越限很严重就没必要再跑可靠性仿真了直接淘汰掉省下不少计算时间。这类先粗筛后精算的流程在工程优化里非常常见也是方案可行性和计算效率之间的一种平衡。4. Python 实现细节从数学模型到可运行代码这一节讲代码怎么落地。配电网规划仿真代码框架其实不复杂但细节决定成败。我会把几个关键的数据结构和核心函数展开来讲照着这个思路基本能复现出完整的代码框架。4.1 配电网数据结构的构建配电网本质上是一张有根的树状图。根节点是变电站出口母线其余节点是负荷节点或开关节点边是馈线或联络线。我用两个 Python 类来表示Node 类和 Branch 类。Node 记录节点编号、父节点、负荷有功与无功、电压幅值、电压相角以及接入的分布式电源类型和容量Branch 记录支路首末节点、支路电阻电抗、允许载流量以及是否属于联络线。class Node: def __init__(self, index, load_p0.0, load_q0.0): self.index index self.load_p load_p # 有功负荷单位 kW self.load_q load_q # 无功负荷单位 kVar self.voltage 1.0 # 电压标幺值 self.dg_p 0.0 # 接入分布式电源有功出力 self.dg_q 0.0 # 接入分布式电源无功出力 self.parent -1 # 父节点编号 class Branch: def __init__(self, start, end, resistance, reactance, capacity): self.start start self.end end self.r resistance self.x reactance self.i_max capacity self.is_tie False # 是否联络线网络拓扑在规划中不是固定的因为决策变量中包含线路改造或新增连接。所以每次评估一个个体时要先根据解码后的安装方案修改相应的 Branch 对象和 Node 对象再重新构建邻接表。构建邻接表用的是最直接的字典映射节点编号做键值是一个列表存放该节点相连的所有支路和邻居节点信息。这个结构虽然朴素但胜在清晰、不易出错。4.2 前推回代潮流计算在辐射状配电网里前推回代法是配合度最高的潮流算法。思路分两步回代时从末端节点往根节点方向逐段累加支路电流和功率损耗前推时从根节点往末端节点方向逐段更新节点电压。往复迭代几轮直到电压变化小于阈值潮流就算收敛了。def back_forward_sweep(nodes, branches, max_iter50, tol1e-6): for _ in range(max_iter): # 回代计算每条支路的电流和功率损耗 for branch in reversed(branches): end_node nodes[branch.end] start_node nodes[branch.start] # 节点功率 负荷功率 - 分布式电源出力 - 父支路流入功率 power complex(end_node.load_p - end_node.dg_p, end_node.load_q - end_node.dg_q) current (power / complex(end_node.voltage, 0)).conjugate() # 累加到父支路 start_node.load_p end_node.load_p start_node.load_q end_node.load_q # 前推更新节点电压 for branch in branches: end_node nodes[branch.end] start_node nodes[branch.start] delta_v (complex(end_node.load_p, end_node.load_q) / complex(start_node.voltage, 0)).conjugate() * \ complex(branch.r, branch.x) end_node.voltage abs(complex(start_node.voltage, 0) - delta_v) return nodes这段代码是原理演示性质实际工程中还要考虑支路电流限制、变压器抽头、无功补偿设备的影响。但核心思想就是这样每一轮更新都基于上一轮的电压和功率假设收敛速度在配电网这种浅网络上通常是够用的。要注意的是如果网络结构改变比如新增了联络线前推回代前需要先做拓扑排序确保支路顺序是分层明确的否则迭代容易不收敛。4.3 序贯蒙特卡洛可靠性评估的代码落地可靠性评估这块我把序贯蒙特卡洛的核心逻辑拆成三个部分元件状态采样、故障事件遍历、指标统计。元件状态采样采用状态持续时间抽样法。对每个元件根据其故障率参数 λ 抽样一个正常运行持续时间再根据修复率 μ 抽样一个修复时间。这两个时间都是指数分布的随机变量可以用random.expovariate直接生成。这样一年 8760 小时内每个元件会经历若干次故障-修复循环。故障事件遍历是指某一元件处于故障状态时分析它对各个负荷点的影响。这需要知道网络拓扑中哪些负荷可以通过联络线转供、哪些被隔离、哪些必须等待修复。实际代码实现时我对每个故障元件执行一次网络分割操作以故障支路为缺口用宽度优先搜索识别哪些节点在主网侧、哪些节点在故障下游。下游节点中如果存在联络线且联络线容量足够则这部分负荷停电时间仅为切换操作时间否则停电时间等于元件修复时间。由此累计缺供电量。def reliability_assessment(nodes, branches, fault_rate, repair_time, n_years2000): ens_total 0.0 # 总缺供电量单位 MWh saidi_total 0.0 # 总停电时间单位 小时/户 for _ in range(n_years): for year in range(1): # 每年 for branch in branches: # 模拟该支路的故障次数 n_fault np.random.poisson(fault_rate * 8760) for _ in range(n_fault): repair_h np.random.exponential(repair_time) # 计算受影响负荷 affected_load, affected_customers find_affected_load( branch.start, branch.end, nodes) ens_total affected_load * repair_h saidi_total affected_customers * repair_h return ens_total / n_years, saidi_total / n_years这里find_affected_load需要结合电网拓扑来判断故障后哪些负荷真正停电。如果网络中有联络转供路径停电时间就不是修复时间而是切换时间统计逻辑要更精细。这个函数我强烈建议单独写成一个模块因为它是整个可靠性评估里最容易出 bug 的部分。测试时用经典的两馈线手拉手算例验证一下确保逻辑没有问题。4.4 双目标优化主循环的组装有了评价函数NSGA-II 的主循环就顺理成章了。初始化种群时随机生成一批个体每个个体解码后对应一套规划方案。评价完所有个体后进入迭代锦标赛选择父代、交叉和变异生成子代、父子代合并做非支配排序、按拥挤度截断生成下一代。重复若干代后输出第一层非支配个体作为帕累托前沿。def nsga2(pop_size, num_generations, nodes_data, branch_data, limits): population init_population(pop_size, limits) for generation in range(num_generations): # 评价 for ind in population: if not ind.evaluated: ind.fitness evaluate(ind, nodes_data, branch_data) # 生成子代 offspring create_offspring(population) for ind in offspring: ind.fitness evaluate(ind, nodes_data, branch_data) # 合并与选择 combined population offspring fronts fast_non_dominated_sort(combined) new_pop [] for front in fronts: if len(new_pop) len(front) pop_size: new_pop.extend(front) else: crowding crowding_distance(front) front_sorted sorted(front, keylambda x: x.crowding, reverseTrue) new_pop.extend(front_sorted[:pop_size - len(new_pop)]) break population new_pop return get_pareto_front(population)这个循环看起来简单但实际跑起来有几个性能瓶颈。可靠性评估函数最耗时如果每个个体都要模拟几千年种群一百个体迭代一百代总计算量是千万级的抽样次数。我的处理方式先跑一个较小的仿真年数比如 500 年做快速评估把明显差的方案淘汰掉最后保留的结果再用较长的仿真年数重新精确评估。这种两阶段精化策略能节省大量时间。5. 仿真实例与结果解读光讲理论不够我拿一个典型的配电系统作为示例把整个流程串起来演示一遍。这里采用常见的 IEEE 33 节点测试系统在部分节点上增加分布式电源候选位置并在两组馈线之间设置可选的联络线。5.1 测试系统设定与场景设计IEEE 33 节点系统是配电网研究中用得最广泛的标准算例原始数据网上到处都能找到包括线路参数和负荷分布。我在这个基础上做了两类扩展一是设定五个候选节点可以安装光伏和储能容量档位按 100 kW 的步长递增二是设定两条可选的联络线用于故障时转供负荷。这样决策变量的数量保持在合理范围便于观察优化算法的行为。方案对比设置了三个场景场景 A基础网架不新增分布式电源仅作可靠性评估基准场景 B允许接入分布式光伏但不装储能场景 C允许同时接入光伏和储能并且可选联络线。三个场景分别用 NSGA-II 跑帕累托前沿对比不同选项组合对经济性目标和可靠性目标的影响。这样设置能清楚看出储能在双目标规划里的真实价值。5.2 帕累托前沿的形态分析与方案选取跑完优化之后把种群中第一层非支配个体对应的两个目标值画成散点图横轴是年综合费用纵轴是期望缺供电量 EENS就能清楚看到帕累托前沿的形状。场景 A 的结果只有一个点因为没有任何决策变量可选经济性和可靠性都是固定值。场景 B 的前沿是一条下降的曲线费用越低EENS 越高反过来想要更可靠就得装更多光伏投资随之上升。场景 C 的前沿整体在场景 B 前沿的左下方这说明同时配置储能和联络线确实能实现用更少的钱达到同等可靠性或同等费用下可靠性更好这也是混合系统相对传统系统的主要优势所在。前沿上的拐点很有意思。左端靠近横轴的点年综合费用最低但 EENS 很高原因是不装任何设备故障只能被动等待修复右端则相反光伏、储能、联络线全装上费用高企EENS 很低但曲线走势已经趋于平缓说明继续增加投资的边际收益已经很小。实际决策时通常选择曲线上斜率发生明显变化的拐点附近再留一点可靠性的裕度。这样既不会浪费投资又能保证绝大多数考核场景下满足指标要求。5.3 结果稳定性与参数敏感性的验证优化的结果不能看一遍就信。我额外做了两组验证第一组是随机数种子稳定性测试用不同的随机种子重复跑几次 NSGA-II对比最终前沿的差异范围第二组是参数敏感性分析针对单位停电损失费用、分布式电源投资单价、故障率这三个关键参数各取高、中、低三档观察帕累托前沿整体位置和形态的变化幅度。从结果看单位停电损失费用对前沿形态的影响最明显。这个参数本质上衡量了用户停电产生的社会成本如果定得高优化会倾向于牺牲一点经济性换取更高的可靠性定得低前沿会整体向低成本方向移动。投资单价和故障率的变化也有影响但主要表现在部分区域的方案排序上不会改变整体趋势。这种敏感性分析对写报告特别有用因为它向决策者展示了方案推荐结论对参数假设的依赖程度而不是给一个貌似精确实则脆弱的唯一答案。5.4 复现过程中的几个大坑代码层面的坑主要集中在三个方面。第一是潮流程序在新增 DG 后的收敛性问题。光伏出力大的时候线路末端电压可能抬升当前推回代算法迭代次数不足时很容易误判为不收敛。我的对策是把最大迭代次数放宽到 100并且把收敛判据从节点电压变化改为节点注入功率残差改进后基本不再出现误判。第二是蒙特卡洛评估的随机波动。仿真年数不够时EENS 的估计值方差很大导致同一套方案前后两次评估结果差很多进而干扰优化算法对个体优劣的判断。前面提到的两阶段评估策略就是专门解决这个问题的先粗后精、先选后验。第三是 NSGA-II 种群规模与迭代代数的搭配。配电网规划的评价函数单次耗时在秒级种群和代数设得太大整体计算可能要数小时甚至更久。我的经验是问题规模不算特别大时种群 80 到 120、迭代 60 到 100 代已经能得到形态完整的前沿再往上加收益递减反而明显。6. 从仿真到落地几个值得关注的扩展方向前几章讲的是一套完整可运行的技术骨架。实际做工程时这套骨架还需要往几个方向做扩展我把自己踩过的坑和下一步思路也一并说一下。6.1 时序负荷与出力数据的重要性多数配电网规划的简化做法是用年最大负荷进行潮流计算评估结果偏保守。但分布式光伏的出力天然随时间变化储能更是靠时间差套利不用时序数据储能的规划结果会有系统性偏差。我现在做项目时至少会用典型日的方式选取夏季、冬季、过渡季各一个典型日每 24 小时一个时点负荷和光伏出力都按曲线输入。这样年综合费用里的网损计算和停电损失计算都比单点计算准确得多代码实现上只是把潮流计算多包一层时间循环而已计算量翻几倍但完全可接受。6.2 不确定性场景的分析光伏出力和负荷本身就存在很强的随机性用确定性的典型日代替全时序是一种近似。要想更严谨可以引入场景生成与削减技术用历史数据聚类出几十个典型场景每个场景带有概率权重分别评估目标函数后按概率加权求和。这样做的好处是优化结果对不确定性的刻画更真实坏处是计算量成倍增加。折中的做法是在优化迭代中使用少量代表性场景快速评估最终确定方案后再用全部场景做一次精算验证这个思路和前面两阶段蒙特卡洛评估是同一个套路。6.3 可靠性参数的分区差异化不同用户对停电的敏感度差很多医院、数据中心、通信基站这些重要负荷的停电损失费用可能是普通居民的几十倍。规划时如果把所有负荷都用同一个单位停电损失费用得到的最优方案可能过度重视末端居民负荷而忽略了关键用户的需求。我在可靠性评估里会为每个负荷节点或区域设置一个权重系数把 EENS 拆成普通负荷 EENS和重要负荷 EENS两部分分别计算指标。这样优化出来的方案往往会在重要负荷附近多配置一些储能或联络线这个细节在实际汇报中非常加分。6.4 储能配置问题的专项建模储能是混合配电系统里最特殊的设备因为它既能提升可靠性又能通过峰谷套利降低运行费用。但储能电池的寿命受充放电次数和深度影响规划时如果不建模寿命衰减优化算法会把储能容量往大里推因为算出来的收益很漂亮实际上电池提前衰减后收益远没那么多。我习惯在目标函数里加一个电池循环老化成本项按实际模拟出的年充放电次数折算损耗费用。这个成本项对最终储能容量的推荐值影响很大特别是前沿右半段加了这项之后储能配置的尺寸会明显更克制、更贴近工程实际。回到最初的问题经济性和可靠性到底谁优先我的答案从来不直接给而是让帕累托前沿替我说。作为规划者我的任务是把前沿尽可能完整、可信地呈现出来把每个决策对投资和停电的影响算清楚这才是这套 Python 实现的核心价值所在。项目代码里我一直把参数做成外部配置文件让每次运行都能调整故障率、电价、停电损失费用这些关键参数跑出的结果也始终保留原始记录方便后续追溯。这套流程跑顺之后支撑我做其他配电网规划项目时省了非常多重复造轮子的时间。