基于煤耗特性曲线的遗传算法 — 火电机组负荷经济分配(ELD)

这是电力系统中一个经典且仍在用的课题:已知各台机组发电功率与煤耗量的关系(煤耗特性曲线),在总负荷给定的前提下,把负荷"切"给各机组,使全厂总煤耗最小,同时满足各类约束。传统方法用等微增率法(λ-迭代),但当特性曲线非凸、存在阀点效应、禁止运行区等复杂因素时,解析法失效,于是引入遗传算法(GA)这类全局启发式优化器。


一、煤耗特性曲线建模

1.1 基本二次模型(最常用)

对第 i 台机组,煤耗量(或成本)\(F_i\) 与出力 \(P_i\) 的关系通常近似为:

\[F_i(P_i) = a_i P_i^2 + b_i P_i + c_i \quad (\text{单位:kg/h 或 ¥/h}) \]

参数 含义
\(a_i > 0\) 反映煤耗随出力的二次增长(效率递减)
\(b_i\) 线性项系数
\(c_i\) 空载/固定煤耗
\(P_i^{min}\)\(P_i^{max}\) 机组技术出力上下限

工程上这些系数一般通过最小二乘法遗传算法自身对历史运行数据点 \((P, F)\) 做二次拟合得到。

1.2 带阀点效应的精细模型

\[F_i(P_i) = a_i P_i^2 + b_i P_i + c_i + \left| e_i \cdot \sin\big(f_i \cdot (P_i^{min} - P_i)\big) \right| \]

这个正弦项引入了非凸、不光滑的波动,正是传统梯度法"搞不定"而GA大显身手的地方。


二、优化问题的完整数学模型

2.1 目标函数

\[\min \; F_{total} = \sum_{i=1}^{N} F_i(P_i) \]

2.2 约束条件

约束 表达式 说明
功率平衡 \(\sum_{i=1}^{N} P_i = P_D\) 全厂出力 = 调度下达的总负荷
出力上下限 \(P_i^{min} \le P_i \le P_i^{max}\) 锅炉/汽轮机安全运行边界
爬坡速率(动态场景) \(|P_i(t)-P_i(t-1)| \le R_i\) AGC场景下的附加约束
禁止运行区(可选) \(P_i \notin [P_i^{forbid\_1}, P_i^{forbid\_2}]\) 振动/共振区间

其中等式约束 \(\sum P_i = P_D\)最难处理的点——下面讲怎么消掉它。


三、遗传算法设计(核心)

3.1 编码方案 —— 实数编码(推荐)

不要二进制编码,直接用实向量表示各机组的出力:

个体 X = [P₁, P₂, ..., P_N]

实数编码避免了二进制↔十进制反复转换的精度损失,也更契合连续变量的物理意义。

3.2 关键技巧:消去等式约束

最优雅的做法是把 \(N\) 台机组的 \(N\) 个变量降到 \(N-1\) 个:

  1. 随机生成前 \(N-1\) 台机组的出力:\(P_1, P_2, ..., P_{N-1}\)
  2. \(N\) 台机组由功率平衡直接算出

    \[P_N = P_D - \sum_{i=1}^{N-1} P_i \]

  3. 检查 \(P_N\) 是否落在 \([P_N^{min}, P_N^{max}]\) 内——不合法则丢弃/重生成该个体

这样就彻底消灭了罚函数的设计烦恼,也不用调惩罚因子的权重。

3.3 适应度函数

因为目标是最小化煤耗,而GA天生最大化适应度,所以取倒数或取负:

\[fitness(X) = \frac{1}{1 + \displaystyle\sum_{i=1}^{N} F_i(P_i)} \]

或者简单用 fitness = -F_total

3.4 选择 / 交叉 / 变异

算子 推荐策略 说明
选择 锦标赛选择 / 轮盘赌 锦标赛更稳定,不易早熟
交叉 BLX-α 跨界交叉 / 模拟二进制交叉(SBX) 实数编码专属,保持多样性
变异 高斯变异:\(\tilde{P}_i = P_i + N(0, \sigma)\) σ随代数衰减 → 后期精细搜索
精英保留 必做 把每一代最优个体直接复制进下一代

3.5 自适应参数(改进点)

\[\begin{aligned} p_c &= p_{c1} - (p_{c1}-p_{c2})\cdot\frac{f' - f_{avg}}{f_{max} - f_{avg}} \\ p_m &= p_{m1} + (p_{m2}-p_{m1})\cdot\frac{f_{avg} - f'}{f_{max} - f_{avg}} \end{aligned} \]

适应性越好的个体,交叉概率越小(保护优良基因),变异概率也越小——这是文献中反复验证有效的改进。


四、MATLAB伪代码骨架

%% ===== 参数 =====
N        = 3;              % 机组数
PD       = 600;            % 总负荷 MW
PopSize  = 100;
MaxGen   = 200;
Pcross   = 0.85;
Pmut     = 0.05;

% 煤耗系数 ai, bi, ci   (例:F_i = ai*Pi^2 + bi*Pi + ci)
a = [0.00142, 0.00194, 0.00480];
b = [7.14,    7.58,    8.53];
c = [90,      80,      120];
Pmin = [100, 60,  40];    % MW
Pmax = [300, 250, 180];   % MW

%% ===== 初始化 =====
Pop = zeros(PopSize, N);
for k = 1:PopSize
    while true
        P = rand(1,N-1) .* (Pmax(1:N-1)-Pmin(1:N-1)) + Pmin(1:N-1);
        PN = PD - sum(P);
        if PN >= Pmin(N) && PN <= Pmax(N)
            Pop(k,:) = [P, PN];
            break;
        end
    end
end

%% ===== 主循环 =====
for gen = 1:MaxGen
    %--- 适应度 ---
    Fit = zeros(PopSize,1);
    for k = 1:PopSize
        Pi = Pop(k,:);
        Fit(k) = 1 / (1 + sum(a .* Pi.^2 + b .* Pi + c));
    end
    
    %--- 选择(锦标赛) + 交叉(BLX-α) + 变异 + 精英保留 ---
    NewPop = EliteAndTournamentSelect(Pop, Fit, ...);
    NewPop = Crossover(NewPop, Pcross);
    NewPop = Mutate(NewPop, Pmut, Pmin, Pmax, PD);
    
    Pop = Repair(NewPop, Pmin, Pmax, PD);  % 保证功率平衡
end

%% ===== 输出最优 =====
[bestFit, idx] = max(Fit);
P_opt = Pop(idx,:)
F_opt = sum(a .* P_opt.^2 + b .* P_opt + c)

实际工程中常用 C++ 实现(满足AGC的实时性要求),收敛时间可从传统DP的"维数灾"降至秒级。


参考代码 基于煤耗特性曲线的遗传算法 www.youwenfan.com/contentcnv/101660.html

五、常见坑 & 改进方向

问题 现象 对策
初值全随机 → 大量非法个体 收敛慢、浪费评估 \([P_i^{min}, P_i^{max}]\)均匀采样 + 用功率平衡反推校验
早熟收敛 种群多样性迅速消失 自适应 \(p_m\) ↑ + 移民策略(定期注入随机个体)
只优化经济 → 忽略快速性 AGC模式下跟不上调度指令 升级为多目标GA(NSGA-II),Pareto前沿 + TOPSIS/熵权选解
煤耗曲线本身不准 优化结果"理论上最优但实际偏" GA在线拟合 替代静态的最小二乘拟合,跟踪机组老化/煤质变化

六、经典算例参考值

3机组标准测试算例(\(P_D=600\text{MW}\))的大致最优分配(二次模型,不计网损):

机组 出力 \(P_i\) (MW) 煤耗贡献 (kg/h)
#1 ~ 250~290
#2 ~ 160~210
#3 ~ 110~190
合计 600 ≈ 3100~3400(取决于系数)

λ-迭代法给出理论基准,GA应当在 ±0.5% 内逼近它;当加入阀点效应后,λ-迭代不再适用,GA的相对优势才真正体现出来。

posted @ 2026-06-03 10:17  bqyfa66984  阅读(23)  评论(0)    收藏  举报