十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

基于粒子群算法的配电网光伏储能双层优化配置模型

基于粒子群算法的配电网光伏储能双层优化配置模型 刚接触配电网规划那会儿我最怕听到一句话“帮我们算算光伏该装在哪储能该配多大”这个问题的烦人之处在于它不是一道简单的数学解方程题装到不同节点网损和电压分布完全不一样容量配得不同投资成本与运行收益的平衡点也会漂移。更麻烦的是光伏出力有间歇性储能又有时段耦合约束一个配置方案好不好得放进典型日时序里跑一圈才知道。这篇文章要聊的就是我在这个方向上的完整实现思路基于粒子群优化算法的配电网光伏储能双层优化配置模型采用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(1r)^T / [(1r)^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(t1) 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.1SOC_max 0.9防止过充过放损坏电池。储能充放电功率约束0 P_ch(t) P_ch_max 0 P_dis(t) P_dis_maxP_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^(k1) w * v_id^k c1 * r1 * (pbest_id - x_id^k) c2 * r2 * (gbest_d - x_id^k)x_id^(k1) x_id^k v_id^(k1)其中w是惯性权重c1、c2是学习因子r1、r2是[0,1]均匀随机数。更新完位置后做边界处理把超出[0, P_max]的变量拉回边界并把小于安装阈值的容量置0比如小于10kW视为不安装这就是“选址定容”中选址信息的隐式表达。双层信息传递的完整流程是这样走的初始化上层粒子群每个粒子携带一组“光伏节点容量储能节点容量”的配置方案对每个粒子解码得到具体的安装位置与容量传给下层模型下层模型根据配置方案以日运行成本最小为目标用PSO或线性规划求解储能24时段充放电计划下层返回最优日运行成本、网损电量、弃光电量给上层上层计算年综合成本投资运维年化网损弃光惩罚作为该粒子的适应度更新个体最优pbest和全局最优gbest更新所有粒子的速度和位置迭代直到达到最大迭代次数或收敛条件。下层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节点是配电网优化研究最常用的测试系统来自美国PGE公司的实际馈线额定电压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储能配置在节点18300kWh/150kW和节点31200kWh/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参数的时间反而很短。不过一旦这套框架跑通后面扩展就很快了——比如把光伏的无功支撑、储能参与调峰辅助服务、多场景鲁棒优化加进来思路是一样的只是目标函数和约束条件要再扩展。如果这篇文章能帮你少走弯路我就很满足了。
返回列表