含光伏接入的14节点配网储能选址定容模型优化——基于改进粒子群算法的程序实现
近几年分布式光伏在配电网侧的接入比例越来越高,但光伏出力的间歇性和随机性也给配网运行带来了不小的麻烦。电压越限、潮流倒送、网损上升这些问题,做配网规划的朋友应该都不陌生。储能系统作为灵活性资源,能削峰填谷、平抑波动,但储能设备成本高,装在哪里、装多大容量,直接决定投资回报和运行效益。
我一直在做配电网优化规划方面的研究,这次用一个含光伏接入的IEEE 14节点配网系统,把储能选址定容问题建模成优化问题,再用改进粒子群算法去求解。整个过程从模型构建、算法设计到程序实现都完整跑通了,收获了不少经验。这篇把思路和细节整理出来,给同样在做配网储能规划、尤其是想用群智能算法解决这类问题的朋友做个参考。
1. 问题建模与整体思路拆解
1.1 为什么光伏接入配网需要配套储能
先说说我为什么选这个课题。光伏接入配网之后,出力的随机性是最头疼的问题。晴天中午光伏出力高峰,如果负荷水平低,就会出现功率倒送,馈线末端电压抬升,甚至越过上限。阴天或者傍晚光伏出力骤降,又得靠上级电网补充功率,电压波动加剧。
储能系统的作用就是充当缓冲池。光伏出力高的时候充电,把多余的能量存起来;光伏出力低或者负荷高峰的时候放电,支撑电压、削峰填谷。但储能不是随便装的,装错了位置和容量,不仅效果差,还可能造成投资浪费。所以选址定容问题本质上是:在满足配网运行约束的前提下,找到储能接入节点和配置容量的最优组合,让综合效益最大化。
这里有个关键认知:储能选址定容不是简单的线性规划问题。储能的位置是离散变量,容量是连续变量,潮流方程是非线性约束,加上光伏出力的时序特性,这就构成了一个混合整数非线性规划问题。传统优化方法比如线性规划、梯度下降,处理起来非常吃力,所以启发式算法是主流选择。粒子群算法结构简单、收敛速度快、参数少,是这类问题的经典求解工具。
但基础粒子群算法有个明显短板:容易早熟收敛,陷入局部最优。所以我在标准PSO基础上做了一系列改进,后面会详细讲。
1.2 14节点系统的选择与适配
为什么选IEEE 14节点系统?一个很直接的原因:节点数量适中。相比动辄几十上百节点的实际馈线,14个节点的拓扑规模对一个教学型、研究型的课题来说刚刚好——既能体现优化问题的复杂性,又不至于让潮流计算和算法迭代慢到影响调试效率。同时,IEEE 14节点系统本身就是公开的、标准化的测试系统,有明确的线路参数和负荷数据,方便复现和横向对比。
当然,直接用IEEE 14节点输电网数据做配网分析并不完全合适。我做了一些改造:把线路参数和负荷水平调整到配网电压等级(10kV),将部分节点设置为分布式光伏接入点,负荷数据按典型日曲线分时段处理。
改造后的系统包含1个平衡节点(变电站母线)、13个PQ节点(负荷节点和光伏节点),光伏接入点选在日照条件好且负荷密度适中的节点,这个设置是为了测试光伏就地消纳和远距离传输两种场景下的储能配置差异。
1.3 优化目标的确定与权衡
储能选址定容的优化目标需要综合考虑多个维度。很多文章只考虑一个目标,但实际工程中,单一目标往往顾此失彼。
我最终采用了多目标加权的方式,把三个核心指标综合成一个适应度函数:
- 配电网年综合网损费用:网损直接反映运行经济性,光伏接入后潮流的双向流动会导致网损变化,储能配置合理的系统能有效降低网损。
- 电压偏移惩罚:维持电压在合格范围内是配网运行的基本要求,用节点电压偏离基准值的程度作为惩罚项,防止优化结果出现电压越限。
- 储能投资与运维成本:储能系统的单位容量投资成本、单位功率投资成本折算到全生命周期,运维成本按年计算。
三个目标通过权重系数合成总目标函数。这个权重怎么定?我的做法是先用理想点法估算各目标的量级,然后按工程关注度分配权重。如果偏重运行经济性,网损权重大一些;如果偏重电压质量,偏移惩罚权重提高。实际代码里权重做成可配置参数,方便不同场景切换。
2. 储能选址定容模型描述与约束处理
2.1 目标函数的数学表达
优化目标我写成:min F = w1 * f_loss + w2 * f_voltage + w3 * f_cost
网损费用f_loss是典型日24个时段的网损之和乘以电价再乘365天。网损本身由潮流计算得出,因为系统结构简单,我用的是基于牛顿-拉夫逊法的三相平衡潮流计算,把每个时段的有功和无功功率注入代入,求解各节点电压幅值和相角,再算线路损耗。
电压偏移f_voltage我用的是所有节点在24个时段中电压偏差的平方和再取平均,这个指标能反映整个系统的电压质量水平。电压越限的情况在这个指标里会显著放大,因为偏差平方之后惩罚更大。
储能投资成本f_cost,这个稍微细说一下:
- 储能额定容量C为决策变量,单位容量投资成本设为c_p。
- 储能额定功率P为另一个决策变量,单位功率投资成本设为c_e。
- 年运维成本按投资成本的一定比例折算。
- 储能寿命按10年计算,每年总成本 = 投资成本/寿命年限 + 运维成本。
这里有一个工程上常见的问题:容量和功率两个变量不是独立的。储能系统的容量决定了能存多少能量,功率决定了充放电速度。为了简化模型,我采用了常见的做法:按最大充放电需求来匹配功率,在编码时把容量作为决策变量,功率根据容量和最大充放电倍率计算得出。
2.2 约束条件与处理策略
约束条件分为三类:
等式约束是潮流方程。每个节点的有功和无功注入必须满足功率平衡方程。潮流求解在每次适应度计算时都要调用,是程序里计算量最大的部分。
不等式约束包括:
- 节点电压上下限:各节点电压幅值在0.95到1.05标幺值之间。
- 线路传输功率上限:避免过载。
- 储能SOC约束:荷电状态在10%到90%之间,不能过充过放。
- 储能安装位置限制:候选安装节点是预设好的,不能随意安装在所有节点。
不等式约束的处理直接影响算法收敛性。我用的方法是外部惩罚函数法。具体来说,对越限的电压,在目标函数里加上一个惩罚项,惩罚系数随迭代次数逐渐增大。
为什么用动态惩罚系数而不是固定惩罚系数?因为迭代早期,粒子分布分散,如果惩罚太重,算法会过早陷入可行域边缘的局部最优;惩罚太轻,后期又可能收敛到不可行解。动态增大的方式让算法前期有足够的搜索空间,后期逐步收紧,保证收敛结果的可行性。这个方法效果很好,实测下来比固定惩罚系数的收敛成功率高了不少。
2.3 光伏出力与负荷的时序建模
光伏出力和负荷都是时变的,所以不能只做单一断面的静态优化,要做典型日的时序仿真。
我用的方法:选取典型日,将一天分为24个时段。光伏出力用典型日的光照强度曲线换算,负荷用典型日负荷曲线。两组曲线叠加,形成24个断面的注入功率数据。
光伏出力曲线我采用了工程上常用的Beta分布模型近似,但为了简化计算,实际代码里用的是归一化的光照强度曲线乘以光伏装机容量。每个光伏接入节点的装机容量是预设的,比如节点6和节点11各接入800kW光伏。
负荷曲线这边,我按工业负荷和居民负荷的典型比例分了类。整体负荷峰值出现在晚间,光伏出力峰值在正午,这个时序错位恰好构成储能的套利空间,也是选址定容模型的核心动机之一。
3. 改进粒子群算法的设计与实现
3.1 基础粒子群算法的局限
标准粒子群算法的核心公式不复杂:
- v_id = w * v_id + c1 * r1 * (pbest_id - x_id) + c2 * r2 * (gbest_id - x_id)
- x_id = x_id + v_id
其中w是惯性权重,c1和c2是学习因子,r1和r2是[0,1]均匀分布的随机数。
标准PSO有两个突出问题。第一,惯性权重w固定时,全局搜索和局部搜索无法兼顾。w大了全局搜索强但收敛慢,w小了收敛快但容易陷入局部最优。第二,粒子一旦聚集到某个局部最优附近,所有粒子的个体最优和全局最优都指向同一个区域,速度更新趋近于零,算法就失去了跳出局部最优的能力。
针对这两个问题,我对算法做了三个方向的改进。
3.2 改进点一:自适应惯性权重策略
惯性权重我采用了非线性递减加扰动的方式。基础形式是线性递减从0.9到0.4,但这个策略在单峰问题上表现好,在多峰问题上容易错过全局最优区域。
我的改进是让w同时依赖迭代进度和粒子适应度的离散程度。具体公式:
w = w_min + (w_max - w_min) * (1 - t/T)^alpha + sigma * rand
这里的alpha是衰减指数,sigma是扰动幅度,rand是随机数。当迭代前期w维持在较高水平,粒子有更强的全局探索能力;后期w整体下降,但扰动项能让粒子保持一定的跳出能力,不至于完全停滞。
实测对比中,加了扰动项的版本比纯线性递减版本的成功率提高了约15%。
3.3 改进点二:动态学习因子与停滞检测
学习因子c1和c2决定了粒子向个体经验和群体经验学习的权重。我采用的是异步变化策略:c1从2.5递减到0.5,c2从0.5递增到2.5。
这个设计思路是:迭代初期粒子应该更多地参考自己的历史经验,保持个体多样性,不要过早向群体靠拢;迭代后期群体已经积累了较优解,粒子应该更多地跟随群体方向,收敛到最优解附近。
同时我加了一个停滞检测机制。如果全局最优在连续迭代10次内没有改善,判定为停滞状态。进入停滞状态后,随机选取一定比例的粒子重新初始化位置和速度,但保留它们的个体最优值。
这个操作相当于模拟了进化算法中的变异机制,帮助群体跳出局部最优。我把重新初始化的粒子比例设为30%,实测效果比较理想。
3.4 粒子编码方式与边界处理
粒子编码是整个程序的核心设计之一。每个粒子的位置向量对应一个候选解,我设计了两种编码方式对比:
第一种是二进制编码位置:位置向量长度等于候选安装节点数,每个位置取0或1,表示该节点是否安装储能。
第二种是容量混合编码:分两段,第一段是二进制段,长度等于节点数;第二段是实数段,长度等于节点数,对应每个节点安装储能的额定容量。
实际测试下来,第二种方式更灵活,因为能同时优化位置和容量。但需要注意一个细节:当第一段某位为0时,对应的容量位在解码时必须置为0,否则会出现“没有安装储能却有容量”的矛盾,造成资源浪费和约束冲突。
边界处理我用了反射法。当速度更新后粒子位置超出边界时,不像常规方法那样直接截断到边界值,而是按超出的距离对称反射回来。这个做法的好处是粒子的多样性保持得更好,而且速度方向被自然反转,有利于稳定收敛。
4. 程序架构与核心代码解析
4.1 整体架构与文件组织
程序结构我分为五个模块:
- 主优化模块:负责粒子群迭代、改进策略实现、结果输出。
- 配电网模型:定义节点、线路参数,形成节点导纳矩阵。
- 潮流计算模块:实现牛顿-拉夫逊潮流求解。
- 储能模型:定义储能参数、SOC计算逻辑。
- 时序场景数据:管理24时段的光伏出力和负荷数据。
模块化的好处是方便替换和调试。比如你想换一个33节点系统,只需要改配电网模型和时序数据两个模块,优化算法部分完全不用动。
4.2 核心代码讲解一:粒子初始化
粒子初始化我用了一种基于混沌映射的方法。常规做法是直接用随机数生成初始位置,但随机数在搜索空间里的分布并不均匀,会出现某些区域粒子密集、某些区域几乎没有粒子的情况。
我用了Logistic混沌映射:
x(n+1) = mu * x(n) * (1 - x(n))
其中mu取3.9左右,此时系统处于混沌状态,生成序列在[0,1]区间内遍历性较好。把混沌序列经过缩放变换映射到储能容量的取值范围,得到容量段的初始值。
实测中混沌初始化的种群比随机初始化的种群多样性更好,迭代初期的平均适应度下降速度更快。
4.3 核心代码讲解二:适应度计算流程
适应度计算是调用最频繁的部分,每迭代一轮,每个粒子都要算一次。计算流程是:
第一步:解码粒子位置,得到储能安装位置和容量。 第二步:更新储能模型参数,确定各时段储能的充放电策略。 第三步:对24个时段逐一调用潮流计算。 第四步:累加网损费用、计算电压偏移、加储能成本。 第五步:判断约束越限,叠加惩罚值,返回总适应度。
这里储能的充放电策略不是优化变量,而是用规则控制:光伏出力大于负荷时充电,负荷大于光伏出力时放电,SOC达到上下限时停止。这种规则简单有效,避免把充放电时序也纳入优化导致变量维度爆炸。
性能优化方面,有两个重要技巧。第一个是潮流计算的初值复用:24个时段中,相邻时段的潮流解相近,把上一时段的结果作为下一时段的初值,能显著减少迭代次数。第二个是矩阵稀疏化:14节点系统虽然不大,但节点导纳矩阵本身就是稀疏的,用稀疏矩阵存储和运算比稠密矩阵快不少,迭代多轮之后这个优势很明显。
4.4 核心代码讲解三:改进流程主循环
主循环的基本流程:
每次迭代对每个粒子执行:更新速度和位置,边界反射,计算适应度,更新个体最优。然后选出全局最优,进行停滞检测,判断是否触发粒子重置。最后更新惯性权重和学习因子。
一个重要的工程细节:粒子群算法对随机种子敏感。同一组参数,不同随机种子跑出来的结果可能差异明显。
我在程序里加入了多次运行机制,默认跑10次,取最优结果的同时记录平均收敛代数。这样不仅给出了最终结果,还能评估算法的稳定性。实际交付时,建议把每次运行的中间结果都保存下来,方便分析算法表现和排查问题。
从执行效率来看,在Python环境下,14节点系统、24时段、30个粒子、100次迭代,单次完整运行大约需要3到5分钟。这个速度对于研究和工程验证是可接受的。
5. 仿真结果与对比分析
5.1 改进PSO与标准PSO的收敛性对比
我把改进算法和标准粒子群算法做了多组对照实验。两组算法使用相同的种群规模30、相同迭代次数100、相同的目标函数和约束条件,唯一区别是改进策略。
标准粒子群在迭代到大约35代时基本停滞,全局最优适应度稳定在某个值附近不再变化。改进算法在迭代前30代和标准算法差距不大,但在40代之后仍然有小幅度的优化空间,并且后期又出现了几次明显的“跳变式”下降——这就是停滞检测和粒子重置机制在起作用的时刻。
从最终结果看,改进算法找到的解比标准算法好了一个档次。我用20组随机实验做统计,改进算法找到最优解的组数是13组,标准算法只有4组。这说明改进策略确实有效提升了跳出局部最优的能力。
5.2 储能选址定容的最优方案
以下是一组典型配置结果(具体数据经过脱敏处理):
| 节点编号 | 储能额定容量(kWh) | 储能额定功率(kW) |
|---|---|---|
| 4 | 520 | 130 |
| 7 | 380 | 95 |
| 11 | 460 | 115 |
这个方案对应的全年综合费用比不装储能的基础场景下降了约9.6%,其中网损费用减少了约15%,电压偏移指标下降了约40%。
选址规律很有意思:储能倾向于安装在距离光伏接入点有一定电气距离、但负荷水平较高的节点。节点4正好处于光伏接入点和负荷中心之间的关键位置,既承接了光伏的功率传输,又缓解了下游负荷的供电压力。节点11紧挨着光伏接入点,更适合就近存储光伏电量、减少倒送。这个规律和电气理论分析一致:储能应该发挥“功率缓冲”和“电压支撑”的双重作用。
电压改善效果上,安装储能后,光伏出力高峰时段各节点电压的抬升幅度显著减小,原本接近1.05上限的节点电压降到了1.02左右。这直接验证了储能对电压越限的抑制能力。
5.3 参数敏感性分析
粒子群算法的效果受参数影响很大。权重系数、种群规模、迭代次数,这些参数的设置直接决定结果的好坏。
种群规模不建议小于20,太小了全局搜索能力严重不足。我测试过10个粒子的配置,10次运行里有一半以上陷入很差的局部最优。种群规模30以上时,结果就比较稳定了,但超过50之后改善不明显,计算时间却线性增加。性价比最高的区间是30到40。
迭代次数100次对14节点系统是够用的。改进算法一般在70代之后收敛,最后30代作为稳定性确认。如果系统节点数增加,迭代次数也要相应增加,经验值是节点数乘以8左右。
还有一个容易被忽视的参数:混沌映射的mu值。mu在3.85到4.0之间时混沌特性最强,mu接近3.0时系统会进入周期状态,生成的初始种群多样性很差。这个我踩过坑,初始结果异常稳定地差,花了半天排查才发现是初始化出了问题。
6. 常见问题与排错实战
6.1 潮流计算不收敛怎么排查
这是跑程序时最容易遇到的问题,而且报错信息往往很含糊。以牛顿-拉夫逊法为例,不收敛最常见的原因是初值选取不当,或者网络参数设置有误。
排查思路是这样的:第一步,检查节点导纳矩阵是否对称正确,特别是线路参数的单位换算。单位搞错是常见错误,比如把欧姆写成标幺值,或者漏掉了变压器变比。
第二步,检查PV节点的设定。含光伏接入的配网模型中,光伏通常处理为PQ节点(有功无功恒定)或PI节点(有功恒定、电流恒定),如果处理成PV节点反而会出问题,因为配网电压等级下光伏逆变器的无功调节能力有限。
第三步,检查负荷功率是否合理。如果某节点负荷功率远大于该节点的短路容量,潮流会很难收敛。可以试着把负荷按比例缩小,看能不能收敛,逐步排除问题。
第四步,调整迭代初值。我用的是平启动,也就是所有PQ节点的电压幅值设为1.0,相角设为0。如果系统重载或者含强非线性元件,可以尝试用前次潮流结果做热启动。
6.2 粒子群早熟收敛的应对
早熟收敛表现为:所有粒子的位置趋于一致,全局最优在很长迭代代数内没有更新。解决办法除了前面提到的停滞检测和粒子重置之外,我还试过两种辅助策略。
第一种是精英反向学习。每次迭代结束后,对全局最优粒子做一个反向解,也就是关于搜索空间中心对称的镜像解。如果反向解的适应度更好,就用它替换当前全局最优。这个策略在多个优化问题上都有不错的效果。
第二种是速度限制的调整。标准PSO里,最大速度Vmax通常取变量范围的一定比例,比如20%。如果Vmax太大,粒子容易飞过最优区域;太小则探索能力差。我测试下来,容量变量的Vmax取搜索范围的15%左右效果最好。
6.3 结果不稳定的处理
如果你跑同一个程序两次,结果差异很大,优先排查随机性相关的部分。第一,确认随机种子是否固定。调试阶段固定随机种子,便于对比分析;实际运行阶段建议跑多次取最优。第二,确认混沌参数是否在混沌区间,mu值处在周期窗口时初始化质量会急剧下降。第三,检查停滞检测的参数是否合理,重置比例太小对跳出局部最优帮助不大,太大会破坏收敛稳定。
6.4 常见报错与解决方案速查
| 报错现象 | 可能原因 | 解决方法 |
|---|---|---|
| 潮流计算内迭代发散 | 初值不当或线路参数错误 | 平启动改为热启动,检查标幺值换算 |
| 储能容量为负值 | 边界处理缺反射逻辑 | 在速度更新后立即做边界反射 |
| SOC越界导致目标波动大 | SOC约束未在充放电策略内控制 | 充放电规则里加入SOC上下限判断 |
| 优化结果集中在同一节点 | 二进制段未离散化或混沌初始化失效 | 检查编码解码逻辑,检查mu参数 |
| 计算速度极慢 | 24时段潮流双重循环无优化 | 初值复用+稀疏矩阵存储 |
6.5 工程化落地经验
最后说几个工程层面的经验。
第一,代码里所有参数尽量做成配置项,不要硬编码。节点数、线路参数、光伏接入位置、储能成本参数、算法参数,全部单独放在一个配置文件里。这样后续换系统、换场景、调参数都非常方便。我见过不少项目把参数直接写在算法主循环里,改一次参数要翻大半天代码,非常痛苦。
第二,结果输出要有保存机制。每次运行结束后,除了打印结果,还要把最优粒子位置、各时段潮流结果、收敛曲线数据全部保存到文件中。这些数据对后续写报告、出图表、做敏感性分析都是必需材料。也不要只在控制台看结果,风口一关,前面的数据全没了。
第三,建议给程序加断点续跑功能。粒子群算法跑一次可能要好几分钟,如果要调参数反复跑,时间成本太高。我在程序里加了检查点机制,每10次迭代自动保存一次种群状态,程序中断后可以从最近的检查点恢复。这个功能看着费事,但实际用起来真香。
第四,潮流计算模块尽量独立。如果你想从14节点系统扩展到IEEE 33节点或者实际馈线系统,潮流计算模块要保持完全独立,通过数据接口传递网络参数,不要和优化算法耦合在一起。我第一版程序把潮流计算写在了适应度函数里,后面想换系统时差点重构整个项目,这个教训分享给大家,分层设计一定要从第一版就做起。
第五,要设计“无储能基础场景”的对照组。没有这个对照组,你也算不出储能带来的相对效益。基础的潮流计算、电压分析能力,是评估优化结果有效性的重要工具。把基础场景的网损和电压指标算出来,和优化后的方案做对比,数据说话才有说服力。
储能选址定容这个方向,模型的精细程度和算法选择都会直接影响结果质量。改进粒子群算法在14节点系统的应用只是一个开端,把代码框架做规范、把参数调教吃透,后面往更大规模系统迁移,或者加入更多分布式资源,都可以在这个基础上平滑扩展。如果大家在实际复现中遇到问题,多从编码一致性、边界约束、参数配置三个方向去排查,大部分坑都可以避免。