
配电网里接风光储听起来就是找几个节点装上机组但真正动手写代码、跑仿真的人都知道光是一个“装在哪、装多大”就能吵半天。很多规划报告写得漂漂亮亮等到落地的时候却发现电压越限、线损没降下来、储能成了摆设多数情况都是选址定容这一步没有用严格的优化方法算过。这套配电网风光储选址定容系统代码就是专门解决这个问题的它把潮流分析、风光时序建模、储能运行策略和粒子群优化算法串成一条完整链路给定网架数据和资源数据自动给出最优接入节点、装机容量和风光储配比并输出装前装后的效果对比。这篇文章我会从问题拆解、数学建模、代码模块、实操调参到常见坑位排查把这套系统完整讲一遍。无论你是在校做课题、写可研报告还是自己研究分布式电源规划代码都能从中拿到可直接参考的东西。1. 项目定位与核心问题拆解1.1 选址定容为什么是配电网规划的第一道坎配电网和输电网最大的不同在于结构。配网大多是放射状、闭环设计开环运行潮流方向传统上是从变电站往下单向送的节点电压沿着馈线逐渐降低网络损耗跟线路长度和负载分布强相关。现在一旦接入风、光、储原来的“单电源辐射网”变成了“多源网络”潮流方向可能局部反转电压分布也跟着改变。如果安装位置不对轻则局部电压抬得过高重则馈线末端电压跌破限值甚至保护配合都会出问题。选址定容这五个字本质上是“先后两阶段的问题”选址解决空间维度——分布式电源装在哪条馈线的哪个节点定容解决容量维度——每个节点装多少千瓦、几种电源怎么配比。前者影响潮流分布和电压支撑效果后者影响投资成本和设备利用率。两个问题耦合在一起分开做容易陷入局部最优一起做计算量又大这就是这个问题的第一道坎。还有个容易被忽略的点风光储不是一种东西。风电和光伏出力是波动的、不可完全控的储能是可充可放的、带时间耦合的三者组合在一起选址定容方案的好坏不仅体现在某一时刻的潮流断面上还体现在一整年时序运行的经济性和电压质量上。拿一个静态时刻做规划结果必然失真。1.2 这套代码要解决的四件事把上面的工程需求翻译成代码需求就是四个模块各司其职选址从配电网的若干节点中选出合适的接入点。候选节点有时候是整个网络的几十上百个节点有时候先做一轮筛选只保留负荷重、电压偏低、对网损敏感度高的节点进入候选池。定容对筛选出的每个接入点优化出风电、光伏、储能各自的安装容量容量要满足上下限约束不能出现负数也不能超过节点可接纳的极限。配比在总装机规模给定的前提下优化风光储三类电源的容量比例。比例不同投资成本不同、时序出力特性不同、对电网的支撑效果也不同。评估对每一个候选方案用潮流计算验证电压和潮流是否越限用时序模拟核算整年的运行费用和收益用目标函数值给方案打分排序。这四个事做完输出的不只是一个“最优方案”还有这条结论怎么来的目标函数每一项值多少、收敛曲线长什么样、跟不装DG的基线比改善了百分之几。搞工程的人应该都懂光给一个答案没有说服力带着过程数据才能拿出去汇报。1.3 和通用优化算法库的本质区别有了问题拆解很多人第一反应是“优化算法我有PSO、遗传算法工具箱一堆现成的直接拿来跑就行”。真这么干大概率会卡在目标函数评估这一步。通用优化算法库只会帮你做“粒子位置更新”“适应度排序”“收敛判断”这些纯数学操作。而配电网选址定容里的每个粒子都需要翻译成一个具体的风光储配置方案再对配电网做一次潮流计算拿到网损和电压分布再做一次8760小时的时序模拟拿到储能充放电量和全年收益。这套“从粒子解码到配电网分析”的链路才是这套代码真正花时间的地方。所以这套系统的价值不是某个算法多高级而是把配电网分析内核和优化算法完整地缝合在一起方案生成、潮流验证、时序模拟、成本核算、结果输出形成一个可以端到端复现的评估闭环。2. 计算模型把工程问题变成数学问题2.1 潮流计算内核前推回代法是怎么工作的配电网潮流计算是整套代码的底层底座方案好不好首先要看潮流算得准不准。这里我选的是经典的前推回代法也叫前推回推法。理由很简单配电网是辐射状网络支路层次关系清晰前推回代法对初值不敏感、内存占用小、迭代速度快特别适合在优化循环里面反复调用。核心思路是这样把变电站母线设为根节点电压幅值已知10kV馈线一般取1.0标幺值相角设0度。先把网络节点整理成父子层级关系确定每条支路哪端靠根节点、哪端是末端。前推过程从馈线末端节点开始向根节点方向逐层往上推。每一个节点根据自身的负荷功率、注入的DG功率算出该节点往下所有支路流过的功率总和再加上支路上的功率损耗得到父节点支路的功率。这一步算的是“功率从末端往首端汇集”。回代过程从根节点开始向末端方向逐层往下推。根据支路流过的功率和支路阻抗算出支路末端的电压降落更新每个子节点的电压幅值和相角。这一步算的是“电压从首端往末端传播”。重复前推、回代两个过程直到前后两次迭代的节点电压最大偏差小于收敛精度通常取1e-6输出各节点电压和各支路功率。核心代码骨架大致是这样def backward_forward_power_flow(bus_data, branch_data, dg_power): # bus_data: 节点负荷、电压初值 # branch_data: 支路首末端节点、R、X # dg_power: DG注入功率正为注入 V np.ones(n_bus, dtypecomplex) # 电压初始化 for it in range(max_iter): # 前推从末端到根节点计算支路功率 S_branch np.zeros(n_branch, dtypecomplex) for i in range(n_branch-1, -1, -1): # 按层级逆序 child branch_data[i][to] S_branch[i] S_load[child] - dg_power[child] \ sum(S_branch[j] for j in children_of[i]) S_branch[i] (abs(S_branch[i]) / abs(V[child]))**2 * Z[i] # 回代从根节点到末端更新电压 for i in range(n_branch): # 按层级顺序 parent branch_data[i][from] child branch_data[i][to] V[child] V[parent] - (S_branch[i].conjugate() / V[parent].conjugate()) * Z[i] if max(abs(V - V_old)) tol: break return V, S_branch注意前推回代法里前推和回代的顺序不是简单地按支路编号从1到N必须先建立支路的父子层次关系保证功率从最远端逐层汇集电压从根节点逐层传播。如果支路顺序乱掉迭代直接发散。这一段代码不算复杂但写错的人特别多。2.2 风光储电源的时序建模选址定容不能只看一个时间断面必须把风光出力和负荷的时序特性放进去。这里我做的是典型日时序每个季节选一个代表日24小时逐时段模拟这样既照顾了日内波动又不至于把优化计算量撑爆。风电出力和风速的关系是分段函数切入风速以下不发电切入到额定风速之间出力随风速近似线性增加额定风速到切出风速之间出力恒定超过切出风速停机保护。风速数据一般用实测序列或者威布尔分布随机生成规划计算里直接采用测风塔或者气象再分析数据预处理成每个代表日的24小时风速序列就可以。光伏出力跟光照强度直接相关光照强度可以用Beta分布描述但实际工程中更常用的是典型日归一化辐射曲线乘以峰值日照系数。光伏出力公式是辐射强度、组件面积、转换效率三者的乘积还要考虑温度折减。规划层面不追求逐分钟的辐照波动只用逐时辐射曲线就够。储能跟风光不一样它的状态是带记忆的。荷电状态SOC用递推公式描述SOC(k1) SOC(k) Pch(k) * η_ch * Δt - Pdis(k) / η_dis * Δt这里Pch是充电功率Pdis是放电功率η_ch和η_dis分别是充放电效率。储能运行还要满足SOC上下限约束我通常按0.1到0.9来取防止过充过放损伤电池寿命。另外要求一天运行结束后SOC回到初始值这样储能只是做日内的能量搬移不消耗也不凭空产生电量保证优化结果可以反复运行。2.3 目标函数和约束条件怎么构造目标函数是优化搜索的“指挥棒”指挥棒指错方向后面全白干。这套代码里的目标函数取的是年综合费用最小包含四项投资等年值风电、光伏、储能的初始投资乘以资本回收因子折算到每年。资本回收因子CRF r(1r)^n / ((1r)^n - 1)r是折现率n是设备寿命。年运行维护费用按装机容量乘单位维护成本计算。年网损费用用潮流算出的网损电量乘以电价。风电光伏接入位置合理时网损会降接得不好网损反而可能升高。售电收益和补贴DG发电量上网带来的收益在目标函数里作为减项。约束条件里等式约束只有一个每个节点的潮流平衡方程就是基尔霍夫定律这个由潮流计算本身保证。不等式约束有这些需要检查节点电压幅值上下限通常取0.95到1.05标幺值。支路传输功率上限不能超过线路额定载流量。DG安装容量约束单个节点不能超过该节点可接入的极限容量。总装机渗透率约束DG总容量不超过配电网最大负荷的一定比例我常用25%到30%写死了容易导致方案脱离实际。储能SOC时序约束前面说的SOC上下限和末期回到初值。违反约束怎么办代码里用罚函数方式处理。对越限的节点电压、支路过载、SOC越界在目标函数后面加一个大数惩罚项比如越限量的平方乘以1e6。这样粒子一旦跑出可行域适应度值急剧变大优化算法会自动把它淘汰掉。3. 系统代码功能模块与数据流3.1 代码总体架构是怎么搭的整套代码我按“数据-分析-优化-输出”四层来组织每个文件干一件事方便单独测试和复用。你拿到手看到的文件结构大致是这样的数据准备模块读入配电网拓扑参数、节点负荷曲线、风资源和光资源曲线统一处理成标幺值。潮流计算模块前推回代法的实现提供单时点潮流和多时点时序潮流两个接口。风光储建模模块根据资源序列生成风光出力曲线根据充放电策略更新储能SOC轨迹。目标函数模块输入一个配置方案输出年综合费用、网损、电压越限量等指标。优化算法模块粒子群优化的主循环包括粒子初始化、速度位置更新、约束处理和收敛判断。结果输出模块打印最优方案表格绘制收敛曲线、电压对比图、DG出力曲线。这种分层设计的好处是如果你想换一种优化算法比如从粒子群换成遗传算法只需要改优化算法模块目标函数和潮流计算完全不用动如果你想把典型日换成全年8760小时时序也只需要在数据准备和风光储建模模块里调整其他部分照常工作。3.2 PSO粒子是怎么编码的选址和定容塞进一个向量粒子编码是整个优化代码里最容易被忽视但又最关键的设计。我采用的是“选址变量容量变量”拼接的方式。假设候选节点有M个经过第一轮筛选每个节点上可以装风电、光伏、储能三类电源那么粒子的位置向量维度是3M个容量变量加上M个选址变量。选址变量用连续值表示比如取值范围是0到M-1靠近几就表示选哪个节点实际解码时四舍五入取整。这样选址和定容可以放到同一个连续优化框架里不需要单独设计离散变量处理逻辑。粒子更新的标准公式v_new w * v_old c1 * r1 * (pbest - x) c2 * r2 * (gbest - x) x_new x_old v_new这里w是惯性权重c1、c2是学习因子r1、r2是[0,1]均匀分布的随机数。对于选址部分的变量x_new更新后要取整并且检查是否落在候选节点范围内对于容量部分的变量要检查是否在容量上下限之间超出上限就拉回到上限低于下限就归零。为什么要花心思设计编码因为如果直接对网络所有节点都用0-1变量表示装或不装维度会随网络规模增长得很快粒子群这类群体优化算法在高维空间搜索效率会明显下降。我先把节点按电压偏低的程度、负荷密度、短路容量等指标筛一遍候选池压缩到10到20个节点既保证解空间覆盖了有潜力的位置又控制了搜索维度。3.3 储能时序协调是怎么处理的储能是这套系统里最容易出bug的部分。风电光伏在某个时段的出力只取决于该时段的风速、光照强度而储能在某个时段的充放电决策会影响下一时段的SOC时间上是强耦合的。我用的处理方式是启发式运行策略嵌套在目标函数里。具体来说每个优化粒子给出一组储能容量后运行策略这样定负荷低谷时段比如凌晨如果风、光出力大于负荷需求余电给储能充电负荷高峰时段比如傍晚储能放电优先削峰其他时段储能不动作SOC保持不变。这个充放电逻辑虽然简单但是对规划层面的容量配置完全够用能让算法评价“一个储能容量大小对年运行费用影响多少”。如果要做更精细的调度可以在内层嵌套一个混合整数优化或者动态规划求解储能的24小时充放电曲线但这样优化循环里的计算量会成倍增加。实际工程中先启发式策略做粗选中选再对内层至少数几个高排名方案做精细化调度校核这个“两阶段”思路是比较稳妥的折中。3.4 结果输出模块不能只给一个数规划报告要经得起评审不能扔一个“最优容量风电1.2MW、光伏1.8MW、储能0.5MWh”就完事。这套代码的结果输出模块会生成三样东西最优方案表格每个接入节点、各电源类型、装机容量、总投资、年费用、年网损、最大电压偏差一目了然。收敛曲线图粒子群每一代的最优适应度值和平均适应度值用于判断算法是否收敛、是否陷入早熟。方案对比图不装DG时的电压分布曲线、接入风光储后的电压分布曲线、各节点电压对比典型日里DG出力和储能SOC变化曲线。调试的时候我会先看收敛曲线如果最优适应度一直不下降或者跳来跳去先不急着加迭代次数回头检查粒子编码和罚函数设置。结果输出这个环节做得越细致后期写报告、答辩、复盘的时候就越省事。4. 实操运行流程与参数整定心得4.1 从零跑通整套代码的完整过程第一步准备数据。网架拓扑是最基本的输入支路首末端节点编号、线路电阻电抗、节点负荷的24小时曲线这些数据通常来自地理信息系统或者已有的配电网仿真模型。资源数据包括测风塔的风速小时序列和气象站的光照辐射小时序列。这一步实际上是最花时间的一步拓扑里一个节点编号写错后面所有潮流结果都是错的。第二步设置基础参数。把节点电压基准值、功率基准值、风光储的设备造价和运行维护成本、电价、折现率、设备寿命填进配置文件。我一般把所有参数集中放在一个配置文件里代码里不写死任何工程参数方便批量试算不同场景。第三步筛选候选节点。先用不含DG的基线潮流跑一遍统计各节点电压水平和负荷总量把电压偏低的节点和负荷偏大的节点挑进候选池。这一步不用搞复杂排序取前10到20个就行。第四步运行优化主程序。粒子群迭代过程中每一步都要多次调用潮流计算和时序评估程序会跑几分钟屏幕上打印每一代的收敛情况。迭代完成后自动输出最优方案和图表。第五步结果校核。把最优方案重新代入时序潮流检查是否有任何一个时段的电压或支路电流越限检查储能SOC轨迹是否全部在上下限之内检查全年网损是否真的比基线低。校核没问题这个方案才能拿去用。4.2 粒子群关键参数怎么调粒子群参数对优化结果影响很大但网上很多文章只给一堆理论值实战中还是得自己少量多次试。以下是我用这套代码反复调出来的经验参数范围参数常用范围我的建议值说明种群规模20-8040节点数和变量维度越高种群适当加大最大迭代次数100-500200先跑200代看收敛曲线不够再增加惯性权重0.4-0.90.9线性降到0.4前期全局搜索后期局部开采学习因子c1/c21.5-2.52.0/1.5c1大一点有利于多样性惩罚系数1e3-1e81e6太小约束形同虚设太大容易数值振荡惯性权重线性递减这步很关键。初始0.9让粒子跑得快全局空间里广泛搜索后期降到0.4粒子速度变慢在当前最优附近精细搜索。如果你发现结果反复在几个差不多的方案之间跳说明惯性权重降得太快或者学习因子c2偏大收敛不够稳定。4.3 目标函数权重失衡怎么处理这套代码里最常遇到的坑是跑完一轮优化发现结果里光伏装了很多、储能一点没装、风电只有一小撮。这往往不是算法的锅是目标函数里经济性比重失衡了。光伏单位造价这几年降得快、年发电小时数又高把它放在一个追求年费用最小的目标函数里优化算法当然会倾向多装光伏。但如果配电网实际需要的是“晚高峰削峰能力”光伏在晚高峰恰恰出力为零这个方案就解决不了实际问题。处理办法有两种一是给储能增加削峰填谷的收益项比如晚高峰放电电量按更高的峰值电价计算收益二是设置最小储能配置比例比如总装机中储能比例不能低于15%。这两种办法我都会用在代码里先加收益项让储能被主动选用再用最小比例约束兜底。另外还要强调目标函数里网损费用的权重不要被投资成本稀释掉。分布式电源投资是几百万量级的年网损费用可能只有几十万优化算法如果只看经济总量容易忽略网损改善目标。这时候可以把网损费用改成带权重的网损改善率或者把“网损降低”单独作为第二个优化目标做多目标优化。5. 常见问题与排查技巧实录5.1 潮流计算不收敛的排查清单这套代码里用户报错最多的就是潮流发散而且发散的原因往往是数据层面的低级错误。我总结一下经常碰到的原因支路拓扑数据错误支路首末端节点编号写反、节点编号不连续、出现了环网结构。前推回代法要求严格的辐射状结构有环就会死循环。可以用深度优先搜索遍历一遍网络检查是否所有节点都能从根节点访问到有没有形成环路。负荷单位混用节点负荷有的是kW、有的是kVA配电网里功率因数又各不相同单位不统一会导致潮流功率严重失衡。数据载入后第一件事就是统一转成标幺值并检查总负荷量级是否在合理范围。收敛精度设置过高优化算法里内嵌的潮流计算精度取1e-6足够了不需要1e-10。精度越高迭代次数越多耗时会成倍增加且对优化结果的改善几乎为零。DG注入功率导致节点电压越限接入容量过大的粒子在潮流计算中可能让末端电压超过1.1甚至更高潮流迭代会有数值震荡。我给前推回代加了节点电压限幅处理中间迭代电压超过1.15就强制拉回1.15保证迭代连续性。5.2 选址结果扎堆怎么解决粒子群优化有个典型毛病多个粒子会不约而同地把DG安在同一个重负荷节点上因为那个节点网损改善最明显、电压支撑效果最直接。这样虽然目标函数值很漂亮但实际工程中单个节点根本没有那么多可安装空间线路走廊、土地性质也不允许。我在代码里加了两道措施。第一道是候选节点筛选阶段用空间聚类把距离过近的节点合并保证候选池里任意两个节点之间有足够的电气距离。第二道是在目标函数里加“最小间隔惩罚”如果两个分布式电源接入点的支路距离小于某个阈值比如3条支路就施加罚函数。这样优化算法会自动分散布置结果更贴近工程实际。如果你拿到手的程序跑出来DG扎堆可以优先检查罚函数有没有生效再检查候选节点池是不是选得太集中。5.3 储能容量总被优化成零怎么破储能初始投资高、容量成本大目标函数追求年费用最小的情况下储能很容易被优化成零这是个高频问题。不光是代码很多可研报告里储能也常常“为了配而配”就是因为算账的时候没把储能的价值算清楚。要破除这个问题我在目标函数里对储能做了三件事一是把储能放电在负荷高峰时段的电量按峰谷电价差计算售电收益峰谷价差越大储能越有存在的价值二是增加需量电费减免收益储能放电削峰可以降低配变高峰负荷这部分收益按降低的需量乘以需量电价计算三是加最小储能比例约束兜底。三件事都做了之后优化结果里储能容量基本不会自己归零。还有一个细节储能SOC初始值不要设成随机数否则第一个时段的充放电决策会产生很大的瞬时功率波动目标函数计算值异常。我在代码里把SOC初始值固定为0.5并强制运行周期末SOC回到0.5储能才能稳定反映日内搬移的特征。5.4 结果校核拿到方案后先别急着写报告优化程序跑完输出的结果严格来说只是一个“数学最优解”不等于“工程可用方案”。我会在正式输出前做三步校核形成最终的校验模块潮流复算校验把最优粒子解码得到的接入位置和容量重新代入时序潮流扫描全年每个时段的节点电压和支路潮流看有没有漏掉的越限时刻。时序合理性校验检查储能的SOC轨迹是否平滑充放电循环次数是否合理。如果SOC曲线出现类似高频抖动的锯齿状波动说明充放电策略里缺少死区控制需要加滞回逻辑。经济性校验把目标函数拆开逐项核算投资等年值、运行维护费、网损费、售电收益和类似规模的历史项目数据做横向对比。如果投资收益率明显不合理大概率是某个参数输入有误。这三步校核跑完方案才算真正可以交付。说实话很多时候校核完才发现优化结果不可用然后回头去调参数重新跑这个过程虽然反复但确实是做规划项目最踏实的方式。6. 这套代码还能往哪些方向扩展6.1 从单目标优化到多目标优化目前这套代码的核心目标函数是年综合费用最小比较适合工程经济性评估。但配电网规划里投资最低的方案不一定电压质量最好网损最低的方案不一定碳排放最少。如果你想做更全面的方案比选可以把目标拆成多个维度年综合费用、网损改善率、电压偏差指数、碳排放量用带精英保留策略的非支配排序遗传算法NSGA-II这类多目标算法求Pareto前沿给决策者一排可行方案而非单个答案。改造工作量主要在目标函数模块里增加多个评价指标的返回优化算法模块整体替换其他部分可以复用。6.2 从典型日扩展到全年8760小时时序我前面用的是四季典型日加起来96个时段做规划优点是计算快缺点是典型日不一定能覆盖极端场景。比如夏季傍晚的短时强负荷叠加光伏出力骤降这种极端但关键的时段如果在典型日里被平滑掉了选出来的方案可能在极端工况下电压越限。扩展思路是先做全年8760小时时序潮流数据再用场景削减方法比如K-means聚类或者同步回代消除法从全年数据中提取15到30个代表性场景每个场景带权重。这样既控制了计算量又能把极端工况照顾到。这套改造主要动数据准备模块和目标函数里的时序评估部分优化算法框架不用变。6.3 从规划层面走向运行模拟层面选址定容完成后风光储系统的运行效果还需要更精细的模拟验证。目前代码里的储能策略是固定的启发式规则如果要评估“储能参与需求响应”“分布式电源参与电压调节”这些运行方式可以在代码后面接一个全时序运行模拟模块把选址定容结果作为给定边界条件然后模拟一年8760小时的逐时运行过程。注意运行模拟和规划阶段的时序评估不同规划阶段用典型日快速估算年费用可以接受运行模拟则要尽可能真实包括设备随机故障、预测误差、通信延迟等。这一层扩展之后这套系统就从“规划工具”变成了“规划运行联合仿真平台”应用的场景会大很多。最后说点实际的。这种代码项目最能拉开差距的不是优化算法本身而是数据前处理和目标函数的构建——这两件事直接决定了计算结果能不能拿出去应对实际的工程审查。粒子群迭代慢一点没关系收敛曲线难看一点也没关系只要候选节点筛选和约束条件设置得扎实结果通常就差不到哪去。我自己在反复调试中一个比较深的体会是拿到任何一批配电网数据先手工算几个简单场景比如只有一个节点接风电验证潮流代码正确性再去做整套最优搜索会顺很多。这步“从简到全”的验证习惯比任何一个参数调小技巧都管用。