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的做法是——把协调约束“松弛”掉,给每个约束定个“价格”,让各部门自己优化

具体来说:

  1. 把功率平衡约束、备用约束等耦合约束,通过拉格朗日乘子(λ)加到目标函数里
  2. 这样,原问题就分解成了单机组子问题——每台机组独立优化自己的启停和出力
  3. 然后,通过次梯度法捆绑法更新拉格朗日乘子,逐步逼近最优解

数学上,拉格朗日函数长这样:

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)问题知识体系 UC问题 数学描述 MIP建模 拉格朗日松弛 目标函数:运行成本+启停成本 约束条件:功率平衡、备用、爬坡等 决策变量:u_i,t(整数)+ P_i,t(连续) 整数部分:启停状态0-1变量 连续部分:出力大小 线性化处理:逻辑约束、分段线性 松弛耦合约束,引入拉格朗日乘子 分解为单机组子问题 次梯度法迭代更新乘子 核心目标:在满足约束下,最小化总运行成本 MIP保证最优解,LR适合大规模,动态规划适合小系统

这张图把UC问题的三个核心维度串在了一起。你从数学描述出发,理解问题本质;然后通过MIP建模,把问题变成计算机能算的形式;最后用拉格朗日松弛法,解决大规模求解的难题。

好了,这一章的内容就到这儿。UC问题是个硬骨头,但啃下来之后,你对电力系统调度的理解会上一个台阶。下一章我们接着聊——经济调度(ED)问题,那是UC问题的“兄弟”,但更侧重于出力分配。


公众号:蓝海资料掘金营,微信deep3321