1. 为什么综合能源调度必须引入多目标优化
我第一次尝试搭建综合能源系统调度模型时,用的是最传统的单目标线性规划,目标函数只设运行成本最小。跑出来的结果非常“偏科”——系统会尽量用最便宜的电,哪怕这台机组碳排放高得离谱;储能设备几乎不参与调节,因为成本模型里压根没有体现环境代价。导师看完结果只问了一句:“如果明天碳配额价格涨一倍,你的方案还算最优吗?”
这个问题点醒了我。所谓综合能源系统,本质上是电、热、气多种能源耦合运行的系统,风电、光伏、燃气轮机、电锅炉、储能、需求响应等设备在同一张网里互相制约。调度的目标从来不止一个:运行成本要低、碳排放要少、弃风弃光要小、系统可靠性要有保障。这些目标之间往往相互打架——想降成本就可能多烧煤电,想减排就得让高成本机组多出力。单目标优化只能通过加权求和把这些目标硬揉成一个数,权重怎么定全靠拍脑袋,而且当Pareto前沿非凸时,加权法连某些有效解都找不到。
这时候就需要真正的多目标优化算法。NSGA-II,全称Non-dominated Sorting Genetic Algorithm II,也就是带精英策略的非支配排序遗传算法,是目前解决这类问题最成熟的进化算法之一。它的输出不是单个最优解,而是一组Pareto最优解集——这批解相互之间不存在绝对优劣,成本最低的方案排放可能最高,排放最低的方案成本可能最高,工程师根据实际场景从中挑一个最合适的。这种“先给一揽子选择、再人工决策”的思路,和综合能源调度这种多目标冲突强烈的场景几乎是天生一对。
本文分享的就是我在Matlab环境下,从零实现NSGA-II求解综合能源日前优化调度的完整过程,包括问题建模、算法核心代码、约束处理方法和实际调参经验。无论你是刚开始接触综合能源方向的研究生,还是在工程中需要做多目标运行优化的工程师,这套代码框架都可以直接改改就用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 先把调度问题翻译成数学模型:目标函数、决策变量与约束
2.1 场景假设与决策变量定义
我这里以一个典型的园区级综合能源系统为例:系统包含风力发电、光伏发电、燃气轮机、电锅炉、蓄电池、蓄热罐,外部电网可以购电购气,内部负荷分为电负荷和热负荷。调度周期取24小时,时间分辨率为1小时。
这组决策变量要说清,后面写代码全靠它:
- 燃气轮机每小时的电出力 P_gt(t)
- 电锅炉每小时消耗的电功率 P_eb(t)
- 蓄电池每小时充放电功率 P_bat(t)(放电为正,充电为负)
- 蓄热罐每小时充放热功率 H_ts(t)(放热为正,充热为负)
- 从外部电网购买的电功率 P_grid(t)
- 从外部购买天然气折算成功率 P_gas(t)
每个变量都对应24个时段的取值,所以整个优化问题的维度是 6 × 24 = 144 维。进化算法处理这种维度没有任何压力,这也是为什么NSGA-II这类元启发式算法在能源调度领域这么流行——它对问题维度不敏感,不像动态规划那样随状态变量爆炸式增长。
2.2 两个目标函数:成本与碳排放
目标函数一,系统总运行成本最小。这里要计入购电费用、购气费用、设备运维费用,减去售电收益(如果有余电上网的话),同时把储能设备的折旧成本按充放电量折算进去:
min f₁ = Σ [ c_grid(t)·P_grid(t) + c_gas(t)·P_gas(t) + Σ c_om,i·P_i(t) ]
其中 c_grid(t) 和 c_gas(t) 是分时电价和气价,这个分时特性很重要——很多调度策略能省钱并不是设备效率高,而是把用能行为挪到了低谷时段。c_om,i 是第i台设备的单位运维成本,实际算的时候设备越多,这部分越琐碎。
目标函数二,碳排放量最小。碳排放主要来自外购电和天然气燃烧:
min f₂ = Σ [ ε_grid ·P_grid(t) + ε_gas·P_gas(t) ]
注意外购电的碳排放系数 ε_grid 要按当地电网的平均排放因子来取,不同地区差别很大。燃气的排放因子可以按甲烷燃烧的化学计量关系推算,也可以直接查标准。另外,如果有碳捕集装置,这部分模型会更复杂,需要加额外的能量惩罚项。
2.3 约束条件的工程化处理
约束条件是整个调度模型里最容易翻车的部分,写少了结果不物理,写多了算法半天收敛不了。我实际建模时保留了以下几类:
功率平衡约束是最硬性的。电力平衡要求发电加购电,减去电锅炉耗电和储能充电,等于电负荷。热力平衡要求燃气轮机余热回收、电锅炉产热、蓄热罐放热之和等于热负荷。这两个等式约束如果不满足,整个调度方案就是空中楼阁。
设备出力上下限和爬坡约束也不能省。燃气轮机不能超过额定功率,蓄电池充放电功率有限,储能SOC要保持在安全区间(比如0.1到0.9),而且SOC的时序递推关系要写对:
SOC(t+1) = SOC(t) + η_ch·P_ch(t)·Δt - P_dis(t)·Δt/η_dis
这个递推关系在代码里就是一个循环,但很多人第一次写容易把充放电效率的位置搞反。充电时效率乘在输入侧,放电时效率除在输出侧,这样能量守恒才闭合。
备用约束是综合能源系统里容易被忽略的一环。考虑到风电和光伏出力有预测误差,系统要留出一定旋转备用容量,对燃气轮机的可用容量提出额外要求。这个约束会让可行域
