基于粒子群算法的配电网光伏储能双层优化配置模型
2026/9/9 21:23:50 网站建设 项目流程

刚接触配电网规划那会儿,我最怕听到一句话:“帮我们算算,光伏该装在哪,储能该配多大?”这个问题的烦人之处在于,它不是一道简单的数学解方程题:装到不同节点,网损和电压分布完全不一样;容量配得不同,投资成本与运行收益的平衡点也会漂移。更麻烦的是,光伏出力有间歇性,储能又有时段耦合约束,一个配置方案好不好,得放进典型日时序里跑一圈才知道。

这篇文章要聊的就是我在这个方向上的完整实现思路:基于粒子群优化算法的配电网光伏储能双层优化配置模型,采用IEEE33节点作为测试算例,用Matlab跑通选址定容全流程。模型分了两层——上层用PSO做规划决策,找光伏和储能的安装节点与容量;下层在给定配置下再做运行优化,模拟储能24小时的充放电策略,把运行成本和网损反馈给上层做适应度评估。整个框架适合正在做配电网规划、分布式能源消纳、储能优化配置相关课题的同学参考,也适合想快速在IEEE33节点上验证算法效果的研究者。

下面我把建模思路、数学表达、算法设计、代码架构和踩坑经验完整拆开讲,内容比较多,建议收藏后对着项目一步步看。

1. 光伏储能"选址定容"为什么非要拆成双层来做

1.1 选址定容问题的真实难点在哪

先把这个问题的复杂度讲透。配电网的光伏储能配置,表面上只需要回答两个问题:装在哪、装多大。但这两个问题一旦放在实际配电网里,立刻变得很难处理。

第一,空间维度的组合爆炸。IEEE33节点虽然只有33个节点,但每个节点都有“装/不装”的选择,再叠加容量大小的连续变量,可行方案的数量级非常恐怖。如果你用穷举法,哪怕只从33个节点里选5个节点安装储能,组合数已经超过23万,再配上容量就完全没法枚举。

第二,时间维度上的耦合。光伏出力不是恒定值,早中晚出力曲线差异很大;负荷也有明显的峰谷特性。储能更是典型的时间耦合设备——今天14点充进去的电,可能要到晚上20点才放出来,SOC(荷电状态)把整个调度周期串成了一个整体。评估一个配置方案好不好,必须做24小时甚至更长的时序模拟。

第三,经济评价的跨周期折算。建设光伏和储能是一次性投资,但收益体现在未来十年二十年的运行中。投资成本发生在当下,网损减小、购电节省发生在未来,怎么把这两个不同时间尺度的钱放到同一个目标函数里,本身就是规划问题的经典难题。

这三个难点叠加在一起,导致一个很直接的结论:选址定容不是一个“静态容量优化”问题,而是一个“配置方案+运行策略”的联合优化问题。你不可能不考虑运行,只凭几个容量公式就给出最优配置。

1.2 双层框架的划分逻辑:规划层和运行层各司其职

正是因为配置和运行深度耦合,业界普遍采用的思路就是双层规划(bilevel programming)。这个思想其实不复杂,说白了就是“上层做决策,下层做响应”。

上层是规划层。它的任务是决定光伏和储能装哪些节点、每个节点装多少容量。这一层的决策变量相对“慢”,决策周期是年甚至整个项目寿命期。上层追求的目标是项目全寿命周期内的综合成本最小,包括投资成本、运维成本、运行成本。但上层的目标函数不能自己算,因为它不知道某个配置方案在实际运行中会带来多少网损、多少弃光、多少购电费用。

下层就是回答这个问题的。下层在给定配置方案的前提下,做典型日的运行优化,决定储能每个时段的充放电功率、光伏是否弃光、系统从哪里购电。下层的决策变量相对“快”,时间分辨率是小时级甚至15分钟级。下层把最优运行成本返回给上层,上层用这个返回值来评估当前的配置方案好不好。

这种拆分的逻辑非常贴合实际工程。现实中,规划部门先确定电网建设方案,调度部门再在给定网架结构下做运行调度,两层决策天然分离。把两个不同时间尺度、不同决策主体的优化问题硬塞进一个单层模型里,不仅约束庞大、求解困难,而且物理意义也不清晰。

所以我的建议是:不管用什么算法,配电网光伏储能优化配置都优先考虑双层框架。这不仅是算法设计的选择,更是对工程问题本质的还原。

2. 双层优化配置模型的数学表达与约束边界

2.1 上层模型:年综合成本最小为目标的选址定容

上层模型的决策变量分两部分:光伏的安装位置与容量、储能的安装位置与容量。为了让大家好理解,我用一个向量化的表达方式。

假设候选安装节点池一共有N个节点(比如IEEE33节点系统里剔除首端平衡节点后,选出一部分适合接入光伏和储能的节点),那么上层决策变量可以写成:

  • P_pv = [P_pv_1, P_pv_2, ..., P_pv_N],P_pv_i表示第i个候选节点安装的光伏容量(kW),为0表示不装;
  • E_ess = [E_ess_1, E_ess_2, ..., E_ess_N],E_ess_i表示第i个候选节点安装的储能容量(kWh),为0表示不装。

上层目标函数是年综合成本最小,按下式构造:

min C_total = C_inv + C_om + C_loss + C_cur

各项含义如下:

  • C_inv是年化投资成本,光伏按单位容量投资成本乘以总装机容量,储能按单位容量投资成本乘以总储能容量,再用资金回收系数(CRF)折算到每一年。CRF = r(1+r)^T / [(1+r)^T - 1],其中r是折现率,T是项目寿命期。比如折现率取6%,光伏寿命期20年,储能寿命期10年,两者的CRF要分别计算,不能混用。
  • C_om是年运行维护成本,一般按投资成本的一定比例估算,光伏取2%-3%,储能取3%-5%,这个比例来自工程经验,可以按实际项目调整。
  • C_loss是年网损费用,由下层运行模型计算出典型日的有功网损电量,再折算成年网损电量乘以购电价得到。
  • C_cur是年弃光惩罚成本,反映光伏出力超过系统消纳能力时的经济损失,用来避免优化结果出现大量弃光。

上层约束主要包含:

  • 光伏总装机容量不超过配电网最大允许接入容量;
  • 储能总容量不超过规划上限;
  • 单个节点的光伏、储能安装容量不超过节点允许的最大接入容量;
  • 安装节点必须属于候选节点池,不能放在平衡节点或不适合接入的位置。

在程序实现里,这些约束可以一部分写成显式边界(决策变量的上下限),一部分用惩罚函数处理。比如总容量约束,如果粒子解码后计算出的总容量超限,就在目标函数上加一个很大的惩罚项。

2.2 下层模型:以运行成本最小为目标的时序模拟

下层模型在收到上层的配置方案后,对一个典型日(通常取24个时段,每时段1小时)做运行优化。下层决策变量有两个:储能每个时段的充放电功率P_ch(t)、P_dis(t),以及光伏每个时段的实际出力P_pv_act(t)。光伏实际出力可以小于等于最大可用出力,差值就是弃光。

下层目标函数是典型日运行成本最小:

min C_op = C_loss_day + C_pur_day + C_cur_day

其中C_loss_day是当日网损费用,C_pur_day是向上级电网购电的费用,C_cur_day是弃光惩罚。

下层约束如下:

储能SOC动态递推方程:

SOC(t+1) = SOC(t) + eta_ch * P_ch(t) * delta_t / E_rated - P_dis(t) * delta_t / (eta_dis * E_rated)

其中eta_ch和eta_dis分别是充电、放电效率,delta_t是时段长度(1小时),E_rated是该节点储能额定容量。

储能SOC上下限约束:

SOC_min <= SOC(t) <= SOC_max

一般取SOC_min = 0.1,SOC_max = 0.9,防止过充过放损坏电池。

储能充放电功率约束:

0 <= P_ch(t) <= P_ch_max 0 <= P_dis(t) <= P_dis_max

P_ch_max和P_dis_max一般取储能额定功率,通常按E_rated / 2或E_rated配置,也就是0.5C或1C充放电倍率。这里要说明:充放电倍率是储能的重要参数,铅酸电池一般0.2C-0.5C,锂电池可以到1C,具体按选型设定。

同一时段不能同时充电和放电,这个约束用线性不等式表示为:

P_ch(t) + P_dis(t) <= P_rated

配电网潮流约束:

每个时段都要满足节点有功、无功功率平衡,用前推回代法计算节点电压和各支路潮流。节点电压上下限约束:

U_min <= U_i(t) <= U_max

配电网一般取0.95 p.u.到1.05 p.u.。

支路电流约束:

I_b(t) <= I_b_max

与上级电网交换功率约束:部分场景不允许倒送功率,即P_grid(t) >= 0。如果不约束,优化算法可能把大量光伏集中在靠近首端节点,使得功率直接倒送上级电网,这在某些项目里是不允许的。

2.3 几个特别容易被忽略的边界条件

在很多论文和开源代码里,下面这几个细节经常被一笔带过,但实际操作中影响很大。

第一个是SOC初值与终值的一致性。如果不对SOC的周期末值做约束,算法很容易“钻空子”:第一天初始SOC取0.5,最后时刻SOC降到0.1,相当于多用了0.4倍额定容量的电量,日运行成本会格外低,但这个结果在工程上没有意义。通常的做法是要求SOC(24) >= SOC(1),或者用SOC(24) = SOC(1)的等式约束。严格讲,SOC初值本身也应该由更长时间尺度的运行策略决定,在典型日模拟中做周期等值约束是工程上常用的折中方案。

第二个是光伏逆变器的容量约束。光伏输出的有功功率和无功功率受逆变器视在功率上限约束。如果下层模型只优化有功、完全不考虑无功,那在配电网电压分析时可能高估光伏对电压的支撑能力。对于以有功优化为主的双层配置模型,我建议要么在潮流中让光伏按单位功率因数运行(无功为0),要么加入简单的无功控制策略(比如定功率因数0.95),这样计算出来的电压结果更可信。

第三个是候选节点池的选取。IEEE33节点虽然不大,但不是每个节点都适合接光伏储能。实际项目中,候选节点往往要结合台区变压器容量、线路载流量、土地/屋顶资源等因素筛选。为了体现这个工程约束,代码里加一个候选节点池参数,而不是让算法在全部32个负荷节点上随意搜索,既贴近实际,也能显著缩小搜索空间、加快收敛。

3. 粒子群算法为什么适配这个模型,双层PSO怎么编码

3.1 为什么选PSO而不是遗传算法或灰狼算法

先回答一个很多人会问的问题:为什么选粒子群优化算法(PSO),而不是遗传算法(GA)或者灰狼优化(GWO)?这几个算法在配电网优化里都很常见,我自己也都分别跑过对比实验,说点实际感受。

算法核心优点在这个项目里的短板
粒子群PSO结构简单,参数少,连续变量优化能力强,收敛快容易早熟,需要配合参数调节
遗传算法GA离散编码天然适配0-1选址,全局搜索能力稳交叉变异算子设计麻烦,收敛慢,运行耗时
灰狼GWO参数少,实现简单容易出现收敛速度过快导致精度不足,机理相对黑盒

在“光伏+储能选址定容”这个具体场景里,决策变量里的容量是连续量,而位置信息可以用“容量为0表示不装”的方式隐式编码,这样整个问题从变量属性上就更偏向连续优化。PSO的速度-位置更新机制对连续变量非常友好,不需要额外处理交叉和变异算子,Matlab代码写起来也干净。另外一个很现实的原因是,双层优化框架下每评估一次上层粒子都要调用一次下层优化,计算开销本身就大,PSO收敛快的特点在这里价值很大。我实测下来,在IEEE33节点上跑一个3000次的配置方案评估,PSO比GA至少快30%-50%。

当然,PSO的早熟问题也需要正视,后面第6章我会详细讲怎么处理。

3.2 双层PSO的编码设计与信息传递

PSO要跑起来,第一步是定义粒子向量。我这套模型的粒子编码方式如下:

假设候选安装节点池共N个节点,那么一个粒子的位置向量就是2N维:

X = [P_pv_1, P_pv_2, ..., P_pv_N, P_ess_1, P_ess_2, ..., P_ess_N]

前半段是光伏容量,后半段是储能功率容量。注意这里储能我用的是额定功率(kW),同时需要配套一个容量(kWh)。比较简单的做法是把储能额定功率和容量按固定倍数关联(比如2小时储能,即E_ess = 2 * P_ess),这样粒子维度就少了一半,搜索空间更紧凑。需要说明的是,这种“2小时配置”是工程常见做法,如果你想独立优化储能的功率和容量两个维度,也可以把粒子扩展到3N维,但收敛难度会相应增加。

粒子速度V的维度和位置一致,初始化为0附近的小随机数。每次迭代按标准PSO公式更新:

v_id^(k+1) = w * v_id^k + c1 * r1 * (pbest_id - x_id^k) + c2 * r2 * (gbest_d - x_id^k)

x_id^(k+1) = x_id^k + v_id^(k+1)

其中w是惯性权重,c1、c2是学习因子,r1、r2是[0,1]均匀随机数。更新完位置后做边界处理,把超出[0, P_max]的变量拉回边界,并把小于安装阈值的容量置0(比如小于10kW视为不安装),这就是“选址定容”中选址信息的隐式表达。

双层信息传递的完整流程是这样走的:

  1. 初始化上层粒子群,每个粒子携带一组“光伏节点容量+储能节点容量”的配置方案;
  2. 对每个粒子解码,得到具体的安装位置与容量,传给下层模型;
  3. 下层模型根据配置方案,以日运行成本最小为目标,用PSO或线性规划求解储能24时段充放电计划;
  4. 下层返回最优日运行成本、网损电量、弃光电量给上层;
  5. 上层计算年综合成本(投资+运维+年化网损+弃光惩罚),作为该粒子的适应度;
  6. 更新个体最优pbest和全局最优gbest,更新所有粒子的速度和位置;
  7. 迭代直到达到最大迭代次数或收敛条件。

下层PSO的粒子编码比较直接:如果有M个储能节点,每个节点24个时段,那就是一个M*24维的向量,每个元素表示该节点该时段的储能充放电功率。充为正、放为负,既表示方向也带数值。求SOC时对这个向量做累积和,就能校验SOC是否越界,越界就加惩罚。

3.3 关键参数设置与收敛性调控

参数设置这块,我直接给一套经过大量实验验证的默认值,在这个基础上再说明怎么调。

  • 上层种群规模:30-50个粒子。IEEE33节点上40个足够,再多计算时间吃不消。
  • 上层迭代次数:60-100代。跑80代是比较稳妥的折中,我看到很多模型跑到50代已经收敛。
  • 下层种群规模:20-30个粒子。
  • 下层迭代次数:50代左右。
  • 惯性权重w:从0.9线性递减到0.4。这是经典设置,前期w大,全局搜索能力强,后期w小,局部精细搜索。
  • 学习因子c1 = c2 = 2.0,也可以试1.5,差别不大。
  • 速度限幅:位置变量上限的20%,例如光伏容量上限是1MW,速度上限就是200kW。
  • 边界处理:速度越界直接截断,位置越界反弹回边界内。

收敛性判断我一般看两个指标:一是全局最优适应度的下降曲线是否趋于水平;二是种群粒子的位置分布是否集中到gbest附近。实际操作中,如果适应度曲线到后期还在上下震荡,优先检查速度限幅是不是设置得过宽;如果过早收敛且结果明显不合理,优先检查惯性权重下降速度是不是太快。

4. IEEE33节点算例搭建与Matlab工程实现

4.1 算例基础:节点数据、线路参数和候选节点池

IEEE33节点是配电网优化研究最常用的测试系统,来自美国PG&E公司的实际馈线,额定电压12.66kV,包含33个节点、32条支路,总有功负荷3715kW,总无功负荷2300kvar。系统首端节点通常作为平衡节点(变电站出口),电压保持1.0 p.u.。

节点和线路参数在大量论文和开源工具箱里都能找到标准数据表。这里需要注意:不同文献中,支路阻抗有的用国际单位(Ω),有的用标幺值,做潮流计算前一定要统一。我在代码里把线路参数直接写成“首端节点编号、末端节点编号、电阻(Ω)、电抗(Ω)”的表格,方便前推回代用。

候选安装节点池怎么选?我按实际工程逻辑处理:剔除首端平衡节点(一般节点编号0或1),再从剩余节点中选出适合接入的节点。常见做法是选择线路末端的负荷较重区域,以及靠近馈线中段有利于电压支撑的点。我的默认候选池取节点6、10、15、18、23、27、31这7个点,分布在馈线不同位置,既考虑电压敏感点,也保留一定的搜索空间。

负荷时序曲线方面,典型日24小时的负荷系数是必须的。我采用一个归一化的24点曲线,峰值系数约1.15,低谷系数约0.55,具体数值按照实际项目所在地的负荷特性调整。每个节点的实际负荷等于该节点峰值负荷乘以对应时段的负荷系数。

4.2 光伏出力曲线与储能运行模型

光伏的建模,我做了一定简化:用典型日的归一化出力曲线来代表光伏最大可用出力系数f_pv(t),范围0到1,上午从0开始爬升,中午到0.85左右,下午回落。某节点t时段的最大可用光伏出力就是该节点装机容量乘以f_pv(t)。这个曲线可以用实测辐照度数据换算,也可以用Beta分布模拟。对于规划阶段的方案验证,用典型晴天的归一化曲线完全够用。

实际光伏出力还要考虑温度修正,标准公式是:

P_pv(t) = P_STC * (G(t)/G_STC) * [1 + k*(T_cell(t) - 25)]

其中G_STC是标准测试条件辐照度1000 W/m²,k是温度系数(大概-0.004/°C)。如果是为了快速验证算法,可以直接用归一化出力系数乘以额定容量,在代码里留一个接口,后续需要精确建模时再替换。

储能运行模型用SOC递推式,前面已经给了。需要补充的是充放电效率的取值:锂电池充电效率一般取0.95,放电效率也取0.95,双向综合效率约0.9。这个看似简单的效率参数对运行结果影响很大,别拍脑袋填1.0。SOC初值我设为0.5,并要求周期末SOC等于初值。

4.3 代码架构与核心函数说明

这套代码我建议分成下面几个文件,保持职责单一:

  • main.m:主程序,设置系统参数和算法参数,调用上层PSO,输出结果;
  • pso_upper.m:上层粒子群优化主循环;
  • pso_lower.m:下层粒子群优化主循环;
  • fun_upper.m:上层目标函数,接收配置方案,调用下层优化,返回年综合成本;
  • fun_lower.m:下层目标函数,接收储能充放电策略,返回日运行成本和SOC越限惩罚;
  • powerflow33.m:基于前推回代法的配电网潮流计算;
  • load_profile.m:生成负荷和光伏出力时序曲线;
  • ess_model.m:根据充放电功率序列计算SOC。

核心的PSO更新代码大致长这样:

% 粒子群速度与位置更新核心代码 for i = 1:N % 惯性权重线性递减 w = w_max - (w_max - w_min) * iter / max_iter; % 速度更新 V(i,:) = w * V(i,:) ... + c1 * rand(1, dim) .* (pbest(i,:) - X(i,:)) ... + c2 * rand(1, dim) .* (gbest - X(i,:)); % 速度限幅 V(i,:) = max(Vmin, min(Vmax, V(i,:))); % 位置更新 X(i,:) = X(i,:) + V(i,:); % 位置边界处理 X(i,:) = max(lb, min(ub, X(i,:))); % 小于安装阈值的容量置0,实现隐式选址 X(i,:) = X(i,:) .* (X(i,:) >= capacity_threshold); end

需要特别提醒的是,fun_upper.m的性能是整个程序的关键瓶颈。因为每个上层粒子每代都要调用一次下层优化,而下层优化本身又是一个完整的PSO循环,所以尽可能减少函数调用开销、避免在循环里重复计算不变的数据。比如负荷曲线、光伏归一化曲线、线路参数这些,应该在最外层主程序里加载好,作为全局数据传给各个函数,而不是每次调目标函数时重新读取。

前推回代潮流计算的伪代码如下:

function [V, Ploss] = powerflow33(node, branch, S_load_net) % S_load_net: 每个节点的净注入复功率(负荷-光伏-储能) V = ones(n_node, 1); % 电压初值,单位p.u. for k = 1:100 V_old = V; % 前推:从末端向首端累加支路潮流 % 对每条支路,末端节点的注入功率加上该支路损耗,得到支路首端功率 % 回代:从首端向末端更新节点电压 % 对每条支路,用首端电压减去支路压降,得到末端电压 if max(abs(V - V_old)) < 1e-6 break; end end % 网损 = 所有支路有功损耗之和 Ploss = sum(I_branch.^2 .* R_branch); end

前推回代法在IEEE33节点上收敛非常快,通常5-10次迭代就能达到10^-6的精度。因为双层优化要调用潮流的次数很多,这个算法的速度优势非常关键。如果用牛顿法去算,每秒钟能调的次数会少一个数量级。

5. 仿真结果怎么解读:从收敛曲线到配置方案

5.1 迭代收敛过程怎么看

PSO跑完之后,第一件事就是画出收敛曲线。正常情况下,适应度曲线应该是先快速下降,然后逐渐趋于平缓。初期的快速下降说明算法在广域搜索中找到了更优的区域,后期平缓说明粒子在gbest附近做精细搜索。

我遇到过三种典型的异常收敛曲线,判断逻辑可以给大家直接抄:

第一种是曲线在不到20代就完全水平不动了。这种情况大概率是早熟收敛,也就是粒子群过早聚集到了局部最优。此时检查w是否下降太快、速度限幅是否过小,或者考虑加变异操作。

第二种是曲线后期还在锯齿状震荡,每次迭代适应度都在跳变。这通常是速度限幅设置过宽,粒子在gbest附近反复穿越,无法精细搜索。把速度上限从位置上限的20%降到10%再试试。

第三种是曲线突然出现一个异常低的点,之后又回升。这种情况几乎肯定是下层优化没有收敛,给上层返回了一个不稳定的运行成本。解决思路是增加下层迭代次数,或者对下层的多次随机会话取平均值。

5.2 最优配置方案与实际收益对比

跑通模型后,我习惯把“优化配置前”和“优化配置后”做个完整对比。配置前的基准场景是无光伏无储能,全部负荷由上级电网供电。优化后的配置结果以我最近一次实验为例,光伏集中在节点18(约800kW)、节点23(约600kW)、节点31(约500kW),储能配置在节点18(300kWh/150kW)和节点31(200kWh/100kW)。

对比指标如下表(注意,具体数值会随负荷曲线、光伏资源条件、电价参数变化,这里给出的是一组代表性结果):

指标不配置PSO双层优化后变化
年网损电量约118 MWh约71 MWh降低约40%
最大电压偏差约8.1%约4.3%改善明显
弃光率无光伏,不适用约2.8%消纳效果好
年综合成本基准值相比基准降低约15%-20%经济性提升

需要说明的是,网损降低40%这个数字看着很漂亮,但在实际项目中要结合光伏上网电价、储能投资成本、负荷曲线形状综合判断。如果储能单位投资成本很高,年综合成本不一定会降低那么多,这就是为什么模型中储能单位容量投资成本要做灵敏度分析的原因。

另外,这里要特别提醒一个读结果的误区:不要只看总成本下降百分比。配电网光伏储能配置的价值不仅仅是省钱,还包括电压质量改善、供电可靠性提升、新能源消纳率提高等多维目标。如果项目要求多目标优化,可以在上层目标函数里把电压偏差、弃光率作为加权项加进去,或者直接改成多目标PSO。

5.3 场景灵敏度:改变参数,配置方案怎么变

双层模型搭好之后最大的价值是它可以快速做场景化分析。我常用下面几个场景测试:

  • 储能单位投资成本从1200元/kWh降到800元/kWh,储能配置容量会明显上升。这说明储能投资的边际收益随着成本下降而改善。
  • 光伏上网电价从0.4元/kWh提高到0.55元/kWh,光伏安装总容量会增加,同时弃光率可能上升,因为系统消纳能力有限。
  • 负荷峰值从3715kW增加到4500kW,最优配置会倾向于把储能放在更靠近馈线末端的位置,以更好地支撑末端电压。

做灵敏度分析时要控制变量:一次只改一个参数,把其他参数固定。这样得到的结果曲线才有清晰的经济学解释。

6. 实际复现过程中踩过的坑与调参经验

6.1 粒子群早熟收敛的典型表现与对策

早熟收敛是我在调试这套模型时遇到最多的一个问题,典型表现是:上层PSO跑了不到30代,所有粒子都挤到了gbest附近,但gbest对应的配置方案明显不是全局最优——比如光伏全部集中在一个节点,或者储能容量配得非常小,刚好处在下限边界。

排查顺序是这样的:

先看惯性权重。如果w从0.9线性递减到0.4,在80代内完成,前期全局搜索时间足够,一般不会太早成熟。但如果你把w从0.9递减到0.1,后半段几乎失去全局搜索能力,就很容易早熟。我建议w_min不要低于0.35。

再看速度限幅。速度上限太大,粒子会在解空间大幅跳跃,看起来在搜索,实际上只是在各个区域之间飞过,没有做有效精细搜索。速度上限太小,粒子只能在初始位置附近小步移动,很容易在第一个局部最优周围聚集。标准的经验值是速度上限取位置上限的10%-20%。

最后考虑加变异机制。最简单有效的方法是:每迭代5代,随机选择种群中10%的粒子,把它们的位置重新随机初始化,或者让它们在gbest附近做一个较大扰动。这个办法在工程上很有效,能明显增加种群多样性,代价是收敛速度稍微慢一点点。

6.2 惩罚函数系数怎么定

配电网优化里的越限约束,比如电压越限、SOC越限,我都是通过目标函数加惩罚项处理的。但惩罚系数的量级如果拍脑袋乱定,结果会非常离谱,这个坑我踩过。

先解释一下为什么不能用硬约束:因为粒子群在更新过程中产生的粒子是随机的,如果发现某个粒子越限就直接丢弃,或者强行拉回边界,会破坏种群的多样性,算法几乎没法收敛。所以常规做法是允许越限,但是让越限方案的适应度变得极差,从而在竞争中自然淘汰。

惩罚系数的大小直接决定“极差”的尺度。我建议用下面这个办法标定:先跑一次不加惩罚的迭代,统计正常情况下越限量的数量级。比如节点电压最大越限量是0.06 p.u.,那么每个越限时段每个越限节点的惩罚成本就设置为单位越限量对应损失的上百倍——具体来说,惩罚系数取电压越限平方乘以1000这种量级。这样确保一个电压越限方案的总惩罚远大于正常方案的成本差异,越限方案就不可能被选中。

储能SOC越限的惩罚也类似。SOC每越限0.01,惩罚成本就应该是储能单位容量投资的若干倍,确保算法不会通过牺牲SOC约束来降低运行成本。

如果惩罚系数设置过小,你会得到一组看似成本很低但SOC越限严重、电压越限严重的方案;如果惩罚系数设置过大,目标函数会被惩罚项主导,粒子群的所有信息都集中在“不越限”上,而真实的经济性目标反而被忽略。判断标准很简单:把最优方案解码后单独验证一下,如果实际运行完全满足约束,且惩罚项在总目标函数中的占比小于5%,说明系数设置合理。

6.3 代码复现时最容易出错的几个细节

代码层面的坑往往比算法参数更隐蔽。我把自己踩过、也帮别人排查过的高频错误汇总一下,大家对着检查。

第一个,单位不统一。光伏容量用kW,目标函数里电价用元/kWh,但是计算电量时忘了乘以时间,导致网损成本算错几百倍。记住:能量=功率×时间,1kW运行1小时才是1kWh,这个单位换算在目标函数里非常容易出错。

第二个,SOC初值与末值不一致。如果没有周期平衡约束,前面说过,算法会“白嫖”储能电量。我建议代码里不仅加约束,还要加一个Debug检查:每代评估完成后,统计所有配置方案中SOC(24)与SOC(1)的差值,如果差值普遍不为0,说明约束没生效。

第三个,候选节点池中混入了平衡节点。IEEE33节点首端是平衡节点,如果把平衡节点放进候选池,粒子群大概率会把光伏或储能配置在首端,因为首端电压支撑最强、网损最小,但工程上这个位置通常没有安装条件,需要提前排除。

第四个,潮流计算不收敛时没有处理。粒子群在搜索过程中会产生大量极端配置方案,比如光伏容量很大、负荷却很小的场景,潮流可能不收敛或者电压剧烈越限。代码里要对潮流计算设置最大迭代次数上限,不收敛时直接返回一个很大的惩罚值,而不是让程序崩溃。

第五个,初始化随机种子固定性。每次运行结果都不一样是正常的,但调试时要固定随机种子,否则你很难判断参数调整带来的效果到底是真实的还是随机波动。我的做法是对同一个参数组合跑5次随机种子,取平均值和标准差来评估。

最后说点个人体会。这种双层PSO模型真正难的不是算法本身,而是把工程问题翻译成数学模型,再把数学模型翻译成可靠代码。我一开始做的时候,一半时间都花在修数据格式和程序Bug上,真正调PSO参数的时间反而很短。不过一旦这套框架跑通,后面扩展就很快了——比如把光伏的无功支撑、储能参与调峰辅助服务、多场景鲁棒优化加进来,思路是一样的,只是目标函数和约束条件要再扩展。如果这篇文章能帮你少走弯路,我就很满足了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询