基于线性规划的电力系统机组组合问题中的风电不确定性建模与鲁棒优化求解示例
问题描述
在电力系统机组组合问题中,传统火电机组需要与日益增长的风力发电共同协作,以满足负荷需求。风能具有显著的间歇性和不确定性,传统的确定性模型无法有效处理这种波动。鲁棒优化方法能在风电机组出力不确定的情况下,找到一个调度方案,使得在最坏可能的风电场景下,系统仍能满足所有运行约束,且总成本(主要为火电机组的发电成本和启停成本)尽可能小。本示例将展示如何为这一问题构建一个基于线性规划的两阶段鲁棒优化模型,并采用列与约束生成算法进行求解。
解题过程
步骤1: 问题理解与确定性模型基础
首先,我们需要理解机组组合的核心决策。对于一个拥有N台传统火电机组和一个风电场的系统,在一个多时段(例如24小时)内,我们需要决定:
- 第一阶段决策(Here-and-Now):在观察到实际风电出力之前,必须做出的决定。主要是每台火电机组在每个时段是否开机(
u_it,二元变量)以及其启停状态。 - 第二阶段决策(Wait-and-See):在风电出力不确定性揭示后,可以做出的调整。主要是每台已开机的火电机组在每个时段的实际发电功率(
p_it,连续变量)。
在确定性模型中,我们假设风电出力 W_t 是确切已知的。目标是总成本最小化:
- 目标函数:总成本 = ∑ (开机成本_i * v_it + 停机成本_i * w_it) + ∑ (燃料成本函数_i(p_it, u_it))。
- 主要约束:
- 功率平衡:所有火电机组发电量之和 + 风电出力 = 负荷需求,对每个时段t。
- 机组技术约束:包括发电功率上下限 (
p_min_i,p_max_i)、最小启停时间、爬坡率(相邻时段功率变化限制)等。 - 风电约束:
W_t为固定值。
步骤2: 引入不确定性建模
在现实中,风电出力 W_t 是不确定的。我们采用鲁棒优化的思想:假设风电出力 w_t(注意,我们用小写 w_t 表示不确定变量)属于一个不确定集 U。我们要求最终的调度方案(第一、二阶段决策)对于 U 内所有可能的风电出力都可行,且最小化在最坏情况下的总成本(或期望成本的上界)。
一个常用且易于处理的预算不确定集(也称为“箱型+预算”不确定集)定义如下:
U = { w_t | w_t^0 - Δ_t ≤ w_t ≤ w_t^0 + Δ_t, ∀t; ∑_t |w_t - w_t^0| / (2Δ_t) ≤ Γ }
其中:
w_t^0是时段t的预测风电出力。Δ_t是时段t的最大可能预测偏差。Γ是不确定预算,是一个0到总时段数T之间的整数。Γ=0意味着所有w_t必须等于预测值(退化为确定性);Γ=T意味着所有时段的风电出力可以同时达到其最坏的边界值(即w_t = w_t^0 - Δ_t,导致电力缺口最大)。Γ允许我们控制保守程度:在最坏情况下,最多只有Γ个时段的风电出力会偏离预测值至边界。
步骤3: 构建两阶段鲁棒优化模型
基于线性规划,我们通常将燃料成本函数线性化或分段线性化。这样,原始问题可以表述为混合整数线性规划,而不确定集 U 是线性的。
两阶段鲁棒优化模型 可以抽象为:
min_x (c^T x + max_{w∈U} min_{y∈Ω(x, w)} d^T y)
s.t. A x ≤ b
x ∈ {0,1} (包含开机决策)
x: 第一阶段的二进制决策变量(机组启停u_it,启停指示v_it, w_it)。c^T x: 第一阶段的固定成本(主要与启停相关)。w: 不确定参数向量(各时段风电出力)。y: 第二阶段连续决策变量(各机组发电功率p_it等)。Ω(x, w) = {y | F y ≥ h - E w - G x}: 是给定第一阶段决策x和风电场景w后,第二阶段的可行域(包含功率平衡、机组出力上下限、爬坡等约束)。这里F, E, G, h是系数矩阵/向量。d^T y: 第二阶段的运行成本(主要为燃料成本)。
模型含义:我们选择 x(机组启停),使得在最坏的风电场景 w ∈ U 下,后续最优调度 y 所带来的总成本最小。
步骤4: 采用列与约束生成算法求解
两阶段鲁棒模型是一个min-max-min问题,直接求解困难。列与约束生成是一种迭代主-子问题分解算法。
-
初始化:
- 生成一个初始的风电场景集合
S(例如,只包含预测场景w^0)。 - 求解一个松弛的主问题。
- 生成一个初始的风电场景集合
-
主问题(Master Problem, MP):
- 它是一个近似问题,只考虑了有限个风电场景
w^k ∈ S,而不是整个不确定集U。
min_{x, η} c^T x + η s.t. A x ≤ b, η ≥ d^T y^k, ∀ k (对应每个场景 w^k ∈ S) F y^k ≥ h - E w^k - G x, ∀ k x ∈ {0,1}, y^k ≥ 0- 这里引入了一个辅助变量
η,来近似表示max_{w∈U} min_{y} d^T y这个最坏情况成本。约束η ≥ d^T y^k确保了η至少不小于已考虑场景的成本。
- 它是一个近似问题,只考虑了有限个风电场景
-
子问题(Subproblem, SP):
- 给定主问题求出的第一阶段最优解
x*,子问题用于找出当前解x*下,最坏可能的风电场景w,以及在该场景下的最优调度成本。 - 子问题本身是一个max-min问题:
Q(x*) = max_{w∈U} min_{y} { d^T y | F y ≥ h - E w - G x* }- 由于内层
min_y是一个线性规划,我们可以利用强对偶理论将其转换。令π为约束F y ≥ ...的对偶变量。 - 转换后,子问题变为一个单层最大化问题(是一个双线性规划,但由于
U结构特殊,可以进一步处理):
max_{w∈U, π ≥ 0} π^T (h - E w - G x*) s.t. F^T π ≤ d- 对于上面定义的预算不确定集
U,这个最大化问题可以通过将其写成鲁棒对等形式,或者利用对偶变换,最终转化为一个混合整数线性规划。例如,引入辅助二进制变量z_t来表示|w_t - w_t^0|是否取到最大偏差,并关联预算约束∑ z_t ≤ Γ。这样,子问题就可以被商业求解器(如Gurobi, CPLEX)直接求解。 - 求解子问题后,我们得到最坏场景
w*及其对应的最优成本Q(x*)。
- 给定主问题求出的第一阶段最优解
-
收敛性检查和迭代:
- 比较主问题目标值
c^T x* + η*与c^T x* + Q(x*)。 - 如果
η* ≥ Q(x*)(考虑一定的容差),说明当前主问题中的η已经可以覆盖最坏情况成本,算法收敛。(x*, y*)即为鲁棒最优解。 - 否则,说明我们在主问题中漏掉了一个“坏”场景
w*。我们将这个新发现的最坏场景w*加入到场景集合S中,然后回到步骤2,求解新的主问题。主问题会因此增加一组关于w*的变量y^{new}和相关约束,从而变得更“紧”,其解η会逐渐向真实的最坏情况成本逼近。
- 比较主问题目标值
步骤5: 结果解释与应用
算法结束后,我们得到:
- 鲁棒机组启停计划 (
x*):这是最关键的输出,确定了哪些机组在何时开停。这个计划能抵御任何在预算不确定集U内的风电波动。 - 一个代表性的最坏场景 (
w*):这是算法最后识别出的对当前计划“最不利”的风电出力序列,通常表现为在关键时段(如负荷高峰)风电出力严重低于预测。 - 对应的经济调度方案 (
y*):在上述最坏场景下,各机组的发电功率安排。 - 鲁棒最优总成本上界:
c^T x* + Q(x*)。这是系统在最坏情况下的成本。
运行人员可以根据此启停计划 x* 来安排机组。在实际运行中,当真实风电场景确定后,只需要根据第二阶段的线性规划模型(即子问题的内层min问题)快速计算各机组的最优发电功率即可。通过调整不确定预算 Γ,决策者可以在经济性(Γ 小,成本低但风险高)和鲁棒性/保守性(Γ 大,成本高但抗风险能力强)之间进行权衡。