搞配电网优化调度的人,应该都有这种感觉:当分布式电源不再是规划图上的方块,而是真的接入到线路、台区甚至用户屋顶之后,调度这活儿就从“跟负荷跑”变成了“跟账本跑”。风机、光伏出力是波动的,柴油机和燃气轮机可以调但烧钱,储能能削峰填谷但充放次数和损耗都得记在成本里,外网购电还有峰谷价差。这么多因素搅在一起,核心问题就一句话:在满足负荷的前提下,怎么安排每台电源的出力,让系统总运行成本最低。这就是“配电网优化调度”里分布式电源经济调度要做的事,也正是本文要拆解的内容——用粒子群算法(PSO)去解决分布式电源经济调度,并在一个24小时调度周期里实现成本最小化。
这套东西适合谁看?我觉得三类人最合适:一是刚入行微电网、综合能源方向的工程师,想搞清楚调度策略具体怎么建模、怎么落地;二是在校学生,正在学智能优化算法,想知道粒子群算法原理之外它到底怎么接真实问题;三是已经在跑线性规划、但遇到非线性或非凸调度场景,想换一种求解思路的研究者。文章会从问题建模讲起,到粒子群算法的关键设计,再到MATLAB实操、参数调优和常见坑位,最后聊一聊现在微电网调度里很受关注的滚动时域思路。不夸张地说,把这套逻辑完整跑通之后,你再去看具体的能量管理平台,会发现很多模块都是这套框架的变体。
1. 为什么配电网经济调度值得做:从“发够”到“发得便宜”
1.1 分布式电源接入后,调度逻辑彻底变了
传统配电网的调度,本质上是“跟着负荷走”。负荷曲线是外部给定的事实,电网通过调度变电站和大电厂出力来满足末端需求,功率流向基本是从大电网到用户。这个时候的成本问题也存在,但多体现在输配电价和网损里,调度员操心的主要还是“够不够用”和“安不安全”。
分布式电源大量接入之后,问题变得完全不一样。一个很常见的场景是:某工业园区屋顶装了光伏,旁边配了一台柴油发电机作为保安电源,又加装了一套锂电池储能参与需求响应,同时它还从大网购电。此时“电网”不再是单向供电源,而是一个由多个可控或半可控电源、储能和柔性负荷共同组成的局部电力系统。调度要决策的事情,不再是“要不要拉闸”,而是变成了一串经济性问题:“光伏大发时,是给储能充电还是直接倒送?”“柴油发电机是在电价峰值时段开,还是在电价低的谷段备用?”“电网购电和自己发电,哪个组合更划算?”
这就是分布式电源经济调度的来源。它本质上是一个带约束的非线性规划问题:以各可控电源出力、储能充放电功率、联络线交换功率为决策变量,以系统运行总成本最低为目标函数,同时满足功率平衡、机组出力上下限、储能SOC约束、联络线容量约束等。手动安排这种调度几乎不可能,因为决策变量通常几十个甚至上百个,它们之间还有充放电时序耦合,单靠人的经验很难逼近全局最优解,必须交给优化算法来算。
1.2 经济调度的成本账:谁在花钱、怎么省钱
做经济调度,先要把“钱花在哪”理清楚。一个典型的分布式配电网,日运行成本通常由这几块构成:
- 可控机组的燃料费用。柴油机、燃气轮机的燃料成本通常与出力呈二次函数关系,出力越大,边际成本越高。
- 外网购电成本。买电是跟着分时电价走的,峰段贵、谷段便宜,差价可能接近三倍。
- 运行维护成本。光伏、风电虽然燃料免费,但设备运维、组件清洗、逆变器损耗等都要摊进成本。
- 储能的损耗与寿命成本。储能充放电有能量损耗,而且循环次数直接影响电池寿命,不能“白嫖”。
- 启停成本。如果可控机组一天内频繁启停,启停成本和寿命折损也要算进去。
我常用一个家庭做饭的类比来解释:厨房里有燃气灶、电磁炉、电蒸锅,燃气灶火力猛但燃气贵,电磁炉便宜但加热慢,电蒸锅预热要耗电,家里还分了峰谷电价。晚饭要同时做三个菜,怎么安排三口锅的功率和启动时间,才能让这一顿饭的电费加燃气费最省?这和配电网经济调度是同一个逻辑,只不过“锅”变成了机组,“菜”变成了24小时的负荷曲线。
经济调度的目标,就是把这笔账从“凭经验拍脑袋”变成“数学上可验证的最优解”。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 分布式电源系统建模:先给每个设备算一笔账
2.1 成本函数怎么写
调度模型的第一步,是把各个电源的成本特性写成数学表达式。常规处理方式如下。
对于柴油机或微型燃气轮机,燃料成本一般用二次多项式拟合:
C_i(P_i) = a_i * P_i² + b_i * P_i + c_i
其中P_i是机组i的有功出力,a_i、b_i、c_i是成本系数。二次项描述的是机组在高负荷区效率下降带来的边际成本上升,一次项是主要燃料成本,常数项是空载损耗或最低燃料消耗。
从大网购电的成本则是时段电价乘以购电功率:
C_grid(t) = price(t) * P_grid(t)
price(t)是分时电价,P_grid(t)是联络线功率,正值表示从大网购电。如果允许倒送电,倒送部分可以按上网电价计为负收益;如果电网侧不允许倒送,则要在约束里强制P_grid(t) ≥ 0。
光伏和风电在计算经济调度时通常只计运行维护成本,而且数值相对很小,比如0.02~0.05元/kWh。储能可以按其充放电量和折算后的维护成本来计,也可以单独建一个“充放行为惩罚”项,用来抑制高频次的浅充浅放。
这样,整个系统的目标函数可以写成:
min F = Σ_t=1^T [ Σ_i=1^NG C_i(P_i(t)) + C_grid(t) + C_om(t) ]
其中T是调度时段数,一天就是24,NG是可控机组台数。
2.2 约束条件怎么列
目标函数只是把“想省钱”的方向说清楚了,真正让结果可信的是约束条件。经济调度的约束大概分四类。
第一类是最核心的功率平衡约束,任意时刻所有电源出力之和必须等于负荷:
Σ_i P_i(t) + P_pv(t) + P_sto(t) + P_grid(t) = P_load(t)
这个约束必须每个时段都严格成立。如果忽略它,调度方案就是空中楼阁,现实中根本执行不了。
第二类是机组出力上下限:
P_i_min ≤ P_i(t) ≤ P_i_max
对柴油机这类可控机组,下限通常取技术最小出力,不是0,因为低负载区域燃烧效率差甚至无法稳定运行。上限是额定容量。
第三类是储能约束,既包括单时段的充放电功率限制:
-P_sto_max ≤ P_sto(t) ≤ P_sto_max
也包括跨时段的SOC动态约束:
SOC(t+1) = SOC(t) - P_sto(t) * Δt / (η_dis * Cap) (放电时)
SOC_min ≤ SOC(t) ≤ SOC_max
第四类是联络线容量约束和爬坡约束:
|P_grid(t)| ≤ P_grid_max
-Δ_i ≤ P_i(t+1) - P_i(t) ≤ Δ_i
爬坡约束在小型柴油机组上经常被忽略,但如果调度周期是5分钟或15分钟,机组的物理爬坡能力就必须写进去,否则优化结果会让机组瞬间满载,实际跟不上。
2.3 储能为什么特殊
储能是整个调度模型里最特别的一个元素,因为它引入了跨时段耦合。普通机组每一时段的出力是独立的,但储能不是:你决定在凌晨给电池充电,它就会影响白天放电的SOC水平;SOC过低,午后可能的负荷高峰就无法响应。换句话说,储能单元把原本互相独立的24个时段“拴”在了一起。
打个比方,储能就像家里楼顶的水箱。你可以决定什么时候开泵抽水,什么时候放水洗澡,但水箱水位不能漫出来,也不能抽干。抽水要花电费,放水能换来“用热水”,而水位的上下限是硬约束。调度算法要同时决定“什么时候抽、什么时候放、放多少”,并且保证水位全程不越界,这比单独优化每个时段的用电要难得多。
在粒子群算法里,储能SOC的正确处理方式,不是把它作为独立决策变量去搜,而是在每个粒子评估适应度时,沿着时段顺序把SOC递归计算出来,再检查是否越界。越界的粒子通过罚函数压低适应度,引导搜索往可行域走。
3. 粒子群算法进场:为什么它能啃下这个非线性问题
3.1 粒子群算法的核心逻辑
配电网经济调度目标函数是非线性的,约束种类多,变量还耦合,传统线性规划和枚举法都不好使。这时候粒子群算法就显出了价值。它的名字很形象,就是对鸟群觅食行为的一种数学模拟。
想象一群鸟在一片未知区域找食物,每只鸟不知道食物在哪,但知道当前位置离食物有多远,而且整个鸟群中总有一只鸟离食物最近。其他鸟会一边回忆自己飞过的“最佳位置”,一边朝那只最近鸟的位置靠近,同时保留一点自己的随机性。粒子群算法把这个过程数学化之后,每个粒子就是解空间中的一个候选解,速度向量决定下一步飞行的方向和步长。
每次迭代中,粒子按照两个公式更新:
v_i^(k+1) = w * v_i^k + c1 * r1 * (pbest_i - x_i^k) + c2 * r2 * (gbest - x_i^k)
x_i^(k+1) = x_i^k + v_i^(k+1)
这里w是惯性权重,v是粒子速度,x是粒子位置,pbest_i是该粒子历史最优位置,gbest是整个群体历史最优位置,c1和c2是学习因子,r1和r2是[0,1]之间的随机数。
这个公式拆开看很有意思:第一项wv保留粒子之前的运动惯性,相当于“别突然停,继续搜”;第二项c1r1*(pbest-x)是自我认知项,让粒子朝自己曾经找到的最好位置靠拢;第三项c2r2(gbest-x)是社会认知项,让粒子学习群体最优经验。三个力量的拉扯,构成了粒子群搜索的基本动力。
粒子群算法为什么适合配电网经济调度?核心原因有三条:不需要求导,能直接处理非凸、非线性、甚至带离散变量的目标函数;实现简单,几十行代码就能搭出主流程;扩展性好,可以和罚函数、局部搜索、变异操作轻松结合。
3.2 参数怎么选:w、c1、c2、粒子数和迭代次数
粒子群算法效果好坏,很大程度上由参数决定。我实测下来比较稳妥的起点如下。
惯性权重w是最重要的参数,控制全局探索和局部开发之间的平衡。w大,粒子速度快,搜索范围广,但收敛慢;w小,局部搜索精细,但容易过早聚集。常见的做法是让w从0.9线性递减到0.4,前期跳得远,后期收得细。如果问题不算复杂,固定w=0.7也能跑出不错的结果。
学习因子c1和c2一般取2,或者1.5。c1过大会让每个粒子只按自己的路径走,群体协同变差;c2过大会让粒子过早被某个局部最优“吸”过去。也有的改进算法让c1从2.5降到0.5,c2从0.5升到2.5,前面多探索,后面多收敛。
粒子数和迭代次数要根据问题维度来定。像24时段、3个可调单元的算例,决策变量是72维,粒子数取100,迭代300次,基本能稳定收敛。如果维数更高,粒子数可以增加到150到200,但运行时间也会线性增长。速度上限Vmax通常设为变量区间宽度的10%~20%,过大会导致粒子直接穿过最优点,过小则爬山坡很慢。
我习惯把这些参数做成一个表,不同业务场景直接查表选初值:
| 参数 | 推荐范围 | 对结果的影响 |
|---|---|---|
| 惯性权重w | 0.4~0.9线性递减 | w大搜索广,w小收敛稳 |
| 学习因子c1 | 1.5~2.5 | 控制个体历史最优的学习力度 |
| 学习因子c2 | 1.5~2.5 | 控制群体最优对粒子的引导力度 |
| 粒子数 | 问题维度的1.5~3倍 | 过少易早熟,过多耗时长 |
| 迭代次数 | 100~500 | 太少不收敛,太多空耗算力 |
| Vmax | 变量范围的10%~20% | 过大跳过最优,过小收敛过慢 |
3.3 约束处理:罚函数法与边界修正怎么配合
使用粒子群算法,难点不在更新公式,而在如何让粒子生成的解满足各类约束。约束处理不好,算法跑出来的“最优解”根本没法用。
针对上下限约束,最简单的做法是边界裁剪。粒子更新后,凡是超出Pmin或Pmax的维度,直接拉回到边界值。这种情况在储能功率上同样适用,超出最大充放电功率就截断。
针对功率平衡这样的等式约束,更合适的做法是把其中一个变量设计为“平衡变量”。在我的算例里,P_grid不参与粒子编码,而是在适应度函数中由功率平衡直接解出来:
P_grid(t) = P_load(t) - P_pv(t) - P1(t) - P2(t) - Psto(t)
这样一来,等式约束在构造上就被自动满足,粒子群不需要去硬搜那部分维度,搜索维度变少,收敛速度也会更快。剩下的只是对P_grid做上限和不允许倒送的处理。
针对SOC这样的跨时段耦合约束,更实用的方式是罚函数法。扩展的适应度函数写成:
fitness = 原始目标函数 + λ1 * Σ(max(0, SOC - SOC_max)²) + λ2 * Σ(max(0, SOC_min - SOC)²) + λ3 * Σ(max(0, -P_grid)²)
罚函数系数λ的选择是个经验活。太小,粒子会找到一个成本很低但SOC严重越界的“假最优解”;太大,粒子的搜索注意力全部放在满足约束上,可能错过真正经济的最优区域。我的做法是先用小数量级(如100)试跑,观察约束违例情况,逐步加大到能稳定满足约束的最小罚系数。
4. MATLAB实操:从零写一个经济调度求解器
4.1 算例场景与参数准备
下面给一个可以直接参考的算例:一个小型配电网,包含2台柴油发电机、1套锂电池储能、1个光伏电站,可向大网购电,调度周期是24小时,时间粒度1小时。机组和系统参数如下表:
| 项目 | DG1 | DG2 | 储能 |
|---|---|---|---|
| 额定功率/kW | 300 | 200 | 100 |
| 最小出力/kW | 30 | 20 | -100 |
| 成本系数a | 0.0005 | 0.0008 | — |
| 成本系数b | 1.2 | 1.0 | — |
| 成本系数c | 20 | 15 | — |
储能容量200kWh,SOC上限0.9,下限0.2,初值0.5,充放电效率0.95。光伏预测出力和负荷曲线我采用一组典型示例数据,实际工程中可直接替换成SCADA或预测系统给我的数值。
电价采用典型分时电价:
- 谷段(23点~次日7点):0.4元/kWh
- 平段(7~10点、15~18点、21~23点):0.8元/kWh
- 峰段(10~15点、18~21点):1.2元/kWh
4.2 粒子编码与适应度函数设计
在这个24时段算例中,粒子需要编码的有三个块:
- P1:DG1在24个时段的出力,维度24
- P2:DG2在24个时段的出力,维度24
- Psto:储能在24个时段的充放电功率,维度24,正值为放电
粒子总维度是72。P_grid不作为编码变量,而是在每个粒子内部通过功率平衡实时计算出来。
适应度函数由三部分组成:第一部分是所有柴油机24小时的燃料成本,第二部分是购电成本(对P_grid为正的部分计费),第三部分是储能和光伏的运维成本,最后加上SOC越界和P_grid倒送的罚函数。
4.3 核心代码实现
以下代码展示核心逻辑,在MATLAB里基本可以直接运行,但负荷、光伏、电价等数据需要按实际场景替换。
matlab复制% 粒子群算法求解配电网经济调度(简化示例)
clear; clc; close all;
%% 基础数据
T = 24; % 调度时段数
dim = 3 * T; % 决策变量维度:DG1(24) + DG2(24) + 储能(24)
% 负荷曲线、光伏出力、分时电价(示例数据)
P_load = [850 820 800 780 790 830 900 1050 1200 1350 1400 1450 ...
1420 1380 1320 1280 1350 1500 1550 1450 1350 1250 1100 950];
P_pv = [0 0 0 0 0 20 80 160 240 300 330 340 320 280 220 150 90 40 10 0 0 0 0 0];
price = [0.4 0.4 0.4 0.4 0.4 0.4 0.8 0.8 1.2 1.2 1.2 1.2 ...
1.2 1.2 0.8 0.8 0.8 1.2 1.2 1.2 0.8 0.8 0.8 0.4];
% 柴油机参数
a = [0.0005; 0.0008];
b = [1.2; 1.0];
c = [20; 15];
Pmin = [30; 20];
Pmax = [300; 200];
% 储能参数
capSto = 200; % 容量 kWh
soc0 = 0.5; % SOC初值
socMin = 0.2;
socMax = 0.9;
eta = 0.95; % 充放电效率
PstoMax = 100; % 最大充放电功率 kW
%% PSO参数
nPop = 100;
maxIter = 300;
wMax = 0.9;
wMin = 0.4;
c1 = 2;
c2 = 2;
Vmax = 0.2; % 速度上限比例
%% 初始化种群
x = zeros(nPop, dim);
v = zeros(nPop, dim);
for i = 1:nPop
x(i, 1:T) = Pmin(1) + (Pmax(1) - Pmin(1)) * rand(1, T);
x(i, T+1:2*T) = Pmin(2) + (Pmax(2) - Pmin(2)) * rand(1, T);
x(i, 2*T+1:3*T) = -PstoMax + 2 * PstoMax * rand(1, T);
v(i, :) = -Vmax + 2 * Vmax * rand(1, dim);
end
pbest = x;
fval_pbest = inf(nPop, 1);
for i = 1:nPop
fval_pbest(i) = fitness(x(i,:), P_load, P_pv, price, ...
a, b, c, Pmin, Pmax, capSto, soc0, socMin, socMax, eta, PstoMax);
end
[fval_gbest, idx] = min(fval_pbest);
gbest = pbest(idx, :);
%% 粒子群主循环
for iter = 1:maxIter
w = wMax - (wMax - wMin) * iter / maxIter;
for i = 1:nPop
r1 = rand(1, dim);
r2 = rand(1, dim);
v(i, :) = w * v(i, :) + c1 * r1 .* (pbest(i, :) - x(i, :)) ...
+ c2 * r2 .* (gbest - x(i, :));
% 限速
v(i, :) = max(min(v(i, :), Vmax), -Vmax);
% 位置更新
x(i, :) = x(i, :) + v(i, :);
% 边界裁剪
for t = 1:T
x(i, t) = min(max(x(i, t), Pmin(1)), Pmax(1));
x(i, T+t) = min(max(x(i, T+t), Pmin(2)), Pmax(2));
x(i, 2*T+t) = min(max(x(i, 2*T+t), -PstoMax), PstoMax);
end
% 适应度计算与更新
fval = fitness(x(i,:), P_load, P_pv, price, ...
a, b, c, Pmin, Pmax, capSto, soc0, socMin, socMax, eta, PstoMax);
if fval < fval_pbest(i)
fval_pbest(i) = fval;
pbest(i, :) = x(i, :);
end
if fval_pbest(i) < fval_gbest
fval_gbest = fval_pbest(i);
gbest = pbest(i, :);
end
end
fprintf('迭代 %d/%d,当前最优成本 %.2f 元\n', iter, maxIter, fval_gbest);
end
%% 输出最优调度
P1_opt = gbest(1:T);
P2_opt = gbest(T+1:2*T);
Psto_opt = gbest(2*T+1:3*T);
Pgrid_opt = P_load - P_pv - P1_opt - P2_opt - Psto_opt;
% 可视化调度结果
figure;
t = 1:T;
plot(t, P_load, 'k-o', 'LineWidth', 1.5); hold on;
plot(t, P1_opt, 'r-s', 'LineWidth', 1.2);
plot(t, P2_opt, 'b-^', 'LineWidth', 1.2);
plot(t, Pgrid_opt, 'g-d', 'LineWidth', 1.2);
plot(t, Psto_opt, 'm-x', 'LineWidth', 1.2);
legend('负荷', 'DG1出力', 'DG2出力', '电网交换', '储能功率');
xlabel('时段/h');
ylabel('功率/kW');
grid on;
适应度函数单独拆开来写如下:
matlab复制function f = fitness(x, P_load, P_pv, price, a, b, c, Pmin, Pmax, ...
capSto, soc0, socMin, socMax, eta, PstoMax)
T = 24;
P1 = x(1:T);
P2 = x(T+1:2*T);
Psto = x(2*T+1:3*T);
% 功率平衡解出电网交互功率
Pgrid = P_load - P_pv - P1 - P2 - Psto;
% 目标函数1:柴油机燃料成本
cost = sum(a(1) * P1.^2 + b(1) * P1 + c(1) ...
+ a(2) * P2.^2 + b(2) * P2 + c(2));
% 目标函数2:购电成本(只计正向购电,负值不加收益)
cost = cost + sum(price .* max(Pgrid, 0));
% 目标函数3:储能、光伏运维成本(简化示例)
cost = cost + 0.05 * sum(abs(Psto)) + 0.02 * sum(P_pv);
% 罚函数:SOC越界
pen = 0;
soc = soc0;
for t = 1:T
if Psto(t) > 0
soc = soc - Psto(t) / (eta * capSto);
else
soc = soc - Psto(t) * eta / capSto;
end
if soc < socMin
pen = pen + 1e4 * (socMin - soc)^2;
elseif soc > socMax
pen = pen + 1e4 * (soc - socMax)^2;
end
end
% 罚函数:不允许倒送电
pen = pen + 1e5 * sum((Pgrid < 0) .* (Pgrid.^2));
f = cost + pen;
end
这段代码设计里有两个关键选择值得说明。一是把Pgrid通过功率平衡解出来,而不是作为决策变量搜索,这样等式约束天然满足,粒子搜索维度也从96降到72,效率提升明显。二是SOC越界罚函数选用二次型而不是线性罚,因为二次型的梯度在越界越深时越大,能把粒子更有效地“推”回可行域。
4.4 一次典型运行的结果分析
以示例数据跑出来的结果,大致呈现出这样几个稳定规律。
从迭代曲线看,前50代目标值下降非常快,这说明群体很快找到了一个可行且较优的区域;150代之后曲线趋于平缓,300代基本收敛。如果在工程上追求计算速度,200代左右其实已经可以得到一个很接近最优解的结果,完全没有必要死磕300代之后那一点点改善。
从调度策略看,谷段电价低,系统倾向于从大网购电,两台柴油机维持技术最小出力,储能趁低谷充电;峰段电价高,柴油机基本满负荷运行,储能转为放电,把低谷充的电量释放出来。光伏大发的中午时段,P_grid会明显下降,说明本地光伏优先供应本地负荷,减少了高价购电。
从成本结构看,燃料成本、购电成本、运维成本占比大约在六成、三成、一成附近。这是很典型的含柴油机分布式系统结构,柴油机作为可调主力虽然灵活,但燃料成本也高,所以优化算法会尽量把它的出力空间留给电价高峰时段。
要特别说明的是,不同随机种子、不同罚函数系数下,粒子群优化结果会有小幅波动,这是启发式算法的正常现象。如果某个法方案每次跑出来的总成本相差超过5%,那大概率是罚函数权重或粒子数不合适,需要回到调参环节处理。
5. 调参经验、常见问题与坑位实录
5.1 粒子群参数调试的实测方向
基本粒子群算法看起来简单,真正拿去跑实际问题,要踩的坑不少。我在做这个算例时,总结出几条比较实在的经验。
第一条,先把模型跑通,再调参数。我第一次做调度优化时,花了一晚上调惯性权重和粒子数,后来发现结果不对的根源是适应度函数里SOC初值写错了,跟算法参数一点关系都没有。经济调度这种问题,模型和约束占七成,算法只占三成,模型不准确,再怎么优化也是在错误的地图里找宝藏。
第二条,w的线性递减区间,0.9到0.4是通用值,但要注意它和Vmax的配合。如果Vmax设得比较大,w后期降到0.4还是容易在最优解附近来回震荡;这时候把Vmax同步缩减,或者w降到0.3,效果会更好。
第三条,粒子群对初始种群比较敏感。单纯随机初始化,粒子可能在SOC越界区域大量聚集,前期浪费很多代去修正约束。我后来采用“部分继承”的策略,把上一轮滚动时域优化的gbest经过扰动后作为本轮初始种群的一部分,收敛速度快得明显。
5.2 常见问题与排查速查表
把实际工作中经常遇到的问题整理成一个表,排查起来效率会高很多:
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| 优化结果不满足功率平衡 | 罚函数权重过小 | 提高功率平衡罚系数或把电网功率设为平衡变量 |
| 收敛到明显不合理的低成本解 | SOC初值或SOC计算逻辑有误 | 检查SOC更新公式,检查储能充放电方向正负号 |
| 调度结果在相邻时段大幅跳跃 | Vmax过大 | 降低Vmax,增加爬坡约束 |
| 多次运行结果差异大 | 粒子数过少或迭代次数不足 | 增大粒子数,观察收敛曲线 |
| 光伏大发时P_grid倒送功率巨大 | 未设置倒送惩罚或惩罚过小 | 增加倒送罚函数,或强制P_grid不小于0 |
| 峰时段柴油机没有满载 | 燃料成本系数偏低或峰谷电价差不够 | 检查成本系数和分时电价参数 |
| 运行时间过长 | 粒子数和迭代次数冗余 | 根据收敛曲线适当缩减 |
5.3 局部最优与搜索停滞的应对:别只靠基本PSO
基本粒子群算法在这个问题上的最大问题是“早熟”,也就是种群过早聚集到某个局部最优点,失去了继续探索的能力。对配电网经济调度来说,局部最优往往意味着一种“次优的发电组合”,比如该让DG1多出力的时候,粒子们全都挤在让DG2多出力的方案里,而且怎么都跳不出来。
解决办法可以从两个方向入手。第一个方向是给算法加“扰动”,比如在迭代后期,当gbest连续20代没有改善时,随机选择部分粒子的若干维度重新初始化。第二个方向是改变颗粒度,用不同大小的扰动幅度混合搜索,避免所有粒子都沿着几乎相同的轨迹移动。
还有一种工程上很有效的方式:先用粒子群快速跑一个大致的全局区域,再用局部搜索算法(如fmincon或模式搜索法)对gbest做精修。粒子群负责找“山谷在哪个方位”,局部搜索负责在最优解附近认真爬坡。两套思路配合起来,既保留了粒子群的全局搜索能力,又把最终解的精度提上去了。
6. 从调度到实战:滚动时域与扩展方向
6.1 滚动时域控制在微电网调度中的价值
聊到微电网经济调度,前两年大家讨论的是“怎么把一天算完”,现在越来越多人在讨论“怎么把一天切成一段一段算”,这就是滚动时域控制,也叫滚动优化或模型预测控制思想在调度中的应用。
为什么会出现这种变化?因为静态优化假设“全天预测都准”,现实条件根本不满足。光伏出力随云量漂移,负荷预测到了傍晚容易偏差,你凌晨算出来的“全天最优方案”,到了中午可能已经完全不符合实际情况了。这时候按原计划走,轻则经济性变差,重则出现功率不平衡或储能过充。
滚动时域的流程很简单,可以概括成“短窗预测、在线求解、只执行第一步”:
- 在t时刻,基于最新预测,求解未来一段窗口(比如4小时)内的最优调度;
- 只执行t时刻这一个时段的控制指令;
- 到t+1时刻,滚动窗口向前推一个时段,用最新预测数据重新求解。
这个思路对配电网经济调度特别有价值。外网购电价格会变,光伏出力会变,负荷也会变,滚动优化让调度策略始终基于“最新信息”,相当于给方案加了反馈修正机制。
静态优化和滚动时域的区别可以这样理解:
| 方面 | 静态24小时优化 | 滚动时域调度 |
|---|---|---|
| 预测依赖 | 依赖全天预测数据 | 只依赖短窗口预测 |
| 抗误差能力 | 弱,天气波动后方案失效 | 强,每时段重新优化 |
| 计算负担 | 一次性求解大问题 | 每时段求解小问题 |
| 在线部署难度 | 高,离线方案难以实时修正 | 低,适合嵌入能量管理平台 |
| 全局最优性 | 理论上更接近全局最优 | 工程上更贴近真实运行 |
滚动时域窗口内的求解依然可以用粒子群算法。窗口缩短之后,粒子维度大幅下降,比如4小时窗口只有4×3=12维,粒子群迭代几十次就能得到结果,完全满足分钟级调度的实时性要求。
6.2 多目标与不确定性:下一步可以怎么走
成本最小化只是分布式电源经济调度的第一层目标。工程实际中,“又好又省”往往是多个目标同时要兼顾:既要成本低,又要碳排放少,还要减少弃风弃光。把碳排放系数叠加到燃料成本里是一种最简单的单目标化处理,但如果要真正权衡多个冲突目标,就需要多目标粒子群(MOPSO)、NSGA-II这类算法,在一次优化后得到一组帕累托前沿,再由调度员根据实际偏好挑选方案。
不确定性是另一个绕不开的方向。光伏和负荷预测都有误差,把随机性直接放进优化模型,可以使用场景法:生成若干典型光伏/负荷场景,对每个场景做调度,以期望成本最小为目标。也可以使用鲁棒优化思路:保证在最恶劣场景下约束仍然满足,代价是方案偏向保守,经济性会略差。
我个人的看法是,针对中小型配电网,滚动时域加上粒子群已经是一个性价比很高的组合。它没有复杂理论的高门槛,但能解决真实运行中最让人头疼的“预测不准”问题。等系统复杂度再上一个台阶,再考虑多目标和不确性建模也不迟。
回看我最早做粒子群经济调度那会儿,最大的教训就是“先把模型整明白,再碰算法”。很多同学上来就纠结粒子数取80还是120、惯性权重取0.7还是0.8,结果跑了半天发现适应度函数里功率平衡都没写对。经济调度这活儿,模型准确占七成,算法只占三成。你把成本和约束写清楚,粒子群哪怕用最基础版本的参数,都能得到一个合理的结果;模型错了,算法再高级也是白搭。后来我在做实时能量管理时,基本都在滚动时域框架下用粒子群,窗口压短之后不但求解快,抗预测误差的能力也好了不少。希望这篇内容能帮你少踩几个坑,把调度模型真正跑起来。
