在电力系统调度中,机组组合(Unit Commitment, UC)问题是一个经典的优化难题。简单来说,就是要在满足电力需求的前提下,决定哪些发电机组应该开启、哪些应该关闭,以及每台运行机组的最佳出力水平。这就像是一个复杂的拼图游戏,需要考虑发电成本、机组启停费用、爬坡速率限制等各种约束条件。
而需求响应(Demand Response, DR)则是近年来兴起的一种负荷侧管理策略。传统的电力调度只关注供给侧(发电厂)的调节,而需求响应则将负荷侧(用电方)也纳入调控范围。通过价格激励或直接控制手段,引导用户在高峰时段减少用电或在低谷时段增加用电。这就好比在交通高峰期实施错峰出行政策,可以有效缓解拥堵问题。
我们先来看不考虑需求响应的基础机组组合模型。假设系统中有N台发电机组,需要在T个时段内做出调度决策。定义以下变量:
目标是最小化总成本,包括发电成本和启停成本:
$$
\min \sum_{t=1}^T \sum_{i=1}^N [C_i(P_{i,t}) + SU_{i,t} + SD_{i,t}]
$$
其中$C_i(P_{i,t})$是机组i的发电成本函数,通常为二次函数:
$$
C_i(P_{i,t}) = a_i P_{i,t}^2 + b_i P_{i,t} + c_i
$$
约束条件包括:
在基础模型上引入需求响应,相当于在负荷侧增加了一个可调节的"虚拟机组"。设$DR_t$为时段t的需求响应量,则功率平衡约束变为:
$$
\sum_{i=1}^N P_{i,t} + DR_t = D_t
$$
需求响应量受到最大可削减量的限制:
$$
0 \leq DR_t \leq DR^{max}
$$
同时,系统需要支付需求响应补偿成本:
$$
C_{DR} = \lambda_{DR} \sum_{t=1}^T DR_t
$$
其中$\lambda_{DR}$是补偿系数。这个补偿成本需要加入总成本目标函数中。
粒子群算法(PSO)是一种模拟鸟群觅食行为的群体智能算法。每个粒子代表一个潜在解,通过跟踪个体最优(pbest)和群体最优(gbest)来更新自己的位置和速度。
对于连续优化问题,位置更新公式为:
$$
v_{i,d}^{k+1} = w v_{i,d}^k + c_1 r_1 (pbest_{i,d} - x_{i,d}^k) + c_2 r_2 (gbest_d - x_{i,d}^k)
$$
$$
x_{i,d}^{k+1} = x_{i,d}^k + v_{i,d}^{k+1}
$$
但对于机组组合这种离散问题,需要特殊的二进制版本。
在二进制PSO中,速度$v_{i,d}$被解释为位置$x_{i,d}$取1的概率。传统方法是使用sigmoid函数将速度映射到[0,1]区间:
$$
s(v_{i,d}) = \frac{1}{1+e^{-v_{i,d}}}
$$
然后通过随机数决定位置:
$$
x_{i,d} =
\begin{cases}
1, & \text{if } rand() < s(v_{i,d}) \
0, & \text{otherwise}
\end{cases}
$$
本文采用的改进策略包括:
matlab复制% 参数初始化
nParticle = 50; % 粒子数量
maxIter = 100; % 最大迭代次数
w_max = 0.9; % 初始惯性权重
w_min = 0.4; % 最终惯性权重
c1 = 2.0; % 个体学习因子
c2 = 2.0; % 群体学习因子
% 初始化粒子位置和速度
pop = randi([0,1], nParticle, nVar); % 二进制编码
v = zeros(nParticle, nVar); % 速度初始化
for iter = 1:maxIter
% 动态调整参数
w = w_max - (w_max-w_min)*iter/maxIter;
% 更新速度和位置
for i = 1:nParticle
% 速度更新
v(i,:) = w*v(i,:) + c1*rand(1,nVar).*(pbest(i,:)-pop(i,:)) ...
+ c2*rand(1,nVar).*(gbest-pop(i,:));
% 计算概率并更新位置
prob = 1./(1+exp(-v(i,:)));
pop(i,:) = rand(1,nVar) < prob;
% 变异操作
if rand() < 0.05
mutIdx = randi(nVar);
pop(i,mutIdx) = ~pop(i,mutIdx);
end
end
% 评估适应度并更新pbest/gbest
[pbest, gbest] = updateBest(pop, pbest, gbest);
end
我们采用一个包含5台机组的测试系统,具体参数如下:
| 机组 | Pmin(MW) | Pmax(MW) | a($/MW²h) | b($/MWh) | c($/h) | 最小运行时间(h) | 最小停机时间(h) |
|---|---|---|---|---|---|---|---|
| 1 | 100 | 500 | 0.0035 | 12.5 | 600 | 4 | 2 |
| 2 | 120 | 550 | 0.0040 | 13.0 | 650 | 5 | 3 |
| 3 | 150 | 600 | 0.0045 | 13.5 | 700 | 5 | 3 |
| 4 | 180 | 650 | 0.0050 | 14.0 | 750 | 6 | 4 |
| 5 | 200 | 700 | 0.0055 | 14.5 | 800 | 6 | 4 |
需求响应参数:
假设某日的24小时负荷需求如下(单位:MW):
matlab复制loadProfile = [1100, 1050, 1000, 950, 900, 950, 1100, 1300, 1500, ...
1600, 1650, 1700, 1750, 1700, 1650, 1600, 1550, 1500, ...
1450, 1400, 1350, 1250, 1150, 1050];
运行改进二进制粒子群算法后,得到的最优调度方案总成本为$78,542。与传统二进制PSO相比,成本降低了约3.7%,且计算时间缩短了15%。
需求响应主要发生在高峰时段(11:00-15:00),最大削减量达到80MW。这有效减少了高价机组的启停次数,优化了系统运行经济性。
机组组合问题需要同时对启停状态和出力水平进行编码。我们采用混合编码方案:
例如,对于5台机组24小时的问题,每个粒子包含:
机组组合问题包含大量复杂约束,处理不当容易导致不可行解。我们采用以下策略:
matlab复制function cost = evaluateFitness(pop)
% 解码得到启停状态和出力
[u, P] = decode(pop);
% 计算基本成本
totalCost = calculateGenerationCost(u, P) + calculateDRCost(DR);
% 添加约束惩罚
penalty = 0;
% 检查最小启停时间
for i = 1:nUnit
[violation, ~] = checkMinUpDown(u(i,:), minUp(i), minDown(i));
penalty = penalty + 1e6 * violation; % 大惩罚系数
end
% 检查爬坡速率
rampViolation = checkRampConstraints(P, rampRate);
penalty = penalty + 1e4 * rampViolation;
cost = totalCost + penalty;
end
通过大量实验,我们总结出以下参数设置经验:
实际调试中发现,动态调整策略对算法性能影响显著。建议先固定其他参数,单独测试w、c1、c2的不同变化策略。
我们在同一测试系统上对比了不同算法的性能:
| 算法 | 平均成本($) | 标准差($) | 平均运行时间(s) | 最优解比例 |
|---|---|---|---|---|
| 优先列表法 | 82,156 | 1,245 | 12.5 | 0% |
| 传统二进制PSO | 79,874 | 856 | 45.2 | 15% |
| 改进二进制PSO(本文) | 78,542 | 632 | 38.4 | 32% |
| 混合整数规划 | 77,985 | - | 210.7 | 100% |
虽然混合整数规划能保证全局最优,但计算时间过长,不适合在线应用。改进PSO在可接受时间内获得了接近最优的解。
在实际电力系统调度中心实施这类算法时,建议采用逐步过渡的方式。可以先在历史数据上离线测试算法性能,然后作为辅助决策工具运行一段时间,最后再考虑完全替代传统方法。