1. 为什么氢能耦合系统必须用多目标优化:单目标根本算不清这笔账
先来个灵魂拷问:同样是做24小时优化调度,普通电热联供系统用单目标线性规划、混合整数规划就能搞定,为什么一引入氢能,整个问题的性质就变了?
我在实际搭建这套氢能-电能-交通多能耦合系统时,最深的一个体会是:氢能设备在系统里承担的不止一个角色,而是三个。电解槽既是可调负荷,又是燃料制备源;氢燃料电池既是电源,又是氢负荷;储氢罐是整个系统的"缓冲池",但它有容量上限和压力约束;掺氢燃气轮机一边吃氢一边发电,而掺氢比例又有硬性的燃烧稳定性红线。这种多重身份带来的直接后果就是:系统中存在大量不可公度的目标冲突。
如果用单目标来做,你必须把所有的成本、碳排放、弃风弃光全部折算成一个货币化的数字。问题在于,碳排放的社会成本、弃新能源的惩罚系数,这些折算系数谁说了算?折算系数一变,最优调度方案就面目全非。我见过不少论文在单目标框架里硬塞权重,实际上是把决策者的主观偏好强行塞进系数里,算法算出来的所谓"最优解"根本没有说服力。
打个比方,单目标优化就像让你用一把尺子同时量长度和重量,量出来的一定是个四不像。而氢能系统的核心矛盾刚好是两类典型的相互冲突目标:
- 经济性 vs 低碳性:多用电制氢能消纳可再生电力、降低碳排放,但电解槽设备投资和运行维护成本高,电价高时段制氢经济上不划算。
- 消纳能力 vs 系统安全:为了多消纳风光、减少弃电,希望电解槽功率跟随时变电源波动快速调节,但频繁调节会降低电解槽寿命和效率,储氢罐容量有限,氢产出多了没地方去。
这些问题天然是多目标优化问题。而在多目标算法里,NSGA-II是学术界和工程界验证最充分、落地最稳的算法之一。它不需要你事先指定权重,而是直接产出一组帕累托前沿解,把"成本、碳排放、弃电率"之间的权衡关系完整呈现出来,让调度人员根据当天电网情况、电价信号、政策导向去选一个折中方案。这才是实际工程里的真实决策逻辑。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 设备建模是调度优化的地基:每个设备都是一条不能逾越的硬约束
很多新手拿到这类题目,第一件事就是急着写NSGA-II代码,结果模型里的设备约束一塌糊涂,算法跑出来的帕累托前沿形状怪异甚至不收敛。根本原因就是忽略了设备级建模的物理意义。NSGA-II只是求解器,它不会替你判断模型是否合理。模型错了,算法再高级也是垃圾进垃圾出。
2.1 风电与光伏的出力边界:不确定性下的时序曲线
风力和光伏出力在24小时调度中通常看作不可控的输入参数。工程上常用两种方式获取这些数据:一是基于历史实测数据的典型场景序列,二是用威布尔分布、贝塔分布拟合后做蒙特卡洛采样。实际建模仿真中,为了验证算法性能,经常用如下形式构造典型日出力曲线:
matlab复制% 风电出力标幺值典型曲线(夜间大、白天小)
Wind_pu = 0.3 + 0.6 * exp(-((t - 4) / 3).^2) + 0.2 * exp(-((t - 18) / 5).^2);
% 光伏出力标幺值典型曲线(中午大、早晚小)
PV_pu = max(0, sin((t - 6) * pi / 12) .^ 1.2);
需要注意的是,风光出力是硬性边界条件,调度算法只能在这个边界内决策,不能改变风光的物理出力。你唯一能做的是决定"消纳多少、弃掉多少"。弃风弃光也是对决策开放的变量,而不是一个固定值,这一点在目标函数设计时很关键。
2.2 电解制氢系统模型:效率不是常数,是功率的函数
电解槽建模是我踩坑最多的地方之一。很多简化模型把电解槽效率设成常数,比如直接取70%,这在设备处于额定工况附近时误差不大。但调度优化恰恰会让电解槽频繁工作在部分负荷区间,这时候碱性电解槽效率会显著偏离额定值。更贴近实际的模型是效率随负载率非线性变化:
matlab复制% 电解槽负载率
ratio = P_EL / P_EL_rated;
% 效率随负载率的拟合曲线(典型PEM电解槽)
eta_EL = eta_rated * (0.4 + 0.8 * ratio - 0.2 * ratio.^2);
% 产氢量(kg/h)
m_H2 = eta_EL * P_EL / LHV_H2;
其中,LHV_H2是氢的低位热值,约33.3 kWh/kg。如果你用高位热值(39.4 kWh/kg)算,产氢量会偏低约15%,而行业报告和标准里用的基本是低位热值,统一标准非常重要。
电解槽还有一个容易被忽略的约束:爬坡约束。电解槽的功率调整速率受制于电解槽的热惯性,通常每分钟只能调整额定功率的几个百分点。在15分钟或1小时调度步长下,爬坡约束等效为相邻时段功率差值的上限。我见过不少论文把这个约束漏掉,结果算法给出的调度曲线在相邻时段剧烈跳变,物理上根本不可能执行。
2.3 储氢罐与掺氢燃气轮机:压力边界和掺氢比的工程红线
储氢罐的建模类似电池SOC,用氢气质量或等效能量状态来递推:
matlab复制S_H2(t+1) = S_H2(t) + eta_ch * m_H2_in(t) - m_H2_out(t) / eta_dis;
约束条件包括储氢容量上下限、单位时间充放氢速率上限。这里的效率系数 eta_ch 和 eta_dis 对应压缩机和释放过程的热力学损耗,一般取0.95左右,但要注意压缩过程的能耗在系统层面应该被计入电负荷,不能两头都算。
掺氢燃气轮机的建模要更小心。燃气轮机对掺氢比例有严格的限制,目前主流重型燃机在低氮燃烧模式下掺氢比例通常不能超过10%~20%,超过这个值会导致燃烧不稳定、回火、NOx排放升高。因此调度模型里必须加一条约束:
code复制gamma_H2(t) = m_H2_GT(t) / (m_natgas(t) + m_H2_GT(t)) <= gamma_max
燃料热值也要按掺氢比例折算。氢气体积热值(LHV约10.8 MJ/Nm³)远低于天然气(LHV约35.8 MJ/Nm³),所以掺氢后相同体积流量下燃料热值会下降,为了维持出力,总燃料量需要增加。我的做法是先计算等效热值,再反推所需的天然气和氢气质量流量:
matlab复制LHV_mix = (1 - gamma_H2) * LHV_natgas + gamma_H2 * LHV_H2_mass;
m_fuel_total = P_GT / (eta_GT * LHV_mix);
m_natgas = (1 - gamma_H2) * m_fuel_total;
m_H2_GT = gamma_H2 * m_fuel_total;
2.4 氢燃料电池和氢电动汽车:交通负荷的时间分布特征
燃料电池的建模相对简单,核心是电效率-负载率曲线和爬坡约束。它的响应速度快,但高温燃料电池(SOFC)也有热惯性,不能像蓄电池一样瞬间满功率;低温PEM燃料电池响应更快,但高温余热利用潜力更大。在电-氢耦合系统里燃料电池主要承担高峰时段顶峰作用。
氢电动汽车的建模,我之前一直以为是纯负荷侧的事情,做进去之后才发现它对整个调度的影响远超预期。加氢负荷呈现明显的早晚双峰特征:早高峰集中在7:00-9:00,晚高峰集中在17:00-19:00。如果加氢站没有足够的储氢缓冲,那么这些时段的氢气需求就直接对电解槽和储氢罐形成"刚需"。氢燃料电池车的百公里耗氢量大约0.8~1.2 kg,跑网约车的日行驶里程300公里,单日加氢需求就是3 kg左右,一台加氢站日均服务300辆车对应接近1吨的日加氢量,这个量级对一个50 MW电解槽来说约需要全功率运行2小时才能供上。
3. NSGA-II求解调度问题:决策变量编码和约束处理才是真正的技术含量
NSGA-II本身是个通用框架,网上开源代码一大堆。但把NSGA-II迁移到氢能调度问题上,真正的难点不是算法本身,而是如何把物理调度问题映射成算法能处理的染色体、目标函数和约束体系。这一步做不好,进化算法会在解空间里乱飞。
3.1 决策变量的选取策略:能少则少,但要保留独立性
我的编码方案是实数编码,染色体长度等于所有独立决策变量在24个时段的总和。典型设计如下:
- 电解槽各时段功率
P_EL(1:24),范围[0, P_EL_max] - 燃料电池各时段出力
P_FC(1:24),范围[0, P_FC_max] - 掺氢燃气轮机各时段出力
P_GT(1:24),范围[P_GT_min, P_GT_max] - 储氢罐各时段充放氢状态变量,或等效为购氢/放氢量
电网交互功率不直接编码为决策变量,而是由功率平衡方程在约束处理阶段反解出来。这样做的原因是电功率平衡是必须严格满足的等式约束,把其中一个变量留作"平衡节点",能极大简化约束处理的复杂度。这也是电力系统调度里经典的"平衡节点"思路。
3.2 目标函数设计:三个维度衡量系统优劣
在这个氢能耦合系统里,我设计了三目标优化,分别对应经济性、环保性和可再生消纳性能:
第一个目标是总运行成本最小,包括外购电成本、天然气燃料成本、弃风弃光惩罚成本、设备运维成本,再减去可能的售电收益。单位用元。
第二个目标是碳排放量最小,包括外购电对应的间接碳排放(按电网平均排放因子折算)和燃气轮机燃烧天然气的直接碳排放。掺氢燃烧的部分按氢气零碳处理,这正是掺氢燃机在低碳调度中的价值所在。
第三个目标是弃风弃光率最小,用弃电量占风光总发电量的比例来定义。
这里容易忽视的一个问题是目标函数的量纲差异。成本是万元量级,碳排放是吨量级,弃电率是0~1之间的小数。如果不做标准化,NSGA-II的拥挤度距离会被量级大的目标主导,算法基本退化成单目标搜索。我的做法是对三个目标做归一化处理:用单目标极值(分别单独优化每个目标得到的理想点)作为参考,把所有目标值归一到0~1范围,再做非支配排序和拥挤度计算。
3.3 约束处理:可行性优先比惩罚函数更稳
NSGA-II的约束处理我强烈建议采用可行性优先准则(Deb提出的约束支配原则),而不是简单叠加罚函数。具体规则很简单:两个解比较时,可行解永远优于不可行解;两个都是可行解时,按帕累托支配关系比较;两个都不可行时,约束违反程度小的优先。
对功率平衡这类等式约束,单纯靠进化搜索去满足效率太低。我在实际编码中采用修复策略:先由决策变量决定电解槽、燃料电池、燃机的出力,然后判定电功率缺额或盈余,缺额部分由电网购入填补,盈余部分视为向电网售电或弃电。这样等式约束变成不等式约束(电网交互功率在允许范围内),算法收敛速度大幅提升。
matlab复制% 电功率平衡修复伪代码
P_grid(t) = P_load(t) + P_EL(t) - P_FC(t) - P_GT(t) - P_wind(t) - P_PV(t);
% P_grid > 0 表示购电,P_grid < 0 表示售电
% 检查是否超过联络线功率上下限
if P_grid(t) > P_grid_max
% 优先降电解槽功率,还不够就弃风弃光
elseif P_grid(t) < -P_grid_max
% 优先降燃料电池,其次降燃机,再不够就弃电或切负荷
end
修复的顺序设计也有讲究。我的经验是:优先调整时间尺度上灵活性最高的设备,即响应速度最快、调节成本最低的设备。氢燃料电池响应速度最快,电解槽次之,燃机再次之。但反过来,从经济性角度又希望低谷时段电解槽多制氢、高峰时段燃机多发电。这种修复策略的设计本质上就是在替代部分约束处理工作,要和目标函数方向一致,别修复完了反而把一组原本不错的解改坏了。
4. Matlab工程实现细节:从主循环到算子参数的实战直觉
很多数学基础不错的同学卡在Matlab工程实现上,主要原因是面向过程的思维和面向对象的进化算法实现之间的鸿沟。NSGA-II虽然逻辑不复杂,但代码组织混乱会让人改一个参数都要翻半天。我的工程习惯是用结构体数组组织种群,把每个个体封装成一个个字段。
4.1 种群与染色体的数据结构设计
matlab复制% 单个个体的结构体
individual = struct();
individual.position = []; % 决策变量向量,维度 = 决策变量数 * 24
individual.cost = []; % 目标函数值向量,维度 = 3
individual.violation = 0; % 约束违反程度
individual.rank = []; % 非支配排序等级
individual.crowding = 0; % 拥挤度距离
种群就是 population = repmat(individual, PopSize, 1)。进化循环包括:锦标赛选择、模拟二进制交叉(SBX)、多项式变异、父子合并、快速非支配排序、拥挤度计算、环境选择。这些算子是NSGA-II算法的标配,Matlab实现时有几个性能优化的点值得注意。
4.2 快速非支配排序和拥挤度计算的向量化加速
如果完全用for循环实现非支配排序,200个个体、3个目标、500代进化,跑一次大概要十几分钟,调参过程非常痛苦。一个简单有效的加速方法是向量化比较:一次性计算所有个体之间的支配关系矩阵。
matlab复制function dominates = checkDominance(cost1, cost2)
% 返回 true 如果 cost1 支配 cost2
dominates = all(cost1 <= cost2) && any(cost1 < cost2);
end
这个函数是排序的核心,但在大循环里反复调用还是会慢。更好的方式是把所有目标值组成矩阵,用矩阵操作完成第一个前沿面的筛选。另外一个常用的技巧是分层非支配排序(层次化的前沿面划分),先找出第一前沿面并剔除,再在剩余个体里找第二前沿面。
拥挤度距离的计算要分目标进行:对每个目标排序,边界个体拥挤度设为无穷大,中间个体的拥挤度用前后个体目标差归一化后累加。这里有个细节——如果前面做了目标归一化,拥挤度数值就在统一量纲下累加,否则误差很大。
4.3 SBX交叉和多项式变异:算例参数怎么取合适
模拟二进制交叉(SBX)的分布指数 etac 我习惯取20,这是主流的默认值。SBX交叉的特点是子代会分布在两个父代附近,分布指数越大,子代越接近父代。调度问题的最优解通常是一个平滑的功率曲线区域,SBX比较匹配这类连续优化问题。
多项式变异的分布指数 etam 取20,变异概率用 Pm = 1 / num_variables,这个取值原则是保证每个个体平均有一个变量发生变异。变异步长由分布指数控制,分布指数越大,变异幅度越小,局部搜索能力越强。实际操作中我发现 etam=20 在前期收敛快,但后期多样性不足。如果帕累托前沿分布不均匀,可以把 etam 降到10~15,增大变异的探索幅度。
还有一个影响进化效果的细节是边界约束处理。SBX和多项式变异产生的子代可能超出变量上下界,对于调度问题,处理越界最简单有效的方法是把越界值随机重新初始化在边界附近,而不是简单截断。截断会导致大量个体堆积在变量边界上,直接损害种群的多样性,尤其是电解槽功率的下边界0附近。我改用了"反弹"策略:越界值按引入随机扰动的方式重新映射回可行域内。
4.4 收敛判据和停止条件:不是迭代越多越好
进化算法的停止条件我一般不用固定代数,而是监控帕累托前沿的超体积指标(Hypervolume)。每50代计算一次超体积,如果连续5次没有明显提升,就提前终止。超体积指标比只看IGD、GD这类需要真实前沿的评价指标更适合工程场景,因为它不需要知道真实帕累托前沿,直接用参考点就能算。
matlab复制% 超体积简化计算(两目标示例,三目标用蒙特卡洛采样估测)
function hv = calcHypervolume(costs, ref_point)
% costs 为 N x M 矩阵,每列为目标值
% 用排除法估算被前沿面支配的超体积比例
end
如果嫌超体积实现麻烦,工程上最省事的办法还是固定代数跑500代,然后用收敛曲线图判断是否稳定。在实际算例里,一般300~400代帕累托前沿已经基本稳定,500代是留足余量。
5. 典型日24小时调度结果解读:帕累托前沿背后的系统协同逻辑
模型搭好、算法调通之后,最有成就感的部分就是解读调度结果。这里我给出两个典型日算例的仿真结果分析思路,参数经过适当简化,主要展示如何从结果反推系统的协同逻辑。
5.1 算例场景与参数设定
仿真算例设定为某综合能源园区,包含200 MW风电、150 MW光伏、50 MW电解槽、30 MW氢燃料电池、60 MW掺氢燃气轮机(最大掺氢比20%)、5000 kg储氢罐,以及一组氢燃料公交加氢需求(日加氢量约1000 kg,早晚双峰分布)。电负荷峰值为220 MW,联络线功率上限±80 MW。
目标函数为:总运行成本最小、碳排放最小、弃风弃光率最小。
与电网交互采用分时电价,峰段1.2元/kWh、平段0.8元/kWh、谷段0.4元/kWh。天然气价格2.5元/Nm³。碳排放因子按电网平均0.85 kg CO2/kWh计。
5.2 夏季典型日:光伏驱动制氢的"中午聚氢"策略
夏季典型日光伏大发,午间11:00-15:00光伏出力超过150 MW,电负荷约180 MW,电力盈余明显。从帕累托前沿中选取一个折中解可以看到以下调度规律:
午间光伏大发时段(11:00-15:00),电解槽满功率运行,把富余电力转化为氢气,储氢罐SOC从早间的20%迅速爬升。此时天然气价格相对氢气制备成本更高,掺氢燃机在午间处于低出力状态,相当于把氢气"存起来"。
晚间高峰时段(18:00-22:00),光伏出力归零,电负荷攀升至210 MW,此时燃料电池启动顶峰,出力30 MW持续约4小时;掺氢燃气轮机在避峰运行,掺氢比保持在10%~15%之间,按晚间加氢需求调低掺氢比以保证储氢罐有足够余量向加氢站供氢。
夏季帕累托前沿呈现明显的"三段式"结构:低成本-高弃电方案、中成本-低弃电方案、高成本-极低弃电方案。决策者如果当天风光预测准确性高,可以大胆选择中成本方案;如果天气不稳定,建议保守选择略偏成本优化的方案,因为极端弃电惩罚在目标里属于确定性参数,不会真的让你损失真金白银。
5.3 冬季典型日:夜间风电与交通负荷的耦合博弈
冬季场景的复杂程度远高于夏季。风电夜间大发,凌晨2:00-5:00风电出力接近满发180 MW,而用电负荷只有120 MW,是典型的"反调峰"场景。此时电解槽受储能容量约束,无法完全消纳风电。查看折中解可以发现,风电消纳率约86%,弃风集中在凌晨3:00-5:00这个时段。
有趣的是冬季场景下氢气需求的早高峰(7:00-9:00公交加氢)和电网早高峰(8:00-11:00)高度重合。这个时段电解槽因为电价贵而降低出力,燃料电池和燃机顶峰,储氢罐在早高峰前需要预留足够的氢气。这意味着前一夜制取的氢要同时满足三个需求:加氢站早高峰、燃料电池顶峰发电、燃机掺氢低碳运行。储氢罐容量在这个场景下成为最稀缺的资源,帕累托前沿明显比夏季更陡峭——如果只优化成本,储氢罐会在凌晨全满,导致早高峰氢分配不出;如果只优化碳排放,燃机掺氢比被拉到极限,加氢站又面临断供风险。
5.4 帕累托前沿选解:工程实践的决策建议
三目标问题的帕累托前沿是一个曲面,不方便直接可视化。我的习惯做法是固定其中一个目标维度(比如碳排放不超过某个上限),投影到成本和弃电率两维平面观察权衡关系。另外可以用TOPSIS(逼近理想解排序法)从帕累托前沿中自动选出一个折中最优解,它在工程汇报中非常实用——你可以说"在满足低碳目标的前提下,成本相比极端方案只增加了8%,但弃电率降低了3个百分点",这种量化的选解逻辑比拍脑袋选方案有说服力得多。
6. 实际跑通这套系统踩过的坑:初始化、数值病态和结果可复现性
这个部分是我最想分享的。网上的NSGA-II代码模板很多,但真正把模型和算法结合起来跑通、跑稳,需要处理的工程细节远超预期。以下几个坑我花了大量时间才彻底解决。
6.1 初始化种群的多样性陷阱:随机生成不等于均匀分布
第一版代码里我直接用 rand 在变量上下界内均匀采样生成初始种群,跑了200个个体,结果发现前20代帕累托前沿几乎压成一个点。调试了很久才意识到问题:调度问题有24个时段,变量维度很高,完全随机采样在超立方体里看似均匀,但投影到可行解空间后,绝大部分个体都集中在可行域边界附近。这导致初始种群多样性严重不足,进化过程中缺少"种子"引导算法探索不同区域。
我的解决办法是用拉丁超立方采样替代随机采样,在Matlab里可以用 lhsdesign 实现。改动很小但效果显著,初始种群的覆盖度大幅提升,前50代的收敛速度明显加快。另外,我会在初始种群中主动混入几个"确定性启发式解",比如:全天电解槽恒功率出力、燃料电池仅在晚高峰满发、燃气轮机按照电负荷比例跟随等,这些在物理上可行的固定策略解,能够在进化初期就为算法提供高质量的"锚点"。
6.2 多目标函数归一化:量纲差异导致前沿形状崩溃
这个问题我在前面提过,但必须再强调一次,因为它太隐蔽了。第一版代码里,运行成本大约在几十万元量级,碳排放几百吨量级,弃电率只有0.05左右。三个目标一起做拥挤度计算,弃电率目标的贡献微乎其微,算法实际上变成了双目标优化,弃电率这个维度完全失灵。我用了理想点归一化之后,三目标之间的权衡关系才清晰浮现。
具体做法是:先对每个目标单独做极值优化(比如只优化成本得到一个最小成本值,只优化碳排放得到一个最小碳排放值),用这些极值作为归一化参考点。这样一方面保证三个目标在量纲上对齐,另一方面也让决策者明确知道每个目标的"理论上限"。代价是增加了两次单目标预优化计算,但换来的是帕累托前沿的质量提升,完全值得。
6.3 掺氢比约束如果处理不好:燃机模型会给出荒谬结果
我的模型中燃气轮机的掺氢比约束是用 min 函数限幅处理的:如果计算出的掺氢比超过上限,就强制设到上限,然后反推减少氢气质量流量。这样做的问题在于,限幅之后燃料总输入热值其实改变了,对应燃气轮机的出力也应该改变,但我在第一版里简单地把燃气轮机出力当作决策变量固定了,导致功率平衡被破坏。
后来我改成先计算等效热值再反推燃料总流量,把燃气轮机的出力-燃料-掺氢比三者统一建模为一个整体。每一步先根据掺氢比约束判断是否触达上限,如果触达上限则燃机出力要重新校核,不能简单当独立决策变量用。这也提醒我:设备模型之间的耦合关系不是约束条件的罗列,而是要放进同一个数学表达式里统筹计算。
6.4 结果可复现性:设置随机种子是学术诚信问题
最后分享一个容易被忽视的细节:NSGA-II是随机算法,同一套参数每次运行得到的帕累托前沿都会有差异,差异大小和种群规模、代数有关。我的做法是在代码开头固定随机种子:
matlab复制rng(2024, 'twister');
这样做的目的不只是为了论文里那张图能复现,更是为了调参时能公平对比不同参数下的结果——如果你改了变异概率,换了随机种子,你无法判断效果差异来自参数还是纯粹运气。固定种子之后,所有对比实验才有统计学意义。多目标优化算法对比论文里说的"独立运行30次取平均值",也是基于这个逻辑。
我在实际调参过程中还有一个参考方法:不仅固定随机种子,还会同时跑5个不同种子,每个种子下统计帕累托前沿的超体积指标,观察参数改变带来的差异性是否超过种子间的随机浮动。只有参数带来的差异显著大于随机浮动,这个参数调整才算真正有效。
7. 这套系统后续还能往哪个方向扩展
最后聊一下扩展方向,因为氢能多能调度这个方向的热度还在持续上升,很多搞传统电力调度的同行都在往这边靠。
第一是多时间尺度滚动调度。目前是24小时日前调度,可以扩展为"日前+日内滚动+实时修正"三层结构。考虑到风光预测误差,日内每15分钟滚动更新一次调度计划,用NSGA-II在日内层面重新优化,实时层用模型预测控制修正执行偏差。这对算法速度提出了更高要求,NSGA-II跑500代在两分钟内完成,滚动调度的实时性勉强能接受。
第二是将碳捕集装置纳入系统。掺氢燃机虽然降低了碳排放,但无法做到零碳。如果加上碳捕集装置,系统的低碳约束会更硬核,变成"碳捕集能耗-碳排放-经济性"三方博弈,目标函数会更加复杂。氢能在这里还可以作为碳捕集装置的燃料,形成"电-氢-碳-热"四能耦合,扩展性很强。
第三是改进NSGA-II的算子策略。比如引入自适应参数控制,让交叉分布指数和变异分布指数随进化代数动态调整;或者引入多种群协同进化,不同子种群侧重于不同目标方向的搜索,最后合并帕累托前沿。这些方法在标准测试函数上验证效果不错,但在氢能调度这种高维强约束问题上,到底有没有实际增益,我还在对比测试中。从目前的结果看,自适应变异分布指数对帕累托前沿的均匀性改善是显著的,但代价是计算时间增加了约20%。
做这套系统最大的体会是:好的调度算法不是在论文里自圆其说,而是要敢把结果拿出来跟人工调度经验对比。我第一次跑出结果时,帕累托前沿的某些解的调度曲线在凌晨出现了电解槽和燃料电池同时出力的奇怪现象——一个在用电制氢,一个在放氢发电,等于白白损耗了能量转换效率。这种"算法病态解"如果不结合物理直觉去审视,是发现不了的。多目标优化只是给出数学上最优的备选集合,最终拍板的还是人。
氢能系统的调度优化,说到底是一个把物理设备的工程限制、经济系统的价格信号、环境约束的低碳要求,全部翻译成数学语言,再用算法找出可行解集合的过程。设备模型越贴近物理实际,约束处理越细致,算法跑出来的结果就越有工程参考价值。这套方法论的迁移性也很强,无论是做园区级综合能源、区域电网调峰,还是未来更大规模的氢能走廊规划,底层逻辑都是相通的。
