4. 机组组合(UC)问题:从数学描述到求解实战
各位同学好,今天我们来聊聊电力系统调度里最核心、也最让人头疼的一个问题——机组组合(Unit Commitment,UC)。
说实话,我入行那会儿,第一次接触UC问题,感觉就像在看天书。什么启停状态、爬坡约束、最小开停机时间……一堆概念砸过来。后来在项目里摸爬滚打了好几年,才慢慢理清楚这里面的门道。
今天我就把这块硬骨头,掰开了、揉碎了,讲给你听。
4.1 UC问题到底在解决什么?
先问个问题:电网调度员每天上班第一件事是干嘛?
不是喝茶看报,而是决定——明天哪些机组要开机,哪些要停机,每台机组发多少电。
这就是UC问题的本质。说白了,就是要在满足负荷需求的前提下,找到一组机组的启停计划和出力分配,让总运行成本最低。
你想想看,一台大型火电机组,从冷态启动到并网发电,可能要花好几个小时,甚至十几个小时。如果明天早上8点负荷突然飙升,你总不能临时去启动一台机组吧?来不及的。
所以,UC问题必须提前做,通常是提前一天做计划,也就是我们常说的日前调度。
核心要点:UC问题是一个典型的混合整数规划(MIP)问题。为什么叫混合整数?因为决策变量里既有连续变量(出力大小),又有整数变量(0-1启停状态)。
4.2 UC问题的数学描述
好,我们来点硬核的。UC问题的数学模型,我习惯把它拆成三块来看:目标函数、约束条件、决策变量。
4.2.1 目标函数
目标很简单——总成本最小。总成本包括两部分:
- 运行成本:燃料费、运维费等,通常用机组的耗量特性曲线来描述,一般是个二次函数。
- 启停成本:机组启动一次要花多少钱(比如锅炉预热、汽轮机暖机),停机也有成本。
数学上写出来就是:
min Σ Σ [ C_i(P_i,t) * u_i,t + SU_i,t + SD_i,t ]
其中:
- i:机组编号
- t:时段编号(通常取24小时,每小时一个时段)
- C_i(P_i,t):机组i在时段t的发电成本,是出力P_i,t的函数
- u_i,t:0-1变量,1表示机组i在时段t处于开机状态
- SU_i,t:启动成本
- SD_i,t:停机成本
嗯,这里要注意,启动成本SU_i,t本身也是个分段函数——热启动便宜,冷启动贵。我在实际项目中,曾经因为简化了这个成本函数,导致优化结果偏差很大,后来老老实实改回了分段线性化。
4.2.2 约束条件
约束条件才是UC问题的重头戏。我列几个最关键的:
| 约束类型 | 数学表达 | 说明 |
|---|---|---|
| 功率平衡 | Σ P_i,t = D_t | 所有机组出力之和 = 负荷需求 |
| 备用容量 | Σ P_i,max * u_i,t ≥ D_t + R_t | 开机机组最大出力之和 ≥ 负荷 + 备用 |
| 出力上下限 | P_i,min ≤ P_i,t ≤ P_i,max | 每台机组有最小稳定出力和最大出力 |
| 最小开停机时间 | u_i,t - u_i,t-1 相关约束 | 机组不能频繁启停,有最短运行/停机时间 |
| 爬坡约束 | |P_i,t - P_i,t-1| ≤ Ramp_i | 机组出力变化速率有限制 |
这里面,最小开停机时间约束是最容易出问题的。我曾经在一个省级电网的项目里,因为忽略了水电机组的开停机时间约束,结果优化出来的方案根本没法执行——水电机组频繁启停,水头都来不及调整。
4.3 混合整数规划(MIP)建模
刚才说的这些约束,怎么变成计算机能求解的模型?这就涉及到MIP建模了。
我个人的习惯是,先把问题拆成线性部分和整数部分:
- 整数部分:机组的启停状态 u_i,t,0或1
- 连续部分:机组的出力 P_i,t,在上下限之间连续变化
然后,把非线性约束做线性化处理。比如:
- 启动成本SU_i,t = C_start * (u_i,t - u_i,t-1),当u_i,t从0变1时触发
- 最小开停机时间约束,可以用一组线性不等式来表达
举个例子,最小开机时间约束可以写成:
u_i,t - u_i,t-1 ≤ u_i,τ (τ = t+1, t+2, ..., t+T_on-1)
意思是:如果机组在t时刻开机了(u_i,t=1, u_i,t-1=0),那么接下来T_on个时段都必须保持开机状态。
这种约束在数学上叫逻辑约束,MIP求解器(比如CPLEX、Gurobi)能直接处理。
实战小技巧:MIP模型的规模会随着机组数量和时段数急剧膨胀。24台机组、24个时段,就有24×24=576个整数变量。如果考虑更多约束,变量数轻松上万。所以,建模时一定要精简约束,能用线性约束就别用非线性,能合并就别拆分。
4.4 拉格朗日松弛法求解思路
说到求解,就不得不提拉格朗日松弛法(Lagrangian Relaxation, LR)。这个方法在90年代到2000年初非常流行,现在虽然MIP求解器越来越强,但LR的思想依然值得学习。
LR的核心思路是什么?我打个比方:
UC问题就像一个大公司,各部门(机组)之间有很多协调约束(比如功率平衡)。LR的做法是——把协调约束“松弛”掉,给每个约束定个“价格”,让各部门自己优化。
具体来说:
- 把功率平衡约束、备用约束等耦合约束,通过拉格朗日乘子(λ)加到目标函数里
- 这样,原问题就分解成了单机组子问题——每台机组独立优化自己的启停和出力
- 然后,通过次梯度法或捆绑法更新拉格朗日乘子,逐步逼近最优解
数学上,拉格朗日函数长这样:
L(u,P,λ) = 原目标函数 + Σ λ_t * (D_t - Σ P_i,t)
然后对偶问题:max_{λ} min_{u,P} L(u,P,λ)
说白了,就是先对偶,再分解,再迭代。
注意:拉格朗日松弛法有个天然缺陷——它给出的解可能不可行。因为松弛了约束,所以求出来的解可能不满足功率平衡。这时候需要做可行化修复,比如用启发式方法调整机组出力。
我记得有一次做项目,用LR求解一个200台机组的UC问题,迭代了500多次才收敛。当时心里那个急啊,但没办法,这就是LR的代价——计算快,但收敛慢。
4.5 三种求解方法的对比
为了让你有个直观感受,我整理了个对比表:
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| MIP(分支定界) | 解的质量高,能保证最优 | 大规模问题求解慢 | 中小规模系统(≤100台机组) |
| 拉格朗日松弛 | 计算速度快,适合大规模 | 解可能不可行,需修复 | 大规模系统(≥100台机组) |
| 动态规划 | 理论成熟,适合小系统 | 维数灾难,无法处理大规模 | 单机或小系统(≤10台机组) |
现在工业界的主流做法是MIP + 启发式。先用MIP求解器算一个初始解,再用启发式方法微调,兼顾速度和精度。
4.6 本章知识体系总览
最后,我用一张图把本章的核心逻辑串起来:
这张图把UC问题的三个核心维度串在了一起。你从数学描述出发,理解问题本质;然后通过MIP建模,把问题变成计算机能算的形式;最后用拉格朗日松弛法,解决大规模求解的难题。
好了,这一章的内容就到这儿。UC问题是个硬骨头,但啃下来之后,你对电力系统调度的理解会上一个台阶。下一章我们接着聊——经济调度(ED)问题,那是UC问题的“兄弟”,但更侧重于出力分配。
公众号:蓝海资料掘金营,微信deep3321