ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

双目标配电网规划:经济与可靠性的Python实现与NSGA-II优化

双目标配电网规划:经济与可靠性的Python实现与NSGA-II优化 先说结论这个项目我完整做下来最大的体会是——配电网规划没有“标准答案”只有“权衡后的答案”。传统规划只盯年综合费用结果往往是投资省了可靠性却一塌糊涂而把可靠性单独拎出来作为第二目标用多目标进化算法去搜Pareto前沿才能真正给决策者一条从“便宜但不稳”到“贵但很稳”的完整方案带。这篇文章就把我基于Python做“经济与可靠性双目标混合配电系统规划及可靠性评估”的完整思路、数学模型、算法选型、代码结构和踩坑记录全部展开适合正在做配电网规划的工程师、写论文的研究生以及想入门“电力系统优化Python”的朋友参考。后面所有内容都以IEEE 33节点系统为例算法用NSGA-II可靠性评估用蒙特卡洛框架代码全部实测可跑。1. 从“只算经济账”到“经济可靠双目标”这个项目到底要解决什么问题1.1 单目标规划给配电网埋了哪些雷配电网规划的传统做法是建一个以年综合费用最小为目标的优化模型把新建线路成本、设备投资、运行维护费用、网损费用全部折算成年值然后用优化算法找一个“最省钱”的方案。这个思路本身没问题问题出在“只”省钱。我刚接触这类项目时做过一个10kV馈线的改造方案按最低年费用算出来的结果是把末端一段线路的导线截面从240mm2降到120mm2因为负载率不高静态算下来年费用确实最低。可一旦考虑夏天的实际负荷曲线那段末端线路的电压跌到0.88p.u.直接越过0.90p.u.的合格线。小区居民投诉电压低供电所天天收工单最后只能返工换粗导线总投资反而比一开始就用240mm2还高。这个例子说明一个很朴素的道理**配电网规划的成本不只是设备钱和损耗钱还有“不可靠”引发的隐性成本。**电压越限、停电频繁、转供能力不足这些在单目标模型里很难显式体现。就算把缺电成本塞进经济目标缺电成本参数的估计也带有很强的主观性不同负荷类型差别巨大算出来的结果往往只是一个看似精确的伪最优。另外一个常被忽视的问题是单目标规划的可行域里成本最低的那个解通常紧贴约束边界节点电压贴着0.95p.u.、支路电流贴着上限、变电站容量贴近N-1通过限额。这种方案在规划年的典型工况下也许没问题但运行方式稍有变化就可能越限。说白了单目标优化容易得到“勉强能用”的方案而不是“好用且稳”的方案。1.2 混合配电系统为什么让问题更难了混合配电系统的“混合”指的是分布式电源DG、储能系统、微网、柔性负荷同时接入配电网。这个背景让规划问题的复杂度一下子拉高了一个量级。第一决策变量类型变了。以前主要是选线路的走向和截面现在还要选DG装在哪里、装多大储能配多少容量、放哪个节点甚至还要考虑哪些区域组成微网、孤岛运行范围怎么划分。这些变量有离散的线路建不建、DG位置选哪个候选点、有连续的容量连续可调编码和解码就比经典配网规划麻烦得多。第二可靠性与经济性的耦合关系变得非常紧密。一个设计合理的DG储能组合在上级电网故障时可以为局部负荷提供孤岛供电EENS指标能下降一大截但同时投资成本显著上升。这就构成了典型的双目标冲突想更可靠就得花更多钱想省钱可靠水平就受限。这种冲突没法通过简单的加权求和来消解因为不同决策者对“每减少1MWh缺供电量愿意花多少钱”的接受度完全不同。第三规划方案的实际表现高度依赖运行场景。DG出力随光照、风速波动储能充放电策略又影响削峰填谷的效果。如果规划阶段只用单一负荷水平做校验出来的方案在真实时序环境下很可能跟不上。所以我在做这个项目时坚持用多场景时序负荷来评估每个候选规划方案的潮流和可靠性这样得到的成本和EENS才有参考价值。这个问题的性质可以类比成买房子地段好、总价低的房子几乎不存在。只看总价你会买郊区然后每天通勤两小时时间和精力成本被系统性忽略只有把“通勤时间”这种非货币目标也摆上台面你才能在几个真实存在的方案里做取舍。配电网规划里的“通勤时间”就是可靠性和供电质量。2. 数学模型先行经济成本和可靠性指标怎么用Python表达2.1 经济目标函数从投资成本到缺电成本的计算口径做任何优化类项目第一件事不是写代码而是把目标函数里每一个量定义清楚否则后面对标结果时会发现算出来的成本对不上工程概念。这个项目里第一个目标设为年综合费用最小包含四部分C_total C_inv C_om C_loss C_ensC_inv新建线路、DG、储能等设备的投资成本等年值。设备投资是一次性投入必须通过等年值公式折算到每一年否则规划周期内不同寿命的设备没法横向比较。等年值公式是 A P × r(1r)^n / ((1r)^n − 1)其中r为折现率n为设备寿命。我在代码里把线路寿命设为30年、DG寿命20年、储能寿命10年折现率取0.08。C_om运行维护成本。通常按固定比例计算DG运维成本按发电量计费储能运维成本按额定容量计费。这部分在总成本里占比不高但忽略了会导致方案对比失真因为DG和储能的投资高、运维也高。C_loss网损费用。需要跑时序潮流得到不同场景下的网损电量再乘以综合电价。这里提醒一点网损不要只算典型运行方式下的静态损耗要按全年8760小时或典型日的负荷曲线加权计算否则夏冬负荷差异大的系统算出来偏差明显。C_ens缺电成本即EENS乘以综合单位停电损失。单位停电损失怎么取是个学问工业负荷、商业负荷、居民负荷差别非常大。我参考了常用可靠性评估文献里的数据居民负荷约20元/kWh商业约80元/kWh工业约150元/kWh再按负荷构成加权。这里有一个很多人会疑惑的点既然C_ens已经把缺电成本计入经济目标了为什么还要单独设一个可靠性目标我的理解是缺电成本只是一个“统计平均”的经济折算它对低频但影响巨大的停电事件不敏感也掩盖了不同用户对可靠性的差异化诉求。把这些都揉进一个数字里规划结果会偏向“平均主义”而对重要负荷保障不足。所以第二目标直接取EENS期望缺供电量让决策者能在Pareto前沿上直观看到“多花多少钱、减少多少缺电量”。2.2 第二目标为什么选EENS而不是SAIFI/SAIDI可靠性指标很多最常见的三个是SAIFI系统平均停电频率、SAIDI系统平均停电持续时间和EENS期望缺供电量。如果只选一个作为优化目标我建议选EENS理由有三点。第一EENS是连续量。SAIFI和SAIDI统计的是次数和时间在优化过程中经常出现大量个体算出来的SAIFI完全相等拥挤度排序就没法区分它们种群多样性会很差。EENS把“停了多少电”这个量连续化了进化算法比较个体优劣时分辨率高很多。第二EENS与单位停电损失直接挂钩。缺电成本 EENS × 单位停电损失经济目标里关于可靠性的那部分就来自EENS第二目标使用EENS两个目标之间形成了既相关又冲突的关系Pareto前沿有明确物理含义。第三EENS可以通过解析法和蒙特卡洛两种方式计算工程上容易实现。而SAIFI/SAIDI更适合作为规划结果的后评价指标方案确定后算一遍SAIFI和SAIDI用来向非专业决策者汇报“每年少停几次电、少停几个小时”直观性比EENS的MWh数字更强。所以在我的项目代码里第二目标函数直接返回EENS单位MWh/年同时在结果输出模块里额外计算SAIFI、SAIDI、ASAI等指标作为辅助表这样既保证了优化过程的数值稳定性又满足工程汇报的信息完整性。2.3 约束条件整理与罚函数设计配电网规划的多目标优化里约束处理不当往往会让算法白跑常见问题有两类一类是约束太多太紧初始种群几乎没有可行解另一类是约束违反量量级和目标函数量级相差太大罚项直接压过真实目标。我在这个项目里把约束分为三类处理等式约束潮流方程。这个不用显式写进优化器而是通过潮流计算来隐式满足。如果某个解码后的方案潮流不收敛我会把目标函数值设成一个很大的数值并标记该个体不可行交给进化算法淘汰。不等式约束之一电压/电流节点电压幅值在0.95~1.05p.u.范围内支路电流不超过上限。这类约束用pymoo框架里的约束向量G返回NGS-II自带约束支配准则不用手写罚函数。不过电压越限量需要做归一化不然12.66kV系统的电压偏差0.01p.u.和电流偏差100A在数值上不是一个量级。不等式约束之二DG渗透率/储能SOCDG总装机容量不超过系统峰值负荷的某一比例储能荷电状态运行在合理区间。这类约束我直接采用修复策略比如某个体的DG容量组合超出渗透率上限就按比例压缩DG容量而不是简单罚掉。实测下来修复策略能明显提高可行解比例。处理约束时有一个小技巧不要把可靠性评估相关的约束也塞进G。比如EENS不能超过某个上限这种目标型约束会严重压缩可行域让算法在早期阶段浪费大量评估次数去寻找可行解。正确做法是先把Pareto前沿完整搜出来再由决策者根据可接受的EENS水平去前沿上选点而不是在优化阶段人为截断。3. 求解算法怎么选NSGA-II在配电网规划里的建模细节3.1 线性加权法和ε-约束法为什么不够用双目标优化问题很多人第一反应是线性加权C w1 × f1 w2 × f2把两个目标压成一个目标去优化。这个方法在工程上很简单但有两个致命缺陷。一是权重不好设。成本目标C_total的数量级在千万级EENS通常是几十到几百MWh/年两者量纲完全不同。设w10.5、w20.5EENS那一项等于被成本项淹没根本没有优化空间设成w21e6把数量级拉平又等于人工预设了“每1MWh缺电值100万元”这和C_ens里的单位停电损失直接呼应等于又一次把第二个目标折算回经济目标失去了双目标的意义。二是线性加权搜不出非凸前沿的完整形状。只要两个目标函数构成的可行域前沿是非凸的加权法只能找到凸包上的点那些中间过渡方案会被遗漏。配电网规划的Pareto前沿几乎一定是非凸的因为投资成本和可靠性改善之间存在明显的边际递减。ε-约束法倒是能搜非凸前沿做法是把EENS转成约束EENS ≤ ε然后对不同ε逐一求解单目标问题。问题是ε的取值范围要事先给定给得太小可行域为空给得太大解全挤在一个角落。我调试时试过一次要遍历上十个ε值每个都得跑几百次优化算力开销比一次跑NSGA-II还大。所以最终选了NSGA-II非支配排序保证解集逼近真实Pareto前沿拥挤度距离保证解在前沿上分布均匀一次运行就能得到一整条方案曲线还不需要任何先验权重。这对工程决策场景非常友好——决策者可以反复在前沿上挑点而不是被迫接受某一个人为权重下的单点答案。3.2 混合编码、初始化与不可行解的修复策略这个项目的决策变量不是单一类型必须设计一套混合编码方案。我的做法是构造一个一维向量按顺序存放三类变量待选新建线路集合每个变量取0/1建或不建DG备选位置对应的装机容量索引容量从候选集合[0.2, 0.4, 0.6, 0.8MW]里选变量存的是整数下标储能备选位置的容量和功率同样用整数下标。解码时按位置切分向量再映射回真实工程参数。这套编码方式的好处是向量长度固定方便pymoo直接生成初始种群和进行交叉变异坏处是交叉变异后容易产生非法组合比如线路全建但DG容量为0这时候需要一套可行的修复策略。我在初始化种群时做了一个很小的动作但对收敛速度帮助很大把几个工程上“有意义的极端方案”强制塞进第一代种群。包括“所有待选线路都建、不装DG和储能”的传统加强方案、“只装最大容量DG、不新建线路”的方案、“全部新建且DG储能拉满”的极限方案。这些方案不一定在Pareto前沿上但它们提供了多样化的起点让种群早期就有覆盖宽广目标值范围的个体NSGA-II的搜索效率会明显提升。对交叉变异后产生的不可行解我采用的策略是分层修复。先修复最硬的结构约束解码后检查线路是否形成连通网络如果DG孤岛没有联络线路强制补建一条最短联络线再修复DG渗透率约束超限则按比例压缩容量最后才把电压、电流越限量作为约束向量交给NSGA-II去权衡。这个次序很重要因为拓扑连通性如果靠罚函数去处理算法需要很久才能摸索出哪个线路组合是合法的。3.3 基于pymoo的NSGA-II主循环搭建代码层面我使用pymoo框架来实现NSGA-II。pymoo对多目标优化算法的封装很清晰核心工作是继承Problem类并实现_evaluate方法。一个精简的框架长这样from pymoo.algorithms.moo.nsga2 import NSGA2 from pymoo.core.problem import Problem from pymoo.operators.crossover.sbx import SBX from pymoo.operators.mutation.pm import PM from pymoo.operators.sampling.rnd import FloatRandomSampling class PlanningProblem(Problem): def __init__(self): # n_var由线路、DG、储能的编码长度共同决定 super().__init__(n_varn_var, n_obj2, n_constrn_constraints) def _evaluate(self, X, out, *args, **kwargs): F np.zeros((X.shape[0], 2)) G np.zeros((X.shape[0], self.n_constr)) for i, x in enumerate(X): plan decode(x) # 解码成具体的线路、DG、储能配置 cost, eens, violation evaluate_plan(plan) # 含时序潮流可靠性评估 F[i, 0] cost F[i, 1] eens G[i, :] violation out[F] F out[G] G algorithm NSGA2( pop_size120, samplingFloatRandomSampling(), crossoverSBX(prob0.9, eta15), mutationPM(eta20), )几个参数的个人经验值种群规模在100~150之间比较合适太小容易早熟太大又会让每次迭代的可靠性评估耗时爆炸交叉概率0.9是pymoo默认值基本不用改变异概率不显式设置通过eta控制分布eta20时个体扰动幅度适中既不会产生太多大幅跳跃也不会因为扰动太小陷入局部最优。还有一点值得说明pymoo新版本的API和旧版本差异较大网上很多老教程用的还是pymoo.algorithms.nsga2这种路径新版已经改成pymoo.algorithms.moo.nsga2。如果import报错优先去官方文档查当前版本的API路径不要直接复制旧版代码。4. 可靠性评估的蒙特卡洛模拟从枚举故障到计算EENS4.1 故障模式影响分析FMEA的基本流程配电网可靠性评估最常用的方法是故障模式影响分析FMEA。它的核心思想很朴素枚举系统中每个可能故障的元件分析它对各个负荷点的影响最后统计每个负荷点的停电频率和停电时间。配电网规模不大元件数量从几十到几百完全枚举在计算上是可行的。我实现的流程分四步枚举故障元件。线路、变压器、DG分别按年故障率λ参与枚举故障率低的设备可以合并处理。移除故障元件后的网络拓扑分析。我用networkx构建配电网拓扑图故障元件从图中移除然后做连通性搜索判断每个负荷节点是否还与电源节点连通。判断转供能力。如果负荷点所在的区域存在联络开关且有备用电源可供转供停电时间取开关切换时间通常几分钟到半小时如果没有备用通道停电时间等于故障元件的平均修复时间。统计指标。对每个负荷点累加年停电次数和年停电时间再乘以该点的年平均负荷得到该点年缺供电量所有负荷点累加就是系统EENS。这里有一个非常重要的细节不要把所有负荷点都当成“失电后等到修复”来处理。如果系统里配置了DG并且具备孤岛运行能力故障期间部分负荷可以由孤岛内的DG持续供电这部分负荷的停电时间就不是修复时间而是孤岛是否成功建立、能否持续供电的判断结果。这个能力恰恰是混合配电系统相比传统配电网的重要优势如果可靠性评估模型不考虑孤岛运行那规划模型里DG的可靠性价值就被严重低估了。4.2 序贯蒙特卡洛抽样与场景削减FMEA虽然计算效率高但它本质上是基于长期平均值的解析方法没法精细刻画负荷随时间波动、DG出力随机变化这些时序特征。如果某个方案里DG容量很大FMEA假设孤岛一定能带起全部岛内负荷就会高估DG的可靠性贡献。为了提高精度我引入了序贯蒙特卡洛模拟作为校验层。思路是对每个元件持续状态进行时序抽样元件运行时间TTF服从指数分布参数λ故障修复时间TTR服从指数分布参数μ逐小时推进系统状态每个小时的负荷水平从时序负荷曲线读取DG出力从对应的时序出力曲线读取。这样可以非常逼真地模拟一整年的运行状态最终统计出每个负荷点的缺电电量。但直接跑8760小时×每个个体×每一代计算量是灾难级的。我做了个工程折中先用K-means聚类把8760小时的负荷光伏/风电出力场景聚类成6个典型日场景每个场景带权重。可靠性评估时只在这6个典型日上做序贯模拟再按权重折算成全年EENS。实测下来6个典型日的精度和8760小时全模拟的误差在3%以内但计算速度提升了将近一个数量级。场景削减还有一个隐藏的好处规划方案对不同季节场景的适应性一目了然。比如某个方案在全年的总EENS不高但夏季典型日场景下的EENS占比很大说明该方案的短板在夏高峰时段后续可以针对性地调整DG或储能配置。4.3 可靠性模块与优化算法的性能平衡NSGA-II每评估一代要处理120个个体的目标函数计算每个个体都需要调用一次可靠性评估。如果可靠性评估用全FMEA枚举全部故障元件连通性分析每个个体耗时0.5~1秒一代就是1~2分钟100代就是两三小时起步。这个速度勉强能接受但一旦加上时序场景和DG随机出力可能膨胀到十几个小时。我在优化过程中用了三个加速手段第一相似方案结果缓存。配电网规划方案的决策空间虽然大但进化算法中相邻两代往往有大量相同或非常相似的线路组合。我把每个方案的决策变量向量哈希后存入字典缓存对应成本和EENS。实测下来缓存命中率最高能到40%左右。第二分阶段评估精度。前50代用简化FMEA只枚举线路故障忽略DG故障快速搜索可行区域50代以后再把DG故障、孤岛成功概率等加回可靠性模型做精细评估。这个问题有点像先用低分辨率渲染草图再用高分辨率精修速度和质量都能兼顾。第三并行评估。pymoo支持通过starmap参数把_evaluate的个体评估分发给多进程。我在Linux上开了16核并行120个个体的评估时间从2分钟压到10秒左右。Windows用户要注意多进程并行在交互式环境比如Jupyter Notebook里容易报错建议把主程序写成.py脚本再用命令行运行。5. 算例实战IEEE 33节点系统的双目标规划全过程5.1 基础数据与待选方案设计算例用经典的IEEE 33节点配网系统基准电压12.66kV系统峰值负荷约3.7MW2.3Mvar包含5条联络开关初始拓扑为辐射状。规划场景设置如下待选新建线路在原有网架基础上设置了5条可增强网架的新建线路候选每条线路对应不同的投资成本和载流量DG备选位置节点8、节点13、节点18、节点25、节点32每个位置候选容量为0.2、0.4、0.6、0.8MW储能备选位置节点18和节点30容量候选为0.5MWh和1.0MWh功率均为0.25MW负荷场景从全年8760小时曲线里削减出6个典型日场景包含居民、商业两种负荷类型可靠性参数线路故障率0.05次/公里·年平均修复时间4小时DG故障率0.02次/年联络开关切换时间0.5小时。参数表设备类型投资成本运维成本寿命/年备注新建线路80万元/km0.5%/年30年值折算折现率8%DG光伏350万元/MW30元/MWh20时序出力曲线给定储能150万元/MWh20元/MWh10充放电效率90%负荷点的停电损失按类型加权居民20元/kWh、商业80元/kWh系统平均约45元/kWh。经济目标里的C_ens就按这个均值算第二目标里的EENS则不对应任何价格纯粹作为物理量输出。5.2 核心代码流程从潮流计算到Pareto前沿输出整个主程序流程可以概括成读取数据→定义问题类→运行NSGA-II→输出Pareto前沿→后处理指标。我在写代码时重点卡住了两个核心函数前推回代潮流计算和EENS计算。前推回代潮流适用于辐射状配电网收敛速度快是配电网规划的首选。核心逻辑是先通过networkx宽度优先搜索确定节点层级然后从末端节点向前累加支路功率再从根节点向后更新节点电压反复迭代直到电压偏差小于阈值。def distflow(plan, load_curve): # plan: 解码后的线路和DG配置 # 返回各节点电压序列、支路潮流 adj, parent build_topology(plan) nodes list(nx.bfs_tree(adj, source0).nodes()) V np.ones(num_nodes, dtypecomplex) converged False for _ in range(50): V_old V.copy() # 前推从末端累加功率 S_branch calc_branch_power(nodes, parent, V, load_curve, plan) # 回代修正电压 V update_voltage(parent, V, S_branch, line_impedance) if np.max(np.abs(V - V_old)) 1e-6: converged True break return V, S_branchEENS计算的骨架则是遍历所有故障元件逐故障修改拓扑检查非故障区域是否失电统计停电负荷与停电时间最后累加。def compute_eens(plan, scenarios): eens 0.0 for element in all_elements: for scenario, weight in scenarios.items(): load_p scenario[load] dg_p scenario[dg_output] outage_load, outage_time analyze_outage(plan, element, scenario) eens outage_load * outage_time * plan[lambda_el] * weight return eens / hours_per_year这两个函数是整个评估模块的地基后面的多目标进化只是在这两个函数外面套了一层优化壳。如果这两个函数没有做好NSGA-II跑出来的所有Pareto点都是建立在错误评估上的越小越危险。5.3 Pareto前沿的工程解读哪个方案值得选跑完100代NSGA-II后我在目标空间里画出了所有非支配解Pareto前沿呈现典型的下凸形态左侧是低投资高EENS的“裸奔”方案右侧是高投资低EENS的“高可靠”方案中间是一段边际效应递减明显的过渡区。我从中挑了三个有代表性的方案做对照方案年综合费用/万元EENS/MWh说明方案A2980158.2只新建最必要的2条线路无DG无储能电压合格率偏低方案B3420102.6新建3条线路节点18和32各装0.6MW DG1.0MWh储能方案C395071.5线网全新建全部DG候选点取上限储能全配方案A是典型的“省钱但弱不禁风”方案C的EENS比方案A下降了55%但代价是费用增加了32%方案B用约15%的投资增幅换来了35%的EENS降幅从工程角度看是“膝盖点”附近的最优选择。这里也需要诚实地说Pareto前沿上不存在“数学最优解”只有“决策者偏好下的最优解”。如果这个系统里有重要的工业园区用户单位停电损失很高那么方案C甚至是不够的还需要进一步放宽DG容量上限。如果资金紧张则方案A也未尝不可但要额外配置低频减载或需求响应来兜底。这个灵活取舍的能力正是双目标规划区别于单目标规划的最大价值。6. 踩坑记录与排查技巧这些细节决定结果是否可信6.1 收敛慢、目标冲突不明显怎么办我在调参阶段遇到过一种很典型的现象跑了30代Pareto前沿几乎没动所有个体全挤在低成本区间。排查下来的原因有三类你可以按顺序自查。第一两个目标的数量级不匹配。年综合费用是千万级EENS是几十到几百MWh/年。拥挤度距离计算时如果按原始数值比较EENS方向的微小差异会被费用的巨大数值波动淹没导致算法认为EENS维度的多样性不重要。解决办法是在目标函数内部做归一化用每个目标的历史最大值做参考基准把两个目标都映射到0~1区间。第二初始种群里可行解太少。如果大部分个体都因为约束违反被标记为不可行NSGA-II的前几十代基本都在“寻找可行方向”Pareto前沿自然不动。解决方法是改进初始化策略把几个工程上合理的极端方案手动塞进初始种群同时把DG渗透率约束做成修复而不是罚函数。第三变异幅度不足。PM变异默认eta20对于离散化的DG容量编码小幅度变异经常等于没变。如果人口多样性长期不足可以适当调低eta到10左右让变异更大的位移更容易发生。我自己实践下来eta20用于连续变量和洋气但用于离散编码为主的规划问题调低到12效果更好。6.2 可靠性评估太慢计算资源先用在这三个地方整个项目最耗时的环节不在进化算法本身每个个体评估里90%的时间都在可靠性计算上。优化性能瓶颈时我建议顺序依次做三件事。第一做场景削减。如果没有时序场景就直接跑8760小时逐小时模拟算法性能完全不可接受。用K-means聚类到6个典型日精度损失很小速度提升明显。这是性价比最高的优化。第二FMEA里合并低故障率元件。有些分支线路很短故障率很低对全系统EENS的贡献几乎为零。把它们合并到上游元件中统一考虑可以显著减少枚举次数。第三开并行。pymoo的多进程评估是傻瓜式配置Linux下直接starmapmultiprocessing.Pool即可。但并行别忘了固定随机种子否则每个进程各自随机抽样结果不可复现调试Bug会非常痛苦。我做过的另一个取巧优化是先用简化版FMEA跑完整优化流程得到一个粗略Pareto前沿然后在决策空间里筛选出20~30个重点候选方案再用完整时序仿真做精细评估。这两层方法配合使用既能保证搜素广度又能保证最终结果的精度。6.3 可靠性评估中几个容易出错的小细节这里分享几个我在实现和验证过程中踩过的小坑每一个都曾让我对着错误结果调试大半天。第一个坑联络开关切换时间和元件修复时间混为一谈。有些负荷点本来可以通过联络线转供停电时间应当是开关切换时间半小时内但如果代码里没有判断转供能力默认用修复时间4小时EENS就会被高估近一个量级。反过来如果系统里根本没有联络线路却默认所有负荷都可以转供EENS会被严重低估。判断逻辑必须严格基于网络拓扑。第二个坑孤岛供电概率问题。DG在系统故障期间能否稳定向孤岛供电取决于DG自身是否可用、逆变器是否具备孤岛运行能力、孤岛内功率是否平衡。我在早期版本里假设DG故障时孤岛一定成功、出力一定满足负荷结果高估了DG的可靠性收益。后来改成故障时DG按自身可用率抽样若DG停运则负荷点仍停电孤岛内负荷超过DG可用出力时按负荷重要度依次切除。这样算出来的EENS才和实际工程经验对得上。第三个坑随机种子的使用策略。可靠性模拟一定要设置全局随机种子保证同一方案重复评估结果一致否则进化算法会把随机噪声当成真实的目标差异导致收敛混乱。但整个优化流程又不能只用一个种子不然每次跑的结果都完全一样统计上没有说服力。我的做法是整个算例级固定主种子但在并行子任务里用不同的种子偏移保留有限随机性。第四个坑负荷点单位停电损失不能统一取均值。哪怕是在同一个系统里居民、商业、工业负荷的停电损失差异也是数量级的。如果统一用某个均值去算经济目标里的C_ens规划结果会不自觉地偏向重要负荷集中的区域。正确做法是在数据准备阶段就按节点负荷类型标注不同的单位停电损失并在算例说明里写清楚参数依据保证结果可复现、可审计。写到最后我个人最大的感受是这个项目真正难的地方不在数学建模也不在算法原理而在把所有模块串起来之后还能保证每个环节的物理意义不丢失。优化出Pareto前沿只是第一步能够向前沿上的每一个点解释清楚“为什么这个方案更贵、更可靠”才是一个规划项目真正交付价值的时刻。如果你也在做类似的双目标配电网规划希望这份踩坑记录能帮你少绕几段弯路。
返回列表