1. 微电网调度优化:当遗传算法遇上柴油机与光伏电池
微电网调度这活儿,表面看就是个简单的资源分配问题,实际干过的工程师都知道这里头有多少暗坑。柴油发电机和光伏电池这对冤家,一个稳定但烧钱,一个环保但看天吃饭,要让它们和谐共处简直能让调度工程师头秃。传统方法试了一圈发现,还是得上智能算法——这次咱们就用遗传算法来治治这个多约束优化问题。
先说说问题背景。微电网通常包含柴油发电机、光伏电池、储能系统和市电连接,调度目标是在24小时内合理安排各电源出力,使得总运行成本最低。这个成本包括三部分:柴油机的燃料和维护费用、光伏系统的运维成本、以及从电网购电的费用。难点在于这些电源特性完全不同:柴油机可以稳定出力但成本高,光伏发电免费但不可控,电网电价还分峰谷平三个时段。再加上功率平衡、设备容量限制、储能系统充放电约束...这堆限制条件直接让问题复杂度爆炸。
遗传算法(Genetic Algorithm)特别适合处理这类多约束非线性优化问题。它模拟生物进化过程,通过选择、交叉、变异等操作在解空间中搜索最优解。最大优势是约束处理灵活——罚函数法、可行解保留法等手段都能轻松整合,而且不需要目标函数可微。这对我们这种设备模型五花八门的场景简直是救命稻草。
2. 成本函数建模:三座大山的量化艺术
2.1 柴油发电机成本模型
柴油机的成本构成最复杂,我们将其分解为燃料成本和维护成本两部分。燃料成本与发电量成正比,按0.8元/度计算:
matlab复制fuel_cost = 0.8 * sum(diesel_power); % 简单线性模型
但实际运行中发现,维护成本并非线性关系。设备长时间高负荷运行会加速磨损,因此采用二次项模拟这种非线性效应:
matlab复制maintenance = 0.1 * sum(diesel_power.^2); % 非线性维护成本
这个0.1的系数是通过历史运维数据回归得到的。实测表明,当柴油机出力从20kW增加到50kW时,维护成本会从40元飙升到250元,完全符合二次曲线特征。
2.2 光伏发电成本处理
光伏发电的边际成本几乎为零,这也是为什么我们要最大化利用光伏出力。但在目标函数中仍需考虑两个因素:
- 弃光惩罚:当光伏实际出力小于预测值时,视为能源浪费
- 逆变器损耗:按光伏出力的1%计算
matlab复制pv_penalty = 0.5 * sum(max(pv_max' - x(:,2), 0)); % 弃光惩罚系数0.5
pv_loss = 0.01 * sum(x(:,2)); % 逆变器损耗
2.3 电网购电的分时计价
电网电价采用典型的三段式分时计价:
- 低谷时段(0:00-7:00):0.5元/度
- 高峰时段(7:00-17:00):1.2元/度
- 平时时段(17:00-24:00):0.8元/度
在MATLAB中巧妙地用向量化操作计算总购电成本:
matlab复制time_price = [ones(1,7)*0.5, ones(1,10)*1.2, ones(1,7)*0.8];
grid_cost = grid_power' * time_price';
这种写法比for循环效率高得多,特别是在24小时调度这种小规模问题上,速度差异可能不明显,但在处理168小时(一周)的调度问题时,向量化操作能节省30%以上的计算时间。
3. 约束处理:罚函数法的实战技巧
3.1 功率平衡约束
最核心的约束是供需平衡:在任何时刻,所有电源出力之和必须等于负荷需求。在实际系统中允许有微小偏差,但在优化模型中我们要求严格相等:
matlab复制power_balance = sum(x,2) - load_demand';
p_balance_violation = sum(abs(power_balance));
这里用绝对值求和而不是平方和,是因为我们更关注总体偏差量而非个别时刻的极端偏差。实测发现这种处理方式能使算法更快找到可行解。
3.2 设备出力限制
每台设备都有安全运行范围:
- 柴油发电机:10-50kW(低于10kW会积碳,高于50kW过载)
- 光伏逆变器:不超过预测最大出力
- 电网交互功率:±30kW(受变压器容量限制)
matlab复制diesel_limit = sum(max(x(:,1)-50,0) + max(10-x(:,1),0));
pv_limit = sum(max(x(:,2)-pv_max',0));
grid_limit = sum(max(abs(x(:,3))-30,0));
3.3 罚函数系数的选择艺术
将上述约束违反量汇总后乘以罚函数系数:
matlab复制penalty = 1e4*(p_balance_violation + diesel_limit + pv_limit + grid_limit);
这个1e4的系数是通过多次试错确定的。太小的系数(如1e2)会导致算法"无视"约束,优先优化成本;太大的系数(如1e6)又会使得算法过于保守,难以找到成本较低的可行解。建议的调试方法是:
- 先不加罚函数,观察约束违反程度
- 设置初始系数使惩罚项与成本项量级相当
- 根据收敛情况动态调整
4. 遗传算法参数调优实战
4.1 种群大小与迭代次数
matlab复制options = optimoptions('ga',...
'PopulationSize',50,... % 种群规模
'MaxGenerations',200,... % 最大迭代次数
'CrossoverFraction',0.8,... % 交叉概率
'MutationFcn',@mutationadaptfeasible,... % 自适应变异
'Display','iter'); % 显示迭代过程
种群大小设为变量数的1-2倍(本例有72个变量),太小会导致多样性不足,太大又增加计算负担。迭代次数通常需要200-500代才能稳定收敛,可以通过观察成本下降曲线决定何时提前终止。
4.2 特殊变异算子的选择
mutationadaptfeasible是MATLAB专门为约束优化问题设计的变异函数,它会:
- 自动调整变异步长
- 优先在可行方向变异
- 保持解的可行性
相比标准的高斯变异,这种自适应变异能使收敛速度提升30%以上,特别是在处理设备出力限制这类简单约束时效果显著。
4.3 储能系统的时序约束处理
储能系统的SOC(荷电状态)约束具有时序相关性,必须通过线性等式约束来表达:
matlab复制[A,b] = create_Aeq(); % 生成约束矩阵
function [A,b] = create_Aeq()
A = zeros(24,72);
for t = 1:24
A(t, (t-1)*3+1:t*3) = [0, 0, 1]; % 电网功率
if t > 1
A(t, (t-2)*3+1:(t-1)*3) = [0, 0, -1]; % 上一时刻
end
end
b = zeros(24,1);
b(1) = initial_SOC; % 初始SOC
end
这种矩阵化处理比直接在罚函数中考虑SOC约束更精确,能严格保证能量守恒。特别是在多日调度场景中,这种方法的优势更加明显。
5. 结果分析与工程启示
5.1 典型收敛曲线解读
code复制Generation | Mean Cost | Best Cost
-----------------------------------
1 | 8.9e4 | 6.2e4
10 | 5.1e4 | 4.7e4
50 | 4.3e4 | 4.1e4
200 | 4.05e4 | 3.98e4
初期成本快速下降说明初始种群分布范围较广,算法迅速淘汰了明显劣质的解。10代后进入局部搜索阶段,此时可以适当增加变异概率(如从0.1调到0.15)以避免早熟收敛。最终解的成本结构通常呈现:
- 柴油机:主要在电价高峰时段满负荷运行
- 光伏:弃光率控制在5%以下
- 电网:低谷时段充电,高峰时段放电
5.2 实际工程中的调参技巧
-
天气适应性:接入实时辐照度预测,动态调整pv_max预测曲线。晴天时适当降低柴油机备用容量,阴天则提前启动柴油机预热。
-
设备老化补偿:随着柴油机使用年限增加,维护成本系数应从0.1逐步上调,反映设备效率下降。
-
需求响应:对可中断负荷设置优惠电价,在成本函数中加入负荷削减奖励项。
-
多时间尺度优化:建议采用"日前调度+实时修正"的两阶段策略,先用遗传算法做日前计划,再用模型预测控制(MPC)进行实时调整。
6. 代码优化与扩展方向
6.1 向量化编程进阶技巧
将24小时调度问题扩展为多日调度时,需要重构变量矩阵:
matlab复制% 单日调度变量排列:[H1_diesel, H1_pv, H1_grid, H2_diesel,...]
% 改为多日调度:[D1H1_diesel, D1H1_pv,..., D2H1_diesel,...]
nvars = days * 24 * 3; % 天数×24小时×3变量
相应地修改约束矩阵Aeq,确保储能SOC在日间连续变化的同时,满足每日初始SOC约束。
6.2 并行计算加速
遗传算法天然适合并行化。在MATLAB中启用并行池:
matlab复制parpool('local',4); % 使用4个本地核心
options.UseParallel = true;
实测在16核服务器上,种群评估时间可缩短为单核的1/10。但要注意通信开销,当每个个体的评估非常快时(如<0.1秒),并行反而可能降低效率。
6.3 混合整数规划扩展
如果需要考虑设备启停状态(0-1变量),可以改用混合整数遗传算法(GA):
matlab复制options = optimoptions('ga','PopulationType','bitstring');
或者结合分支定界法,先由GA提供优质初始解,再用精确算法局部求精。这种混合策略在商用调度系统中应用广泛。