做微网电源容量配置有一段时间的人,应该都遇到过这个尴尬:用确定性优化算出来的配置结果,拿到实际运行场景里一验,要么因为风光出力波动太大导致经常切负荷,要么因为把储能配得太满导致投资成本居高不下。于是大家开始把目光转向鲁棒优化,但很快又发现,经典的单阶段鲁棒虽然能扛住最恶劣场景,结果却经常保守到没法用——为了一个概率极低的极端场景,把整个微网的容量水平拉高一大截,算出来的方案在经济性上完全没有竞争力。
这时候两阶段鲁棒优化就成了一个很自然的落点。它的思路说白了就是:第一阶段先做投资决策,把电源容量定下来;等不确定的风光出力真正观测到之后,第二阶段再做运行决策,在给定容量下尽可能经济地调度微网里的各类设备。两个阶段通过“最恶劣场景”衔接起来,也就是在第二阶段里专门去考哪一种风光出力组合对你这个容量方案最不利,然后用这个“最不利场景”下的运行成本来评估方案的投资价值。这套框架既能保留鲁棒优化对不确定性的抗风险能力,又比单阶段鲁棒灵活得多,也正是这两年微网容量配置论文里最常见的方法论之一。
这篇文章我想把整个流程拆开讲清楚,从为什么要用两阶段、模型怎么建,到CCG算法(列与约束生成)怎么在MATLAB里落地,再到代码框架里哪些地方容易埋坑,全部过一遍。内容主要针对已经在做微网优化、但想从确定性模型转向两阶段鲁棒模型的同学,或者正在复现相关论文但被对偶推导、CCG迭代卡住的人。
1. 为什么微网容量配置需要“两阶段+鲁棒”而不是其他方案
1.1 确定性优化解决不了的问题
微网电源容量配置,本质上是一个“投资决策+运行模拟”的嵌套问题。你决定装多少光伏、多少风机、多少储能,这是一个长期决策,发生在项目规划阶段;而设备装完之后,每天怎么调度、怎么充放电、怎么跟大电网交互,这是短期运行决策。传统的容量配置做法,是用典型日或者典型场景代替一整年的运行情况,把运行模拟简化成一堆约束,塞进同一个优化模型里一起求解。这个方法的好处是模型简单、能直接求出容量结果,坏处是你选的“典型场景”得足够准,如果风光出力的波动特性没有被覆盖到,算出来的容量就可能在某些实际会出现的情况下不够用。
我最早做微网配置时用的就是典型日法,当时取了春夏秋冬四个典型日,结果算出来的方案在验证时连续出现了好几天净负荷预测偏差超过百分之二十的情况,储能系统频繁被充到上限,最后只能靠买电兜底。后来我去统计了一下那几天的实际天气数据,发现典型日选取时平滑掉了连续阴天和连续大风天的极端情况,而这些恰恰是对容量配置结果影响最大的场景。
1.2 单阶段鲁棒为何“保守到没法看”
有人可能会说,既然典型场景覆盖不了极端情况,那我直接用最恶劣场景来做不就行了?把过去二十年里风光出力最差的那一天翻出来,按那个场景去配置容量,总不会出问题了吧。这其实就是单阶段鲁棒优化的思路——整个微网系统在同一个最恶劣场景下完成投资和运行决策。
但这个思路有一个很大的问题:它把“投资决策”和“运行决策”捆绑在了同一个场景下。也就是说,它默认光伏出力最低的时候,储能系统也只能按这个场景来配置;可实际运行中,储能系统的充放电策略是可以随着风光出力变化实时调整的。容量配置定下来之后,运行策略本来就是灵活应对各种场景的。单阶段鲁棒完全没利用这种“事后调整”的灵活性,所以它算出的方案一定会过度保守。
我记得有人做过对比,同一个微网系统,用单阶段鲁棒算出来的总容量配置成本,比用两阶段鲁棒高出了将近百分之二十。这个差距在工程上非常致命——一个省了百分之二十成本的方案,如果在风险水平接近的情况下能被验证可行,那业主没有任何理由去选更贵的那个。
1.3 两阶段鲁棒的真正价值:先决策,后调整
两阶段鲁棒的建模思路,恰好就对准了容量配置问题的这个结构性特点。
它把决策变量分成两类:
- 第一阶段变量:微网里各类电源的投建容量。这些变量在不确定量实现之前就要确定下来,属于“现在就要拍板”的决策。
- 第二阶段变量:在给定容量下,各个时段内微网的运行状态,比如储能充放电功率、燃气轮机出力、与电网交互功率、切负荷量等。这些变量取决于风光出力实际是多少,属于“看到结果之后再调整”的决策。
而它要解决的数学问题是:在所有可能的风光出力场景中,找出让你的“投资成本+运行成本”最大的那个场景,然后把这个最坏情况下的总成本降到最低。
翻译成人话就是:你要在不知道未来天气到底如何的情况下先决定装多少设备;装完之后,无论天气怎么变化,你的微网都可以通过合理的运行调度来应对;但你要确保的是,即使在对你最不利的天气下,系统也能跑得下去,而且总成本在可接受范围内。
这个逻辑本质上和很多实际工程决策是一模一样的。你在决定要不要建一条生产线的时候,不会假设所有订单都能按计划来;你会考虑“如果订单量比预期低百分之三十,这条线能不能扛得住”,但扛的方式不是把生产线本身设计成低产能,而是通过排产、库存等方式去应对波动的订单量。两阶段鲁棒干的正是这件事:投资层面提供“基本盘”,运行层面消化“波动性”。
1.4 适用边界:不是所有微网都适合用这个算法
说了这么多两阶段鲁棒的优势,也要提醒一句,不是所有微网容量配置项目都应该上这个算法。
两阶段鲁棒的模型规模和求解复杂度,比确定性优化高了一个量级。CCG算法虽然能有效处理这类问题,但每一轮迭代都要重新求解主问题和子问题,碰到设备类型多、时间尺度细、约束条件复杂的场景,总求解时间有可能是确定性优化的几十倍甚至上百倍。如果你的项目本身对精度要求不那么高,或者可用的风光历史数据不足以支撑一个可靠的不确定集,那用机会约束或者简单的鲁棒优化可能反而更实际。
就我个人的经验来说,两阶段鲁棒最适合的应用场景是这类:微网中可再生能源渗透率较高,且孤岛运行或严格并网约束下不允许切负荷(或者切负荷代价极高),同时又要求方案能覆盖多年运行数据中的极端场景。如果条件不满足,算法复杂度带来的收益可能并不明显。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 容量配置两阶段鲁棒模型的完整数学形式
2.1 问题描述与基本假设
在建模之前,先把问题边界框清楚。
假设有一个并网型微网,包含以下候选电源设备:风力发电机组(WT)、光伏阵列(PV)、储能系统(ESS),以及作为可调度电源的燃气轮机(MT)。微网与上级电网之间存在购电/售电交互,但交互功率存在上限。规划目标是确定各候选电源的安装容量,使得在满足负荷需求的前提下,考虑最恶劣风光出力场景下的系统总成本最小。
做这个模型之前有几个基本假设要明确下来:
- 不确定量只有风光出力,负荷需求按确定性预测值处理(也可扩展为负荷不确定,但模型复杂度会显著上升);
- 典型日采用一小时为时间间隔,规划周期取一年,选取若干典型日来代表全年运行状态;
- 储能系统的功率容量和能量容量分开决策,充放电效率、自放电率等参数按厂商数据给定;
- 为了控制模型规模,燃汽轮机的运行建模采用线性化方式,即只考虑出力上下限和爬坡约束,不显式建模启停状态(如果要考虑启停,需要引入二进制变量,CCG子问题的处理方式会产生比较大的变化)。
这些假设是我在多次实验中逐步确定下来的。如果你一开始就把模型建得非常细,比如考虑储能老化成本曲线、燃气轮机启停费用、光伏降额曲线等,主问题和子问题的规模都会迅速膨胀,CCG的收敛速度可能慢到让你怀疑人生。我建议第一版先把主干模型跑通,再逐步加细节。
2.2 第一阶段:投资决策问题
第一阶段的决策变量是各设备的安装容量:
- (x_{WT}):风机安装容量(kW)
- (x_{PV}):光伏安装容量(kW)
- (x_{ESS,p}):储能额定功率(kW)
- (x_{ESS,e}):储能额定能量(kWh)
- (x_{MT}):燃气轮机安装容量(kW)
第一阶段的目标函数是投资成本的等年值:
[
\min_{x} \quad C_{inv} = \sum_{i \in \Omega} c_i^{inv} \cdot x_i
]
其中 (c_i^{inv}) 是各设备的单位容量投资成本(考虑等年值折算系数)。注意,我这里用的是“等年值”概念,也就是把一次性投资成本通过资金回收系数折算到每一年,这样能和年运行成本直接相加。
第一阶段还需要满足基本的资源约束,比如各类电源的安装容量不能超过场地或政策限制的最大值:
[
0 \le x_i \le x_i^{max}, \quad \forall i \in {WT, PV, ESS, MT}
]
到这里,数学上第一阶段的表述是比较干净的。但实际上,真正的耦合关系全部体现在第二阶段的运行约束里——你装了多大容量的光伏,决定了第二阶段每个时段光伏出力的上限;储能容量决定了每个时段储能的充放电功率边界和能量边界。这种“第一阶段定边界、第二阶段跑运行”的结构,正是两阶段规划问题的标准范式。
2.3 第二阶段:运行调度与最恶劣场景刻画
第二阶段的问题是在给定第一阶段决策变量 (x) 和不确定量实现值 (u) 的条件下,求解微网的最优运行策略。数学上写作:
[
f(x, u) = \min_{y} \quad C_{op}(y)
]
其中第二部分变量 (y) 包括:
- (P_{MT}(t)):燃气轮机各时段出力
- (P_{ESS,c}(t), P_{ESS,d}(t)):储能各时段充放电功率
- (P_{grid,b}(t), P_{grid,s}(t)):向电网购电和售电功率
- (P_{curt}(t)):切负荷功率(如果允许切负荷)
运行成本包括燃气轮机的燃料成本、向电网购电的费用(减去售电收入),以及如果发生切负荷需要支付的惩罚成本。
第二阶段的核心约束包括:
功率平衡约束(每个时段):
[
P_{WT}(t) + P_{PV}(t) + P_{MT}(t) + P_{ESS,d}(t) + P_{grid,b}(t) = P_{load}(t) + P_{ESS,c}(t) + P_{grid,s}(t) + P_{curt}(t)
]
这个约束是问题的核心,它把所有设备的出力、储能状态、电网交互和负荷需求在每一个时段内连接起来。
风电/光伏实际出力约束:
[
0 \le P_{WT}(t) \le \eta_{WT} \cdot x_{WT} \cdot u_{WT}(t)
]
[
0 \le P_{PV}(t) \le \eta_{PV} \cdot x_{PV} \cdot u_{PV}(t)
]
其中 (\eta_{WT}) 和 (\eta_{PV}) 是考虑各种损耗后的出力折算系数,(u_{WT}(t)) 和 (u_{PV}(t)) 是归一化的风光出力系数(标幺值),也就是不确定量。
储能系统约束:
[
0 \le P_{ESS,c}(t) \le x_{ESS,p}
]
[
0 \le P_{ESS,d}(t) \le x_{ESS,p}
]
[
SOC(t) = SOC(t-1) + \eta_c \cdot P_{ESS,c}(t) - \frac{P_{ESS,d}(t)}{\eta_d}
]
[
0 \le SOC(t) \le x_{ESS,e}
]
燃气轮机出力约束:
[
0 \le P_{MT}(t) \le x_{MT}
]
电网交互约束:
[
0 \le P_{grid,b}(t) \le P_{grid}^{max}
]
[
0 \le P_{grid,s}(t) \le P_{grid}^{max}
]
切负荷量约束:
[
0 \le P_{curt}(t) \le P_{load}(t)
]
可以看到,第二阶段的运行约束中处处都有第一阶段变量 (x) 的影子。这就是两阶段规划中“第一阶段确定资源上限、第二阶段在线调度”的结构特性。
2.4 整个问题的三层结构(min-max-min)
把两个阶段串起来,我们最终要解的优化问题是下面这种三层结构:
[
\min_{x \in X} \quad C_{inv}(x) + \max_{u \in U} \min_{y \in Y(x, u)} C_{op}(y)
]
这个形式在论文里经常出现,但对很多刚接触的人来说,第一眼看到会觉得比较复杂。我用最直白的方式拆一下这个三层结构分别对应什么问题:
- 外层 (min_x):在规划阶段决定装多少设备,这是投资决策层;
- 中层 (max_u):在给定容量配置之后,自然推出最恶劣的风光场景,这是对抗层(可以理解为大自然在跟你博弈);
- 内层 (min_y):在给定的容量和最恶劣场景下,最优的运行调度策略是什么,这是运行层。
前两层是投资决策与大自然之间的博弈,后两层本质上是一个“在最恶劣场景下做最优运行”的子问题。CCG算法的核心思路就是把这个三层问题拆成一个主问题和子问题,然后用迭代的方式逼近最优解。
有了这个清晰的问题结构,接下来就是关键的求解算法部分。
3. 风光不确定集建模:盒子、预算、椭球选型
3.1 为什么不确定集的形状直接影响结果
两阶段鲁棒优化里面有一个很容易被忽略的决定性因素——不确定集的构造方式。同样一套容量配置模型,用盒式不确定集和用预算不确定集,算出来的最优容量可能相差百分之十甚至更多。这个现象本质上是因为不确定集决定了“最恶劣场景”能恶劣到什么程度;不确定集的范围越大,最恶劣场景可能越极端,为了应对这个极端场景,容量配置就越保守。
在做两阶段鲁棒容量配置时,不确定集的选择不只是数学上的偏好问题,它直接反映了决策者对风险的态度。你愿意承担多大的风光出力波动,决定了你的不确定集要“胖”到什么程度。
3.2 常用的三类不确定集
目前微网容量配置文献中用得最多的不确定集有三类,我分别说一下它们的特性和适用场景。
第一类是盒式不确定集。数学形式上最简单:
