电力系统调度一直是能源领域的关键课题。在"双碳"目标背景下,如何协调水电与火电这两种特性迥异的电源,实现经济性与环保性的平衡,成为电力行业亟待解决的难题。传统调度方法往往采用加权求和的方式将多目标转化为单目标,这种方法存在明显的局限性——决策者需要预先确定各目标的权重,而权重的微小变化可能导致完全不同的调度方案。
我们团队在西南某区域电网的实际项目中,就曾遇到过这样的困境:当环保部门要求降低排放时,简单地提高环保权重会导致发电成本骤增;而强调经济性时,又难以满足日益严格的环保标准。正是这样的实际需求,促使我们探索基于NSGA-Ⅲ的多目标优化方法。
在梯级水电-火电联合调度中,我们通常需要同时优化三个相互冲突的目标:
数学上可表述为:
code复制min F(x) = [f1(x), f2(x), f3(x)]
s.t. g(x) ≤ 0, h(x) = 0
其中x代表机组出力组合,g和h分别表示不等式和等式约束。
相较于经典的NSGA-II,NSGA-Ⅲ主要在以下方面做出改进:
matlab复制function RefPoints = generate_refpoints(M, p)
% M: 目标数,p: 分割数
combinations = nchoosek(1:(M+p-1), M-1);
points = diff([zeros(size(combinations,1),1),...
combinations,...
(M+p)*ones(size(combinations,1),1)], 1, 2) - 1;
RefPoints = points/p;
end
归一化处理:通过极值点识别和坐标变换,解决不同目标量纲不一致的问题,这对电力调度中成本(万元)与排放(吨)的混合优化尤为关键。
精英保留策略:采用非支配排序与参考点关联的niching机制,确保解集的多样性和收敛性。
火电成本通常采用二次函数表示:
code复制f_cost = Σ(a_i·P_i^2 + b_i·P_i + c_i)
其中P_i为第i台机组出力,a,b,c为成本系数。
排放模型则多采用指数形式:
code复制f_emission = Σ(α_i·P_i^2 + β_i·P_i + γ_i + η_i·exp(δ_i·P_i))
考虑水头效应和流量连续性:
code复制P_hyd = g·η·H·Q
H = H_storage + H_tailrace - H_loss
V_t+1 = V_t + (I_t - Q_t)·Δt
其中H为净水头,Q为发电流量,V为库容,I为入库流量。
matlab复制function [pop, front] = NSGA3(pop, Problem, params)
% 初始化参考点
[Z, Zmin] = init_refpoints(Problem.M, params.p);
for gen = 1:params.maxGen
% 生成子代
offspring = genetic_operator(pop);
% 合并种群
combined = [pop; offspring];
% 非支配排序
[fronts, ~] = non_dominated_sorting(combined);
% 环境选择
pop = environmental_selection(fronts, Z, Zmin);
% 更新参考点
Zmin = update_reference(combined, Problem.M);
end
end
采用动态惩罚函数法处理约束违反:
matlab复制function penalty = constraint_violation(x)
% 计算各约束违反程度
g_val = Problem.g(x);
h_val = Problem.h(x);
% 不等式约束违反
g_vio = max(0, g_val);
% 等式约束违反(允许微小误差)
h_vio = max(0, abs(h_val) - 1e-4);
penalty = sum(g_vio) + sum(h_vio);
end
针对梯级水电的时空耦合特性,采用"先空间后时间"的解码策略:
matlab复制function [P_hydro, V] = decode_hydro(x_hydro)
% x_hydro: 决策变量中水电部分
nHydros = size(Problem.Hydro, 1);
nHours = Problem.nHours;
% 初始化
P_hydro = zeros(nHydros, nHours);
V = zeros(nHydros, nHours+1);
V(:,1) = Problem.initialVol;
for t = 1:nHours
% 空间分配(当前时段各电站出力)
for k = 1:nHydros
P_hydro(k,t) = Problem.Hydro(k).Pmin + ...
x_hydro(k,t) * (Problem.Hydro(k).Pmax - Problem.Hydro(k).Pmin);
% 计算发电流量
Q = Problem.Hydro(k).coeff * P_hydro(k,t) / ...
(Problem.Hydro(k).eff * 9.81 * Problem.Hydro(k).head);
% 更新库容
V(k,t+1) = V(k,t) + (Problem.inflow(k,t) - Q) * 3600;
end
% 处理梯级耦合(下游电站入库=上游电站出库)
for k = 2:nHydros
if Problem.Hydro(k).upstream == k-1
V(k,t+1) = V(k,t) + (Problem.inflow(k,t) + ...
Problem.Hydro(k-1).release(t) - ...
Problem.Hydro(k).release(t)) * 3600;
end
end
end
end
当目标超过3个时(如增加调峰性能、备用容量等指标),参考点数量会爆炸式增长。我们采用:
针对水头效应导致的非线性,采用:
matlab复制% 水头近似计算
H_eff = @(V) H_max * (0.5 + 0.5*(V - V_min)/(V_max - V_min));
matlab复制parfor i = 1:size(pop,1)
[pop(i).f, pop(i).g] = evaluate(pop(i).x);
end
matlab复制function plot_pareto(front)
[~,idx] = sort(front(:,1));
plot3(front(idx,1), front(idx,2), front(idx,3), 'bo-');
xlabel('成本(万元)');
ylabel('排放(吨)');
zlabel('水电利用率(%)');
grid on;
rotate3d on;
end
我们以某区域实际数据为例(10台火电+5级梯级水电):
| 方案类型 | 总成本(万) | CO2排放(吨) | 水电利用率 |
|---|---|---|---|
| 纯经济调度 | 1256 | 8560 | 68% |
| 纯环保调度 | 1589 | 7210 | 82% |
| NSGA-Ⅲ解1 | 1321 | 7890 | 79% |
| NSGA-Ⅲ解2 | 1405 | 7520 | 85% |
参数调优心得:
性能提升技巧:
常见问题排查:
Matlab加速建议:
这个项目给我们最大的启示是:在多目标电力调度中,不存在绝对"最优"的解,而是提供一系列权衡方案。实际应用中,我们开发了交互式决策支持界面,允许调度员在Pareto前沿上动态探索,结合实时运行状态选择最合适的调度方案。这种将先进算法与人类经验相结合的方式,在实践中取得了显著成效——在某省级电网的应用中,相比传统方法年均节省燃料成本约7.2%,同时减少CO2排放5.8%。