☰
两阶段鲁棒优化在微电网经济调度中的建模与CCG求解实战
2026/10/8 3:12:39 网站建设 项目流程

微电网经济调度这几年几乎成了电力系统优化方向的热门选题,但只要真正动手做过一次就知道,难点从来不在“求解一个线性规划”,而在怎么处理光伏、风电和负荷那些说不准的波动。两阶段鲁棒优化就是冲着这个痛点来的:第一阶段先把机组的启停、储能的充放电计划定下来,第二阶段再根据最恶劣的风光出力场景做经济再调度,保证系统在最坏情况下也不越限、不失负荷。这篇文章我想把自己从建模、推导对偶到写C&CG迭代求解、调参数踩坑的完整过程复盘一遍,给正在做微电网调度或是准备入坑鲁棒优化的朋友一个可以直接抄作业的参考。

先说清楚这篇内容的适用范围。如果你只是用确定性优化跑微电网经济调度,或者对随机规划感兴趣但被概率分布建模劝退了,那两阶段鲁棒优化可能是更接地气的选择。它不需要精确的风光预测分布,只需要给定一个不确定区间,就能得到一个兼顾安全性和经济性的调度方案。这篇文章主要面向有一定数学规划基础、会使用MATLAB或Python优化工具箱的读者,核心内容包括鲁棒优化的建模思路、不确定集的构造逻辑、列与约束生成(C&CG)算法的实现细节,以及我在实际算例中调参和排查问题的经验总结。

1. 为什么微电网经济调度需要鲁棒优化

1.1 确定性调度在不确定性面前的失效场景

传统的微电网经济调度模型把光伏出力和负荷预测值当作已知参数,建立目标函数和约束之后直接求解。这个方法在预测误差很小的时候没有问题,可一旦天气突变、云层遮挡或者负荷陡增,确定性模型给出的调度方案就可能直接失效。

举一个我在测试中常遇见的场景:确定性调度模型在预测光照充足的前提下,安排储能白天放电、柴油机组保持较低出力。结果实际运行时光伏出力因为云层遮挡下降了百分之三十,储能又因为前期的放电安排导致SOC偏低,此时柴油机组需要快速爬坡来填补功率缺口,但爬坡约束限制了一个调度周期内的最大出力变化量——于是系统面临功率失衡甚至切负荷的风险。

这说明确定性优化本质上是在处理“预测已经准确”的伪命题。它的目标函数里只有经济性,没有对预测误差的鲁棒性约束,所以优化结果对参数的变动非常敏感。而实际微电网运行中,光伏、风电、负荷这三者没有一个是精确可测的。

1.2 随机规划与鲁棒优化的选型逻辑

面对不确定性,最常见的两个备选方案是随机规划和鲁棒优化。随机规划的做法是先假设光伏出力和负荷服从某种概率分布,然后通过场景抽样构造期望值目标函数。这个方法理论完备,但对分布假设的依赖性很强:分布设得不对,优化结果就不靠谱。而且在多阶段决策问题中,场景树的规模会随着不确定维度和阶段数指数增长,计算负担很重。

鲁棒优化换了一个思路:不去精确描述不确定性,而是用一个不确定集把可能的取值全部“圈”起来,寻找在最坏情况下的最优决策。它不需要概率分布,只需要知道波动的区间范围,计算复杂度相对可控。更重要的是,鲁棒优化给出的解在不确定集内任何一个场景下都是可行的——这是随机规划很难保证的性质。

我个人的选型建议是:如果你手头有大量高质量的历史数据并且能验证分布假设,随机规划是很好的选择;如果数据不充分、预测手段有限,或者系统安全约束严格,那两阶段鲁棒优化更适合作为核心方法。实际上很多工程项目采取了两者结合的策略,先用鲁棒优化给出一个基础可行的调度方案,再在运行阶段用滚动预测进行修正,这个思路在微电网能量管理系统中很实用。

2. 两阶段鲁棒优化建模的核心思路

2.1 两阶段结构到底在模拟什么

两阶段鲁棒优化本质上模拟的是微电网调度中“先决策、后观察、再调整”这样一层衔接关系。第一阶段在不确定性实现之前做决策,对应实际调度中的日前计划:确定柴油机组的启停状态、储能的充放电计划等这一类需要提前安排的决策变量,这类变量一旦确定就很难在日内频繁改变。第二阶段则是在不确定参数实现之后,系统允许对这些计划进行经济调整,对应日内实时调度中的出力调整。

从数学模型上看,两阶段鲁棒优化是一个min-max-min结构:外层min是第一阶段决策变量的成本最小化,中间max是在不确定集中寻找最恶劣场景,内层min是在给定场景下第二阶段决策变量的经济调整成本最小化。这个嵌套结构比单阶段鲁棒要复杂得多,但它正确反映了“计划跟随变化”的真实运行规律——这正是它的价值所在。

举一个容易理解的类比:假设你安排一次长途自驾,第一阶段是决定路线、酒店、加油策略,这是出发前必须定好的;第二阶段是路上遇到堵车时临时改道或调整加油站选择。如果你在出发前把所有可能路况的最坏情况都考虑进去,找一个“无论堵车多严重,都能以相对合理成本到达目的地”的方案,这就和两阶段鲁棒优化的思想是一致的。

2.2 不确定集构造与保守度控制

不确定集是两阶段鲁棒优化的核心设计选项,它直接决定了模型的保守程度和求解难度。最常见的构造方式是盒式不确定集,即每个不确定参数在自己的上下界区间内独立波动。盒式集合的优点是简单直观,但缺点也很明显:所有参数同时取到最坏值的概率极低,这会导致调度方案过度保守,经济性变差。

为了平衡保守度和经济性,实践中更常用的是带预算约束的多面体不确定集。预算参数Γ(读作Gamma,有的文献里写成budget参数)限制了不确定参数偏离预测值的总个数或总偏离量。一个合理的解释是:虽然每个光伏电站可能同时波动,但在同一时刻所有电站都偏离到极限值的可能性很小,通过预算约束可以把这个“协同波动”限定在合理范围内。

在实际建模中,我把光伏出力和负荷偏移量分别用不确定参数表示,每个参数在可行区间内取到极限值的次数不能超过预算值。调参经验是:预算Γ取值越大,结果越保守;取0时退化为确定性模型;通常从确定性结果出发逐步增加Γ,观察系统成本和对储能SOC曲线的影响,直到找到那个“安全性提升明显、成本增加可接受”的拐点。我算过几个典型微电网案例,实践中预算参数取到总不确定参数个数的50%到70%时,鲁棒性与经济性的平衡通常比较理想。

2.3 目标函数与约束条件的关键拆解

目标函数分为两部分。第一阶段成本主要包括机组启停成本,第二阶段成本包括燃料成本、与大电网交互的购售电成本、储能充放电的折旧成本。整体目标是在最恶劣场景下最小化这两部分成本之和,可以理解为“在最坏情况下的总费用仍然可以接受”。

功率平衡约束是微电网调度的核心等式约束,要求任意时刻所有发电出力和购电功率之和等于负荷、售电功率和储能充电功率之和。这个约束在每个不确定场景下都要满足,是连接两阶段决策变量的关键纽带。

机组运行约束包括出力上下限约束和爬坡约束。出力上下限保证机组运行在安全区间,爬坡约束则限制了机组在相邻时段之间的出力变化速率——这一组约束在第二阶段中尤其重要,因为在恶劣场景下需要机组快速响应,但物理上机组出力不可能瞬时变化,这就是确定性调度方案在不确定性面前失效的根源之一。

储能约束包含SOC动态方程和充放电功率限制。SOC方程描述了相邻时段储能电量状态的变化关系,需要注意的是,两阶段鲁棒优化中SOC变量通常同时出现在第一阶段和第二阶段。如果第一阶段确定了储能基准充放电计划,第二阶段允许在这个基准基础上进行小幅调整,那我们需要增加调整量限制约束,避免第二阶段过度依赖储能来弥补机组出力的不足。

与大电网交互功率约束通常设定一个购售电功率上限,有些模型中还会包含交互功率的上下限对称约束和峰谷时段划分。这部分如果不建模,优化结果容易出现购电功率尖峰过高的问题,实际运行中受变压器容量和并网协议限制往往做不到。

3. 列与约束生成算法的实现与C&CG求解

3.1 max-min子问题的对偶变换

两阶段鲁棒优化之所以不能直接调用现有优化求解器一次性求解,是因为中间的max-min结构导致整体模型非凸、不满足线性规划的标准形式。最常用的处理方法是把问题分解为主问题(MP:Master Problem)和子问题(SP:Subproblem),然后通过C&CG算法迭代求解。C&CG算法的核心思想是:主问题先决策一组第一阶段变量,然后子问题在给定第一阶段决策下寻找最恶劣场景并计算对应的最小运行成本,再把找到的场景作为新的约束加入主问题,反复迭代直到上下界收敛。

子问题内部是一个嵌套优化:内层是给定不确定场景下的调度成本最小化,外层是不确定集中使这个最小成本最大的场景选择。为了求解这个嵌套问题,通常有两种途径:一是把内层最小化问题通过对偶变换写成对偶最大化问题,与外层最大化合并成一个单层最大化问题;二是用KKT条件把内层问题的极值条件转化为约束,保留内层变量作为额外变量。

我在实现中最常用的是对偶变换路线。这个路线的前提是内层问题必须是线性规划,所以建模时要避免在第二阶段引入整数变量。如果第二阶段的储能充放电需要逻辑变量,就不能直接对偶,需要用大M法或者引入附加约束来线性化。这点在建模初期就要想清楚,否则后面推导对偶时会非常痛苦。

3.2 MP的构建与场景约束的迭代添加

主问题是在有限个已知场景下求解第一阶段变量和第二阶段变量的联合优化问题。每轮迭代后,算法会从子问题中提取一个最恶劣场景,把这个场景对应的第二阶段变量和约束追加到主问题中。

主问题的目标函数包含两部分:第一阶段的实际成本和一个辅助变量η,η代表当前已知场景集下的最恶劣场景调度成本的下界。随着迭代进行,越来越多的极端场景被加入主问题的约束集合,辅助变量η会被逐步抬高,逼近真实的鲁棒最优成本。

我在Yalmip中的实现思路是:预先定义所有约束模板,迭代循环中通过变量索引向约束集合动态添加内容。主问题每一轮求解得到第一阶段决策变量值和辅助变量的上下界,用于判断收敛情况。主问题规模会随着迭代次数线性增长,这也是C&CG相对于Benders分解的优势所在:C&CG每次迭代都加入完整的第二阶段模型(变量+约束),而不像Benders那样只加入一条割平面,因此需要的迭代次数通常少很多,收敛也更稳定。

3.3 整套C&CG迭代流程

完整的C&CG求解流程可以表述为以下循环:

第一步,初始化:给定一个初始不确定场景(通常取不确定参数的名义值),设置迭代计数器和上下界初值。

第二步,求解主问题:在已知场景集下求解,得到第一阶段决策变量x*和辅助变量η。此时主问题求出的目标函数值作为全局下界。

第三步,固定第一阶段变量x*,将其代入子问题,求解得到最恶劣场景u和对应的第二阶段最小成本Q(x, u*)。此时x的真实总成本为第一阶段成本加上Q(x, u*),将这一值作为全局上界。

第四步,收敛判断:计算上下界之间的相对差距,如果小于预设阈值(比如百分之一),则停止迭代,输出当前解;否则把子问题求得的最恶劣场景u*作为新场景,向主问题中添加对应的约束和第二阶段变量,进入下一轮迭代。

使用Yalmip的关键实现要点是:第一阶段变量和第二阶段变量虽然是两类变量,但它们在主问题中是在同一个优化问题里共同存在的,只是第二阶段变量在每次迭代中对应不同场景索引。代码层面建议用元胞数组或结构体管理每个场景对应的变量群,不然迭代十几轮之后变量索引会一团乱麻。

需要注意的是,C&CG算法要求子问题的第二阶段模型是线性规划以满足强对偶条件。如果模型中含有二阶锥约束(例如某些储能退化成本模型),就需要用更复杂的对偶手段来处理,复杂度会明显上升,这一般不是初学阶段的优选方案。

4. 算例设计、参数设置与结果分析

4.1 一个典型微电网算例的参数怎么定

为了让读者能对照复现,我给出一个典型的微电网系统配置:系统包含一台柴油发电机、一组储能电池、一座光伏电站和负荷,同时与上级配电网通过一条联络线连接。调度周期取24小时,步长为1小时。柴油机组的运行参数参考常见的小型柴油发电机配置:最小技术出力为额定出力的20%,爬坡上限为额定出力的每小时15%,燃料成本系数采用二次函数简化为分段线性成本。

储能参数方面,额定容量通常设为200到400千瓦时,充放电效率取0.95,SOC范围控制在10%到90%之间,最大充放电功率为容量的0.25倍。光伏出力的预测值可以取一个典型夏季日的变化曲线,同时设置预测相对误差范围为正负15%,这个误差范围在实际工程中是合理且常见的设定。

负荷曲线取一个典型的工商业日负荷曲线,峰值出现在10点到15点以及19点到21点两个时段。购售电价采用分时电价模式:峰时段1.2元/千瓦时,平时段0.75元/千瓦时,谷时段0.4元/千瓦时。光储系统的经济参数不需要过度精细化,把重点放在验证鲁棒方法本身的效果上。

4.2 鲁棒调度与确定性调度的结果对比

在确定性模型下,系统在预测的光伏出力下安排储能谷时充电、峰时放电,柴油机组作为补充电源在负荷高峰时段启动。总运行成本为确定性预测下的最小值。但是把这个调度方案代入最恶劣场景(光伏出力偏低、负荷偏高)中进行验证时,会出现两个典型问题:一是柴油机组爬坡速率不足导致部分时段无法填补功率缺口,二是储能提前放电导致SOC过低,晚高峰时段严重依赖购电甚至越限。

鲁棒优化模型在不确定集存在的前提下重新求解,得到的调度方案呈现出明显不同的特征:储能充电量增加,柴油机组的启停时段提前,某些时段主动提高机组出力预留旋转备用,购电功率的峰值被压低。在相同的最恶劣场景下验证时,鲁棒调度方案的所有约束均满足,系统运行正常。从成本角度看,鲁棒方案的总运行成本比确定性方案高出约8%到12%,这笔“溢价”可以看作是购买安全性的必要支出。

4.3 鲁棒成本随预算参数和误差范围的变化规律

我进一步分析了不确定集参数对结果的影响:当预算参数Γ从0增加到最大可能值时,系统总成本呈单调上升趋势,但上升速率在中间区间最平缓,说明此时鲁棒性的边际成本较低。当误差范围从10%扩大到20%时,鲁棒成本显著上升,而且上升幅度随Γ增大而加剧,说明误差范围的扩大对模型保守度和经济性的影响是叠加放大的。

有一点值得警惕:当误差范围和预算参数同时取到较大值时,模型可能给出一个“极端保守但违背实际运行经验”的方案,例如柴油机组几乎全天运行,储能几乎没有动态调节空间。这说明鲁棒优化虽然能保证安全性,但不合理的参数设置会让方案走向过度保守的另一极端。我的做法是先在确定性模型和随机模拟场景库中分别验证多个参数组合,用成本曲线和安全可行性的拐点位置来选择最终参数。

5. 实操中的常见问题与避坑指南

5.1 第二阶段必须保持线性,否则对偶过程直接崩溃

很多初学C&CG的朋友,第一步建模时的第二阶段模型里顺手加了整数变量,比如储能充放电状态变量用binary表示。内层min问题的整数变量一旦存在,就不能通过对偶变换把双层问题转化为单层问题,因为线性对偶理论要求原问题必须是线性规划。

解决方案有两个:一是在建模阶段主动将充放电逻辑线性化,比如用一组线性约束替代“充电功率和放电功率不同时为正”这个逻辑条件;二是把储能的充放电状态变量全部放在第一阶段,第二阶段只保留连续功率调整量,这种做法的代价是储能调节灵活性下降,但模型的可解性大幅提升。从工程实践来看,后者往往更符合实际调度规律——储能的充放电计划本来就是日前阶段要确定的。

5.2 对偶推导中的符号方向错误

对偶变换是C&CG实现中出错率最高的环节。常见错误包括:等式约束对应的对偶变量没有限定为自由变量,松弛约束方向写反导致对偶变量符号错误,目标函数中常数的对偶贡献被遗漏。我建议每一步对偶推导都对照线性规划对偶表逐项检查,尤其是等式约束和变量非负性约束的关系,这个细节一旦错,子问题求出的“最恶劣场景”就不是真正的最恶劣场景,整个迭代过程都会在错误的轨道上运行。

我在第一次实现C&CG时,就是因为把等式约束对应的对偶变量误设成非负约束,导致子问题求解结果始终偏高,主问题与子问题的上下界长期无法收敛。排查了一整天才发现是这行声明的问题。如果你也用Yalmip,建议把模型展开后用导出模型的方式检查对偶变量的数量,逐步核对比对。

5.3 大M参数的取值技巧与数值稳定性

如果第二阶段模型里采用了KKT条件线性化路径,几乎必然涉及大M参数的使用。大M的取值直接关系到求解器的数值稳定性:取值过小会错误地截断可行域,导致最优解被排除;取值过大则会让求解器在计算过程中遭遇病态矩阵,表现为求解速度骤降和结果精度下降。

我的经验是:大M取值只比约束中可能出现的最大数值高一个数量级。比如某个约束中变量的最大可能取值是200,那么大M取2000通常就够了,不需要取到1e6。另一个有效做法是分段逐约束处理,每条含大M的约束单独检查是否在极端场景下依然成立,避免“一刀切地全部用同一个M值”。

5.4 收敛判据与迭代次数的调试经验

C&CG迭代的收敛判据通常使用上下界的相对偏差,我建议阈值设为0.5%到1%之间,太小会导致迭代次数过多,太大则给出的调度方案不够精确。收敛速度受多个因素影响:不确定集的预算参数、误差范围、初始场景选择。

当预算参数较大且不确定参数较多时,迭代次数可能明显增加,这是正常现象。如果迭代次数过大(超过二三十轮),建议检查子问题求解是否正确、场景是否重复加入,避免算法陷入循环。还有一个在写代码时不容易想到的点:主问题添加新场景变量时,上一次迭代生成的变量引用会被保留,如果不小心覆盖了旧变量索引,会导致约束目标对不上,出现上下界跳变的问题。

5.5 从确定性结果出发逐步增加不确定集参数

最后分享一个非常实用的调试策略:不要一开始就上手完整的两阶段鲁棒模型,更不要直接跑大不确定集的算例。先把模型退化为确定性调度(不确定参数全部取预测值,预算参数取0),确认基础模型、求解器和数据文件没有问题;然后逐步把光伏和负荷的波动范围加上去,保持预算参数为0,观察确定性模型还能否可行;最后再把预算参数逐步增大,直到出现不希望看到的过度保守现象。

这种做法最大的好处是每一步都能快速定位问题根源。如果确定性模型都跑不对,那问题大概率出在建模或数据上;如果确定性模型正确但鲁棒模型发散,那就要重点检查对偶推导和场景传递环节。我自己在实际调试中,每一步都保留了对应的日志输出,记录上下界变化和场景信息,这样可以快速回溯迭代过程中哪一步导致求解失真,排查问题的效率提升非常明显。

就我个人经验来说,两阶段鲁棒优化在微电网经济调度中的价值,不在于它给出了一个“绝对最优”的调度计划,而在于它让调度方案具备了应对极端场景的结构性能力——你提前为最坏情况预留了调整余地,实际运行中即便预测失误也不会满盘皆输。做这个课题最深的体会是,建模过程中最消耗时间的不是求解器调用,而是对偶推导和场景参数之间的交互验证。如果你也正在跑类似课题,希望这篇文章能帮你少走一些弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询