1. 为什么“装在哪、装多大”会成为配电网的大问题
1.1 分布式光伏说不清道不明的“消纳悖论”
先抛一个很多入行没多久的工程师都会遇到的困惑:明明分布式光伏是清洁能源,为什么并网之后电网反而更容易出问题?我自己第一次做配电网仿真时也踩过这个坑——在某条馈线末端挂了一堆光伏,仿真出来的电压曲线直接超过1.07 p.u.,逆潮流把变压器都顶得够呛。后来才理解,光伏出力是间歇性的,中午阳光最强的时候负荷却往往不在峰值,发出来的电如果不能就地消纳,就只能沿着馈线往回送。配电网的拓扑结构决定了它原本就是按“单向潮流”设计的,馈线越往末端,承载能力越弱。光伏装得太分散、太靠近线路末端,局部电压抬升问题就会非常突出。
储能的作用恰恰是把这个“发得多、用得少”的时间差抹平一点:中午光伏出力大时充电,傍晚负荷高峰时放电。但问题紧接着就来了——储能应该装在哪几个节点?每个节点装多大容量?这不光是一个电气问题,还是一个典型的经济问题:储能设备贵,装多了投资回收周期很长;装少了又起不到削峰填谷的作用。光伏的选址同样如此,光照资源好的节点和负荷重的节点不一定重合,光伏和储能的组合选址就更复杂了。这就是所谓的“选址定容”问题,表面上看是找个位置、定个容量,实际上是在电压约束、投资成本、运行收益、潮流分布等多个因素之间做博弈。
1.2 储能选址定容为什么会牵一发动全身
如果只是给一个节点装一台储能,那事情很简单,挑个容量大、电压低的节点就行。但光伏和储能同时接入配电网后,情况会变得很微妙:储能充电会压低电压,而光伏出力会抬高电压,二者之间存在一种此消彼长的耦合关系。更麻烦的是,配电网每个节点的电压不是孤立的,任何一个节点注入功率的变化,都会通过潮流方程传导到整个网络。这就像在一个连通器里倒水,你在这头加一滴水,那头的水位也会跟着变。
所以,实践中通常不追求某个节点上的最优解,而是要找一组“空间组合方案”——在不同节点上配置不同容量的光伏和储能,让全网电压分布、网损、运行成本和投资成本达到一个综合最优的状态。这就是选址定容问题为什么一定要放在“整个网络”的尺度上考虑的原因。如果只盯着单个节点看,很容易做出一个局部最优但全局很差劲的方案。
另外还要注意,配电网选址定容问题是一个混合整数非线性规划问题。为什么说它“混合整数”?因为选址是“装/不装”这种离散决策,定容则是连续的容量数值。非线性则来自潮流方程本身,电压和功率之间的约束关系不是线性的。这类问题如果交给传统的数学规划工具,求解难度会非常高,尤其是当节点数量上升到几十上百个之后,很容易落入局部最优或者干脆算不动。这也是为什么启发式算法——比如粒子群优化算法——在这个场景下这么受欢迎。
1.3 这套模型到底能替你做什么
很多初学者拿到一个项目,第一反应是“赶紧跑代码”,但我建议先想清楚一个数学模型的边界在哪里。这套“基于粒子群优化算法的配电网光伏储能双层优化配置模型(IEEE33节点)”能做的事情,归纳起来就是三件:
第一,给出光伏和储能的最优安装位置。具体到IEEE33节点系统,它会告诉你哪几个节点优先装光伏、哪几个节点优先装储能、哪几个节点不装。
第二,给出每个安装节点上的最优配置容量。光伏多少kW、储能多少kWh、储能变流器多大功率,模型会一并给出来。
第三,给出对应的运行策略参考。因为这是一个双层模型,内层在计算适应度时已经模拟了储能每天充放电的运行方式,上层给出的配置方案并不是“拍脑袋”定出来的,而是经过了运行层面的校验。
打个比方:你的配电网就像一个小区,上层决策是“在哪些楼栋装多少台电梯”,下层运行是“电梯每天怎么调度才最省电”。如果只做上层不做下层,算出来的电梯数量可能根本不够用;只做下层不做上层,又不知道该在哪些楼栋装。双层优化就是把这两个问题的决策逻辑串起来。IEEE33节点系统则是这个模型的“试验田”,它的参数完全公开,几乎所有配电网优化方向的论文都会用它做算例验证,方便你和其他算法、其他文献做横向对比。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 双层优化模型:把“规划问题”和“运行问题”拆开谈
2.1 单层模型为什么算不准经济账
很多人第一次接触这类问题时会很自然地想:为什么不把所有变量放在一起,一次性优化出一个结果?说实话,单层模型确实更简单,编程实现也更快。但它有一个非常致命的问题——无法刻画储能运行策略对配置方案的反作用。
举个例子。假设上层决定在某节点安装一台200 kW/400 kWh的储能,并把这个方案的日收益按照“每天固定充放电两次”的方式去估算。但实际运行中,储能怎么充、怎么放,取决于负荷曲线、光伏出力曲线和实时电价。在负荷低谷时段充电、在高峰时段放电,和每天不管什么情况都强行充放,收益差异非常大。单层模型为了简化计算,只能提前假设一套运行方式,但这套假设在优化过程中并不会随着配置方案的变化而调整。换句话说,配置方案变了一圈,运行策略还是那套老逻辑,算出来的经济指标就会失真。
双层模型解决的就是这个问题。上层的粒子群算法负责搜索配置方案,下层的运行模拟负责在给定方案下优化储能出力,然后把运行结果反馈给上层去评估方案优劣。两层之间形成一个闭环:配置变,运行策略也跟着变,最后上层评价的是一个“经过运行优化之后”的方案,而不是一个“理论方案”。这才是这套模型在逻辑上比单层模型可靠的根本原因。
2.2 上层决策变量与目标函数
上层模型的核心决策变量有两类:
- 光伏安装位置(离散变量,通常用0/1表示某个节点是否安装光伏)
- 光伏安装容量(连续变量)
- 储能安装位置(离散变量)
- 储能安装功率、储能安装容量(连续变量)
在IEEE33节点案例里,一般会在负荷较重、电压偏低的节点集合中预设候选安装节点,而不是让算法在全部33个节点里瞎选。这既符合工程直觉,也能显著缩小搜索空间。候选节点的选取通常基于初次潮流计算的电压分布结果:电压越低的节点,往往越需要就地无功/有功支撑。
目标函数则是一个综合经济评价函数,常见的是“年综合费用最小化”:
[
\min C = C_{inv} + C_{ope} + C_{loss} + C_{buy}
]
- (C_{inv}):光伏和储能的年化投资成本(把设备初始投资按使用寿命折算到每年)
- (C_{ope}):年运行维护成本
- (C_{loss}):网络损耗费用
- (C_{buy}):从上级电网购电的费用
有些文献还会在目标函数里加入“弃光惩罚”或者“电压偏移惩罚”,从而引导算法找到兼顾经济性和电能质量的方案。具体到Matlab实现中,目标函数不是解析表达式,而是通过“调用潮流计算 + 调用运行模拟”得到的数值结果,这也是这类模型和普通教学优化问题的本质区别。
2.3 下层运行模拟与多重场景处理
下层运行模拟是整个模型中计算量最大的部分。标准做法是选取典型日作为运行场景,典型日可以是“典型夏季日”“典型冬季日”和“过渡季节日”,每个典型日有24小时的负荷数据和光伏出力数据。在某个配置方案下,下层要模拟储能在这24小时内的充放电功率,目标是让这个日运行成本最小。
这里有一个实现细节要注意:内层如果也使用一个优化算法去求解储能充放电策略,计算量会非常惊人,因为外层几千次迭代,内层每次都要跑一遍优化。实际工程中通常会用启发式规则替代内层严格优化,比如:光伏出力大于负荷且电价低时充电,负荷高峰且电价高时放电。这种规则虽然不保证全局最优,但运行速度快、稳定性好,在方案寻优阶段完全够用。
等到外层收敛之后,如果你还想做精细化校验,可以把得到的最优配置方案再放到完整8760小时时序仿真中去验证,这时再用严格优化去求解储能运行策略也不迟。这种“粗优化 + 精校验”的两阶段思路,是我实际做类似项目时觉得最稳妥的,比一上来就搞全时序优化要靠谱得多。
3. IEEE33节点测试系统:先把电网的“骨架”搭起来
3.1 为什么选IEEE33而不是其他算例
IEEE33节点系统是配电网研究里最经典的辐射状算例,出自IEEE PES的经典文献。它的标称电压是12.66 kV,包含33个节点、32条支路,总负荷大约3.7 MW + 2.3 Mvar,结构简单但要啥有啥:有主干线、有分支,有轻载节点也有重载节点,馈线末端电压偏低的现象非常明显。这套特性让它特别适合做分布式电源选址定容的测试平台——因为末端电压问题足够突出,才能体现出“接光伏+储能”后的改善效果。
有的读者可能会问,为什么不用IEEE69节点或者更大的系统?答案是:在概念验证阶段,IEEE33节点已经足够说明问题。它的潮流计算快,调试起来可以快速定位问题,而且几乎所有的对比文献都是以IEEE33节点为基础做的,后续你的论文或报告可以直接引用其他人在同样算例上的结果做横向对比。我在实际项目里的习惯是:先用IEEE33节点把整套代码框架跑通,再去扩展到IEEE69甚至某个实际馈线的拓扑。
3.2 节点、支路与负荷数据的Matlab表示
在Matlab中表示IEEE33节点系统,最核心的就是三个数组:节点参数矩阵、支路参数矩阵、负荷参数矩阵。支路参数矩阵每一行表示一条支路,包含起点节点编号、终点节点编号、支路电阻(欧姆)、支路电抗(欧姆)。负荷参数矩阵每一行表示一个节点的负荷,包含有功功率和无功功率。
matlab复制% 支路参数: [起点, 终点, R(ohm), X(ohm)]
branch = [
1 2 0.0922 0.0470;
2 3 0.4930 0.2511;
3 4 0.3660 0.1864;
% ... 其余支路
];
% 节点负荷: [节点编号, P(kW), Q(kvar)]
load_data = [
1 100 60;
2 90 40;
3 120 80;
% ... 其余节点
];
这里有一个很关键的细节:根节点(通常是变电站母线)的电压设定为1.0 p.u.,其他节点的初始电压可以设为1.0,后续通过潮流计算迭代更新。
IEE33节点系统的总负荷虽然只有3.7 MW,但在单纯光伏接入时,馈线末端节点(比如节点17、18、32等)的电压很容易降到0.95 p.u.以下,这为后续优化提供了非常明显的“改善空间”。如果你算出来的初始电压分布和文献里对不上,先别怀疑算法,优先检查支路参数是否录入正确——我见过太多人把电阻和电抗弄反,结果整个仿真结果全歪了。
3.3 前推回代潮流计算是整套模型的“速度命门”
配电网潮流计算方法不只一种,但前推回代法是IEEE33节点这类放射状网络的最优选择。它的原理非常接近“猜答案再修正”:先假设所有节点电压都是额定值,从网络末端往电源端推算出各支路电流,然后从电源端往末端回代修正各节点电压,反复迭代直到前后两次电压差小于允许误差。
为什么不用牛顿-拉夫逊法?因为放射状配电网的节点导纳矩阵结构很特殊,前推回代法不需要组成和分解雅可比矩阵,单次迭代的计算量小一个数量级。在双层优化模型里,潮流计算可能要被调用几万次甚至几十万次,速度哪怕提升零点几毫秒,累积下来都能节省大量等待时间。
matlab复制function [V, Ploss] = backward_forward_sweep(branch, load_data, V0, max_iter, tol)
V = V0; % 初始电压向量,根节点设为1.0
for iter = 1:max_iter
% 前推:从末端到根节点,计算支路电流
I = zeros(size(branch, 1), 1);
for k = size(branch, 1):-1:1
% 节点注入电流 = 负荷电流 + 下游支路电流之和
end
% 回代:从根节点到末端,更新节点电压
for k = 1:size(branch, 1)
% V(末端) = V(首端) - I * Z
end
if max(abs(V - V_old)) < tol
break;
end
end
end
这个函数的执行效率直接影响整个优化过程的耗时。我自己的经验是:在Matlab里写前推回代时,尽量不要用大量的动态变量和对象,纯数组操作效率最高。能用向量化运算的就用向量化运算,能预先分配内存的就预先分配。否则外层粒子群算法跑几千个粒子,每个粒子内层可能还要跑24个时段的潮流,这个时间开销会让调试过程变得非常痛苦。
4. 粒子群算法在选址定容问题里的工程化改造
4.1 粒子编码:让“方案”变成“坐标”
粒子群算法本身不关心你的问题是电路问题还是物流问题,它只关心你如何把方案映射成一组连续的实数坐标。选址定容问题的粒子编码方式,直接决定了算法能不能高效地搜索解空间。
常见的编码方式有两种。第一种是“全部连续编码”:粒子的每一维表示某个候选节点的光伏安装容量或储能容量,如果某一维的值小于某个阈值(比如0.1),就视为该节点不安装。这种方法实现简单,但搜索过程中会出现大量“在装与不装之间反复横跳”的冗余方案。
第二种是“分段编码 + 整数化处理”,我比较推荐这种:粒子前半部分是各候选节点的光伏容量,后半部分是储能容量,同时加一组用于选址的辅助变量。选址决策通过阈值判断来生成,阈值设置得合理的话,算法会自然收敛到“少数节点安装、多数节点不装”的稀疏解,更符合实际工程的安装偏好。
matlab复制% 粒子维度设计示例
% dims 1:N_pv -> 各候选节点光伏安装容量 (kW)
% dims N_pv+1:2*N_pv -> 各候选节点储能安装容量 (kWh)
% dims 2*N_pv+1:3*N_pv -> 辅助选址变量[0,1] 阈值判断
n_dim = 3 * n_candidate;
粒子的速度和位置更新沿用标准PSO公式,但每一代更新完位置之后需要做边界处理——容量不能为负,选址变量要在[0,1]区间内。边界处理的方式也会影响收敛质量:直接截断会让粒子容易聚集在边界上,反射则能保持多样性,实际使用中我倾向于用反射处理。
4.2 适应度函数与约束处理
粒子群算法里没有“约束条件”这个概念,它只有一个适应度函数,你要把所有约束通过惩罚项的方式塞进适应度。这是整套代码里最考验工程经验的地方。
基本的约束包括:
- 节点电压上下限约束(比如允许范围0.95~1.05 p.u.)
- 支路电流不过载
- 光伏和储能安装总量不超过预设的上限
- 储能的荷电状态保持在合理范围(例如20%~90%)
惩罚函数的基本思路是:如果某个方案越限,就在目标函数后面加一个大数。但这个“大数”怎么取很讲究。取太小,算法会无视约束;取太大,会让适应度函数产生悬崖式的断层,粒子容易在可行域边缘“撞墙”后不知如何转向。我一般会让惩罚项的量级比正常目标函数大10~100倍,并且使用“越限程度 × 惩罚系数”这种平滑惩罚,而不是简单的0/1惩罚。
matlab复制% 电压越限惩罚示例
V_low = 0.95; V_high = 1.05;
penalty = 0;
for i = 1:length(V)
if V(i) < V_low
penalty = penalty + (V_low - V(i))^2;
elseif V(i) > V_high
penalty = penalty + (V(i) - V_high)^2;
end
end
fitness = objective_value + 1e4 * penalty;
这里额外提醒一句:约束条件如果太多、惩罚系数又设置得过大,粒子群算法的搜索过程会变得非常“僵硬”,几乎所有的粒子都会被困在满足约束的狭隘区域里,很难展开充分搜索。所以最优做法是分阶段:第一阶段先跑一个无约束或弱约束的版本,看算法能不能找到一个合理的优化方向;第二阶段再把约束加上,在第一阶段结果的基础上做精细搜索。
4.3 参数选择与收敛性控制
标准PSO有两个核心参数:学习因子 (c_1)、(c_2),加上惯性权重 (w)。在选址定容问题里,我推荐一组经过验证的配置:
- 惯性权重 (w):从0.9线性递减到0.4
- 学习因子 (c_1 = c_2 = 2.0)
- 种群规模:50~100(候选节点多就取大)
- 最大迭代次数:100~300
惯性权重线性递减这个策略非常有效:前期大权重让粒子保持较高的全局探索能力,不容易漏掉好的区域;后期小权重让粒子集中精力在当前最优解附近精细搜索。有些改进PSO会在迭代过程中动态调整 (c_1) 和 (c_2),前期强调个体经验,后期强调群体经验,但在我这个场景下收益不大,反而增加了调参的工作量。
还有一个提升收敛性的做法是“精英保留”:每一代不要把种群里的最优粒子丢了,而是直接复制到下一代。虽然PSO的理论框架里每个粒子都会自己飞,但工程上加入精英保留之后,整体收敛稳定性会好很多,尤其是面对这种多峰值的选址定容问题时,可以避免已经找到的好方案在后续迭代中被丢光。
5. 关键代码实现与调参实录
5.1 主程序结构与双层循环的写法
双层优化的代码框架,最核心的就是“外循环套内循环”。外循环是粒子群迭代,内循环是每个粒子的潮流计算和运行模拟。为了让代码结构清晰,我通常这样组织:
matlab复制%% 主程序
clc; clear; close all;
% 1. 加载IEEE33节点数据
[branch, load_data, baseMVA, baseKV] = load_ieee33();
% 2. 初始化PSO参数
n_candidate = 5; % 候选安装节点数
n_dim = 3 * n_candidate; % 粒子维度
n_pop = 60; % 种群规模
n_iter = 200; % 迭代次数
w_max = 0.9; w_min = 0.4;
c1 = 2.0; c2 = 2.0;
% 3. 初始化粒子位置和速度
pos = rand(n_pop, n_dim) .* repmat(ub - lb, n_pop, 1) + repmat(lb, n_pop, 1);
vel = zeros(n_pop, n_dim);
% 4. 主循环
for iter = 1:n_iter
w = w_max - (w_max - w_min) * iter / n_iter;
for i = 1:n_pop
% 解码粒子 -> 光伏/储能选址定容方案
[pv_site, pv_cap, ess_site, ess_cap] = decode_particle(pos(i, :), candidate_nodes, threshold);
% 内层运行模拟:得到日运行成本和网络损耗
fitness(i) = evaluate_configuration(pv_site, pv_cap, ess_site, ess_cap, branch, load_data);
end
% 更新个体最优和全局最优
% 更新粒子速度和位置
end
% 5. 输出结果
这里要特别强调“解码”这一步。粒子的各个维度都是实数,但真正计算时你需要把“连续值”转换为“离散选址方案 + 连续容量方案”。阈值设为多少?建议先跑一个不含惩罚项的预实验,统计粒子群在候选节点上的容量分布,再根据分布特征设定阈值。我常用的做法是:如果某节点的容量收敛到小于该节点总负荷的5%,就认为该节点不值得安装,把容量直接置零。
5.2 内层储能运行策略的简化处理
内层运行模拟是整个双层模型最容易“拖慢速度”的地方。下面是我实际项目里用过的简化工整逻辑,可以快速估计储能日运行收益。
先加载典型日负荷曲线和光伏出力曲线,然后按以下规则模拟:
- 光伏出力大于负荷且储能SOC低于上限时,储能充电;
- 负荷大于光伏出力且储能SOC高于下限时,储能放电;
- 其余时间储能待机。
matlab复制function [cost, social] = evaluate_configuration(pv_site, pv_cap, ess_site, ess_cap, branch, load_data)
% 24时段典型日模拟
for t = 1:24
% 计算该时段各节点净负荷(基础负荷 - 光伏出力 + 储能充放电)
net_load = load_data(:, t) - pv_generation(t, pv_site, pv_cap) + ess_power(t, ess_site);
% 潮流计算
[V, Ploss(t)] = backward_forward_sweep(branch, net_load);
% 统计成本
cost = cost + electricity_price(t) * sum(net_load) + loss_price * Ploss(t);
end
end
储能SOC的更新是这里最容易写错的地方。每一时段的充放电功率不能只看当前时段的光伏和负荷对比,还要带上SOC的约束。比如中午光伏大发时你确实想多充一点,但如果在上午已经充满了,中午就只能被迫弃光,所以储能的容量和功率配比会影响午后是否能继续吸收光伏。我在代码里专门写了一个 soc_update 函数来管理这个逻辑,调试时也经常在 SOC 上发现问题——有些方案容量配置很大,但功率配得小,导致充不满也用不完,整体经济性很差。这类问题不在内层运行模拟里跑一遍是根本暴露不出来的。
5.3 我踩过的三个典型坑
坑一:粒子维度出现“冗余”导致收敛慢。 一开始我把33个节点全部作为候选安装节点,粒子维度达到99维,60个粒子在这个高维空间里搜索稀疏解,效果非常差。后来把候选节点按初始电压分布缩小到8~10个节点,维度降到24~30维,收敛速度快了至少一倍,而且结果更稳定。这也符合工程常识:没有电压问题的节点,硬去装光伏储能本来就不划算。
坑二:惩罚系数设置不当导致“假收敛”。 有一版代码把电压越限惩罚系数设成了1e6,结果PSO很快收敛到一个“完全满足电压约束但光伏装得极少”的方案——因为只要少装光伏,电压自然不越限。表面看曲线收敛得很漂亮,实际上目标函数几乎全靠罚函数在起作用。后来我把惩罚系数降到1e4,并且在迭代后期对最优个体做一次无惩罚的精确评估,才避免了这个问题。
坑三:储能初始SOC设定不合理造成循环依赖。 如果每天模拟运行都从SOC=0.5开始,那么储能在一天结束时的SOC大概率不等于0.5,也就是说你每天“凭空”获得或损失了一部分储能电量。正确做法是把末尾SOC与初始SOC的偏差作为惩罚项加进适应度,让优化过程自动学会“当天充的电当天放完”或“保持循环一致性”的运行策略。这个细节看起来小,但对储能年收益的影响可能达到10%~20%。
6. 结果怎么看:从收敛曲线到方案可信度
6.1 收敛曲线的正确打开方式
很多人在博客或论文里只贴一张“最优适应度随迭代次数下降”的曲线,然后就宣布算法收敛了。我建议各位在跑Matlab代码时多存几个指标:全局最优适应度、种群平均适应度、最优方案中光伏和储能的分别容量变化。这三个指标一起看,才能判断收敛是“真的找到了好方案”还是“所有粒子都在向同一个糟糕的局部最优靠拢”。
最优适应度下降快是好事,但如果种群平均适应度下降非常慢,甚至停滞在一个很高的水平,说明算法的探索能力不足,粒子聚集太快,多样性已经丢失。这个时候我会回去检查是不是惯性权重衰减得太快了,或者种群规模太小,而不是单纯增加迭代次数——增加迭代次数对一个已经丧失多样性的种群来说没有意义。
还有一个实操细节:每次运行PSO,由于初始种群是随机生成的,最终结果可能略有不同。严谨的做法是让程序自动跑5次,取最优结果作为最终方案,同时保留最优适应度的标准差。如果标准差过大,说明算法稳定性差,要么是约束处理有问题,要么是候选节点筛选不合理。
6.2 优化结果是否可信的判断方法
拿到最终配置方案之后,不要急着画图写报告,先做这么几件事:
第一,对优化结果中的电压分布做一次静态校验。把得到的光伏和储能配置代入IEEE33节点,重新跑一次24时段的潮流,看看所有节点在全天24个时段内的电压是否都在允许范围内。这个工作不能用平均电压代替,必须看最恶劣时刻(通常是光伏出力最大且有功负荷最小的时段)的电压。
第二,对比“不装”、“只装光伏”、“光伏+储能”三种场景下的网损和电压偏差。如果优化出来的结果比“只装光伏”好不了多少,那说明储能的容量可能配小了,或者储能被装在了对电压支撑不明显的节点上。
第三,做一次灵敏度分析。把储能容量在最优值的±20%范围内扰动一下,观察目标函数的变化。如果目标函数变化很小,说明这个区域比较平坦,最优解附近有一片相似的可行方案,那么你在工程上可以适当减小储能容量来节省初始投资;如果目标函数变化很剧烈,说明你对最优解的精度要求其实是比较高的,需要更细致的搜索。
我个人的体会是,这套双层优化模型在IEEE33节点上跑出的典型结果是:最优方案一般会在馈线中后段(如节点9~18、节点26~33附近)布置光伏,储能则倾向于和光伏容量较大的节点伴生布置,用来吸收午间多余的光伏出力并用于晚高峰放电。整体网损相比不配置分布式能源时能降低20%~40%,具体取决于负荷曲线和电价参数。如果你的结果离这个区间太远,大概率是某处代码出了问题,而不是模型本身不行。
最后再分享一个小技巧:在Matlab里跑这种双层优化模型时,建议把PSO的每一代结果都保存成mat文件,方便后续回溯和分析。很多时候你觉得算法“不收敛”,回头看看中间代粒子的分布才发现,其实算法在第30代就找到了正确的搜索方向,只是后来某些参数不合适导致又被带偏了。保存中间结果,会让你对整个优化过程的理解深入很多,也会让最终方案的汇报更有底气。
