☰
微电网两阶段鲁棒优化经济调度:原理、求解与工程落地
2026/10/7 22:51:32 网站建设 项目流程

去年接手一个工业园区微电网的调度优化项目,光伏装机12MW、风电8MW、储能10MWh,外加两台燃气轮机和一条10kV并网联络线。项目组最初用的还是传统的确定性经济调度——把预测曲线当成实际出力去排计划,结果每个月都要因为光伏实际出力与预测偏差过大,临时调整机组启停方案,备用成本一个月比一个月高。后来我们把核心算法切换到微电网两阶段鲁棒优化经济调度,才真正把不确定性问题按在了地上。

这篇文章就把我在项目落地和后续仿真实操里积累的完整经验整理出来,从"为什么要用两阶段鲁棒优化"讲起,拆解建模过程、求解算法、算例验证方法,以及实际工程中容易踩的坑。内容主要面向电气工程相关专业的研究生、微电网项目的调度工程师,以及正在做能源管理算法选型的技术负责人。文章里没有堆砌晦涩的数学证明,尽量用能直接落地的语言讲清楚原理和操作。

1. 微电网经济调度到底难在哪:确定性方法的无力感

1.1 风光出力不确定性才是真正的主角

微电网和大电网最本质的区别在于系统惯性小、可调度资源有限。大电网有成百上千台机组分摊扰动,一片云飘过光伏阵列导致出力瞬间下降20%,对电网来说可能只是毫不起眼的波动;但在微电网里,这20%可能就是总装机容量的很大一块,足以让频率和电压发生明显波动。

我在这类项目里最深的感受是:微电网经济调度真正要对付的,不是负荷预测误差,而是风光出力的不确定性。光伏出力受云层遮挡、温度、湿度影响,风电出力受风速风向突变影响,这些因素本身就很难精确建模。行业内常用的短期预测手段,比如数值天气预报、卫星云图反演、统计外推,在典型日场景下可以做到光伏预测误差10%~15%、风电预测误差15%~30%;一旦遇到强对流天气或者阵风切换,误差超过40%也不稀奇。

传统的确定性经济调度模型,本质上假设这些预测值是"准的",把光伏、风电出力当成固定参数塞进约束里求解。这样算出来的方案,在预测准确的日子运行得很漂亮,成本也低;可只要实际出力偏离预测,调度方案就立刻"破功"——不是缺功率,就是功率多了没处去。

1.2 确定性调度方案为什么总"差一口气"

举一个实际项目里反复出现的场景。某天光伏预测出力300kW,调度员按这个数据安排燃气轮机出力和储能充放电计划。结果午后云层突然变厚,实际光伏只有220kW,中间差了80kW。这80kW的缺口如果让燃气轮机补,得看爬坡速率跟不跟得上;如果让储能补,又得看当前SOC够不够;最坏情况下只能启动可中断负荷或者临时从主网购电,而现货市场电价波动往往不小。

反过来还有一种情况,预测晚上风电大发力,调度员出于安全考虑提前降低了燃气轮机出力,结果实际风小得可怜,储能又已经放空,天然气机组从低出力爬回高出力需要时间,这段时间只能靠购电顶着。这种"两头受气"的局面,本质上是因为确定性模型把所有不确定参数都压缩成了一个点,完全没给自己留退路。

有人会觉得,那把预测误差留出备用容量不就行了?问题在于,旋转备用的报价并不便宜,而且备用留多了,燃气轮机的经济出力区间就被压缩,储能的可用容量也被占用,整体运行成本实质性上升。我在几个项目的经济性测算里都看到,单纯靠"多留备用"应对不确定性,一不留神备用成本就能吃掉微电网5%~8%的净利润。

1.3 随机优化与鲁棒优化:两条不同思路的取舍

既然确定性问题这么大,为什么不直接用随机优化?随机优化的基本思路是:为光伏、风电的不确定性生成大量场景(或者用蒙特卡洛采样),对目标函数求期望值。这个方法理论上很优雅,但在工程应用里有两个让我很头疼的问题。

第一个问题是精确概率分布不好拿。随机优化需要为每个不确定参数指定概率分布,然后根据分布采样场景。实际现场能拿到的往往只有一个预测值和一段有限的历史误差记录,拿这点数据去估计分布参数,方差都不稳,更别说尾部分布了。第二个问题是计算量。为了保证解的可靠性,场景数量通常要几百上千个,每个场景都对应一组第二阶段的决策变量,整数变量的规模也就跟着爆炸,求解时间动不动就是几个小时,根本没法用在日内滚动调度里。

鲁棒优化走的是另一条路:我不需要知道不确定参数的具体分布,只要知道它的变化范围就够了。然后在这个范围内寻找"最坏情况"下的最优调度方案,确保任何可能出现的场景都不会导致约束被违反,成本再高也有上限。代价是方案相对保守,日常成本可能比随机优化高一些。

这两种思路在取舍上的差异,我用一个表格来对比,方便大家做选型时参考:

对比维度随机优化鲁棒优化
不确定性描述概率分布 + 场景集不确定集合(边界)
信息需求需要较准确的历史分布只需预测边界或区间
解的性质期望成本最优,尾部风险不可控最坏情况下仍可行,保守但安全
计算负担场景多,规模大,耗时高通过分解算法可控制在可接受范围
工程适用性适合分布已知且稳定的场景适合数据有限、安全约束严格的场景

我在实际项目中最终选择两阶段鲁棒优化,就是因为它的性能边界清晰、数据需求跟现场条件匹配,而且后续跟日内模型预测控制(MPC)一起用,能形成"日前有底线、日内有优化"的组合。

2. 两阶段鲁棒优化的核心思想:先做最坏打算,再找最优应对

2.1 从min-max到min-max-min:三层结构拆解

两阶段鲁棒优化的数学结构是很多初学者第一道坎,因为看起来就是一个套娃:min-max-min。别被这个符号吓到,我把每一层翻译成人话。

最外层min:我们要做的决策一(比如机组启停、储能充电计划、日前购电协议),这些决策必须在知道风光实际出力之前就定下来,所以叫"here and now"决策。

中间层max:在我们的决策一定下来之后,自然界会"选择"一个对我们最不利的风光出力场景——注意这里的"选择"是数学上人为构造的最坏情况,目的是检验方案在最恶劣条件下能不能扛得住。

内层min:在最坏场景确定了之后,调度系统还可以做调整决策,比如调整机组出力、改变储能放电功率、切掉一部分可中断负荷,这些是"wait and see"决策,目的是在既定场景下把运行成本压到最低。

合在一起,目标函数就是:min 第一阶段成本 + max(最坏情况下 min 第二阶段调整成本)。这个结构用我朋友的话来说就是"先做最坏打算,再找最优应对"。

拿生活中常见的决策类比:你出门前决定要不要带伞(第一阶段决策),出门后天气是晴是雨是狂风暴雨(不确定参数),你根据实际天气决定是走路、打车还是躲进店里(第二阶段调整)。鲁棒思维要求你选择的带伞方案,即使在最恶劣的天气下也能让你顺利到达目的地,顶多就是路上多花点打车钱。

2.2 第一阶段"日前决策"定什么

在微电网经济调度里,第一阶段决策通常包括三类:

第一类,机组的启停状态。燃气轮机、柴油机这类可控机组,启动需要时间,热启动也要二三十分钟,冷启动甚至需要一两个小时,而且启动过程会产生额外燃料消耗和设备磨损。这类决策必须提前一天确定,因为临时启停机不仅在物理上可能来不及,经济上也非常不划算。

第二类,储能的日前充放电计划。储能系统的充放电策略会直接影响后续各个时段的可调空间,而它的SOC存在时间耦合——这个时段多放了,下个时段就少了一截容量。如果完全放到第二阶段再决定,储能可能被用到无电可用,失去兜底作用。所以通常第一阶段先定一个基准充放电计划,第二阶段在这个计划基础上做小范围修正。

第三类,与主网的日前购售电协议。在电力市场环境下,微电网通常需要在日前市场申报次日各时段购售电量,并为此签订合同;实际执行与合同出现偏差时,会在实时市场按偏差电量结算,价格往往不如日前友好。所以第一阶段就要把联络线功率的基准点定下来。

这些决策有一个共同特点:一旦确定,短时间无法改变或改变代价很高。正是因为有了它们,才会引出第二阶段的问题——在不确定参数暴露后,还能用什么手段去"补救"。

2.3 第二阶段"实时调整"空间从哪里来

第二阶段决策是在第一阶段方案已定的前提下,针对实际出现的风光场景所做的快速调整,主要包括四类手段:

  • 可控机组出力调整:在上一步确定的启停方案里,微调各机组的出力点,注意不要超过爬坡约束。
  • 储能充放电功率修正:根据当前SOC和实时功率差额,决定多充一点还是多放一点。
  • 弃风弃光:当实际风光出力过高,系统消纳不了时,主动切除一部分光伏或风电。
  • 可中断负荷:当功率不足且其他手段都用尽时,切除优先级较低的负荷,并支付相应的补偿费用。

第二阶段看起来很灵活,但它的可行域其实被第一阶段决策牢牢限制住了。举个最简单的例子:第一阶段没开那台燃气轮机,第二阶段功率缺口再大,也不可能把一台没启动的机组在5分钟内拉起来。这就是为什么两阶段鲁棒优化必须把两个阶段一起考虑,而不是分成两个独立的优化问题来解。

在很多论文里,第二阶段成本也叫后悔成本(regret cost)或者调整成本,它衡量的是"计划赶不上变化"时额外付出的代价。鲁棒优化的目标并不是让这个调整成本为零——那不现实,而是保证在最坏情况下,这个调整成本仍然有一个明确上限,整个调度方案不会失控。

3. 建模落地:盒式不确定集合与具体约束怎么写

3.1 盒式不确定集合的设计

不确定集合的设计是整个鲁棒优化建模中最体现功力的一步。应用最多、工程上也最容易落地的是盒式集合(box set)加上预算约束的思想。

先看基本形式。假设光伏预测出力是P_pv_pred,实际出力被限制在区间[P_pv_pred - ΔP_pv, P_pv_pred + ΔP_pv]内;风电同理。把所有不确定参数都装进这些区间构成一个多维盒子。

但直接把每个参数的范围取到最大,很可能过度保守——所有光伏同时从预测上限跌到下限的概率极低,如果按这种情况设计,储能会被迫一直保持着极高的充电状态,燃气轮机始终开着,日常成本高到难以接受。

所以工程上普遍的做法是引入预算参数Γ(也有文献叫鲁棒控制参数),它的含义是:在同一个调度周期内,所有不确定参数偏离预测值的总量不能超过某个上限。用公式表示大致是:

Σ_t (|Δu_t| / Δu_max,t) ≤ Γ

这个式子的意思是把所有时刻的相对偏差累加起来,限制在一个可调的值Γ以内。Γ=0时退化为确定性模型,完全不考虑偏差;Γ=1时允许每个时刻都达到最大偏差,是最保守的情形。实际工程中Γ取0.3~0.7是比较常见的合理区间,具体取值通过对历史预测误差数据的统计分析来校准。

为什么工程上普遍喜欢盒式集合?因为它的数据需求极其简单——只要知道预测误差的上下边界就够了,不需要估计分布,不需要生成上百个场景。而且后面配合列与约束生成算法(C&CG)时,最坏场景可以直接通过解一个线性规划求出来,实现非常顺手。

3.2 两阶段模型的完整数学表达

为了让大家能直接照着建模型,我把典型的两阶段鲁棒经济调度模型框架列在下面。这里以一个常见的微电网结构为例:光伏+风电+燃气轮机+储能+联络线+可变负荷。

变量定义如下表:

变量类型含义
x_gt(t)0-1t时段燃气轮机启停状态
P_gt(t)连续t时段燃气轮机出力
P_bat_ch(t), P_bat_dis(t)连续储能充电、放电功率
P_grid(t)连续联络线购售电功率(购为正)
P_pv_cur(t), P_wind_cur(t)连续弃光、弃风功率
P_load_cut(t)连续可中断负荷切除量
SOC(t)连续储能荷电状态

目标函数分两部分:第一部分是第一阶段的机组启停成本与日前购电基准成本;第二部分是第二阶段在最坏场景下的调整成本,包括燃料成本偏差、弃风弃光惩罚、可中断负荷补偿、偏差电量结算等。写成紧凑形式就是:

min_{x∈X} [ c^T x + max_{u∈U} min_{(y,v)∈F(x,u)} d^T y + q^T v ]

其中x代表第一阶段变量,y代表第二阶段连续调整变量,v代表弃风弃光/切负荷等松弛变量,F(x,u)表示给定第一阶段决策和不确定参数后的可行域。

约束方面有这几组必不可少的:

  • 有功功率平衡:ΣP_gt(t) + P_bat_dis(t) - P_bat_ch(t) + P_grid(t) + P_pv(t) - P_pv_cur(t) + P_wind(t) - P_wind_cur(t) = L(t) - P_load_cut(t)
  • 储能动态约束:SOC(t) = SOC(t-1) + η_ch · P_bat_ch(t) · Δt - (P_bat_dis(t) / η_dis) · Δt,同时满足SOC上下限和充放电功率上限
  • 燃气轮机约束:出力上下限、爬坡约束、最小启停时间约束
  • 联络线约束:购售电功率不超过线路容量
  • 第二阶段调整量的非负约束和上下限约束

我把这个模型写成标准矩阵形式而不是具体展开全套公式,是因为实际软件实现时(不管用Gurobi、CPLEX还是开源求解器),按矩阵形式封装更方便后续写C&CG算法。如果一上来就一股脑把几百行线性约束铺开,后面迭代加约束时反而容易乱。

3.3 约束中需要小心的线性化处理

建模过程中有几个线性化处理的细节,处理不好后续求解就会出现各种幺蛾子。

第一个是燃料成本函数的线性化。燃气轮机的燃料成本是出力的二次函数,两阶段鲁棒模型本身已经够复杂,再引入双线性项求解器基本就不动了。常用做法是用分段线性函数逼近二次成本曲线,每一段用一组线性不等式描述,确保松弛后的模型仍然是线性规划或混合整数线性规划。

第二个是0-1变量与连续变量相乘的问题。比如"只有机组启动时才能输出功率"这类关系,写成P_gt(t) ≤ P_max · x_gt(t)就够了,但如果出现x_gt(t) · P_gt(t)这种乘积项,就得用大M法拆解,引入辅助变量和两组约束。大M的取值很关键,取太小可能误伤可行解,取太大又造成数值病态,我一般取对应物理量的10倍量级然后做敏感性测试。

第三个是绝对值的处理。第二阶段调整量经常以偏差的绝对值形式出现在成本函数里,比如联络线实际功率相对日前计划的偏差费用。直接把abs项丢给求解器虽然也能解,但效率很低。标准做法是拆成两个非负变量,用两个不等式把绝对值约束替换掉,保持线性结构。

第四个是储能充放电互斥约束。工程上储能不能同时充电和放电,理论上要加一个0-1互斥变量,但会显著增加整数变量数量。如果允许一个很小的"同时充放"容差,可以写成P_bat_ch(t) · P_bat_dis(t) ≤ ε的线性化形式,或者干脆在SOC递推公式里让两个变量同时存在但用惩罚项抑制违反。选择哪种方式取决于你系统里储能调控精度要求有多高,精度要求高的场景还是老老实实加整数变量。

4. 求解算法与实现:用C&CG把问题真正算出来

4.1 为什么不能直接求解

很多人第一次接触两阶段鲁棒优化时,第一反应是"直接把模型丢给Gurobi求解器不就行了"。但实际操作下来你会发现问题远比想象中复杂。

原因在于这个min-max-min结构本质上是一个三层优化问题。不确定集合U是连续的,所谓"最坏场景"不是可以从有限个场景里挑出来的,而是要在连续空间里通过一个内层优化求出来的。任何通用求解器遇到内层嵌套优化时,要么枚举场景(不现实,连续区间根本枚举不完),要么在KKT条件上打转,效率极低。

而且从计算复杂性理论的角度看,这类问题通常属于NP-hard级别。指望靠求解器的通用机制自动搞定,等于指望它同时解一个主问题、一个对抗性搜索问题和无数个子问题,基本不可能。

所以实际工程里,主流的做法是把三层结构拆成一个主问题和一个子问题,通过迭代的方式逼近最优解。其中最有代表性的算法就是列与约束生成(C&CG,Column-and-Constraint Generation),以及传统的Benders分解。我从实践角度说,C&CG在收敛速度和实现难度上综合表现更好,也是我自己项目里的主力方法。

4.2 C&CG迭代流程详解

C&CG的核心思想简单概括就是:主问题只保留一组精简的最坏场景,子问题在给定第一阶段解的情况下去寻找真正的最坏场景,再把找到的场景作为新一列(新变量和新约束)加入主问题,如此迭代直到上下界收敛。

具体步骤如下:

  1. 初始化。设上界UB=∞,下界LB=-∞,迭代次数k=1。选择一个初始不确定场景,通常直接取预测场景。
  2. 求解主问题MP。主问题包含当前已知的一组最坏场景(初始只有预测场景),求解得到第一阶段决策x^k和第二阶段的辅助目标值θ^k,更新下界LB=MP的目标函数值。
  3. 求解子问题SP。把x^k固定下来,代入第二阶段模型,求解最坏场景u^k以及对应的第二阶段最小成本Q(x^k)。用这个结果更新上界UB=min{UB, 第一阶段成本c^T x^k + Q(x^k)}。
  4. 判断收敛。如果(UB-LB)/LB小于设定的阈值ε,比如0.001,就认为收敛,输出当前方案;否则进入下一步。
  5. 生成新约束。把子问题找到的最坏场景u^k作为新场景加入主问题,对应新增一组第二阶段变量和约束,令k=k+1,回到第2步。

这个流程说起来简单,真正实现时有几个环节非常关键。

最关键的一步是子问题的求解。子问题本身是max-min结构,即固定x后,外层要在U里找最坏场景,内层要求第二阶段成本最低。这是一种双层优化,不能直接交给通用求解器。通常的做法是利用强对偶定理,把内层的min问题转化成对偶问题的max形式,这样整个子问题就变成一个单层max问题(外层max加内层对偶的max合并成一个max),可以直接求解。如果内层问题不是线性规划而包含整数变量,那就更麻烦,需要用KKT条件或者大M法做一些转换。

我在第一次实现时就在这个环节卡了两天,最后发现内层某个约束没有写成标准线性形式,导致强对偶不适用。所以建模型时尽量保证第二阶段子问题是线性规划,这对后面求解是极大的加分项。

4.3 实现中的关键细节与收敛性判断

子问题求解中另一个常见的坑是大M取值。在生成单层max问题时,通常会把内层min的对偶约束写进模型,同时借助强对偶条件构造最优性约束,这里会引入大M参数,用于处理整数变量的互补松弛条件。大M取太大,求解器会报数值警告,迭代过程可能震荡不收敛;取太小又可能把真实最坏场景排除在搜索范围之外,UB长期降不下去。稳妥的做法是先用确定性版本预跑一遍,记录各变量的实际变化范围,再据此确定大M的量级。

收敛阈值的设定也很有学问。我用的是相对间隙准则:当(UB-LB)/LB小于0.1%时停止迭代。在典型微电网算例(十来台设备、24个时段)中,C&CG一般迭代7~15轮就能收敛,总计算时间在几十秒到几分钟量级,完全满足日前调度的时效性要求。如果迭代超过30轮还没收敛,我通常会检查是不是子问题里某个约束写错了,或者大M取出了问题,而不是盲目增加迭代上限。

此外,初始场景的选择会影响前几轮迭代的收敛速度。我一般会把预测场景以及几个历史上实际出现过的最恶劣场景一起放进主问题作为初始场景集,能让UB快速降下来,整体迭代次数能减少20%~30%。

5. 算例设计的学问:如何证明方案真的有效

5.1 测试系统的参数设置

写算法不能只停留在理论层面,还得用算例让它"跑起来"证明有效。我建了一套测试系统,参数参考了典型园区微电网公开测试数据,做类似研究的朋友可以直接拿这套参数做基线。

测试系统构成如下:

  • 光伏:额定容量800kW,预测误差取±20%
  • 风电:额定容量400kW,预测误差取±30%
  • 燃气轮机1:额定300kW,最小出力50kW,爬坡率100kW/h
  • 燃气轮机2:额定200kW,最小出力30kW,爬坡率80kW/h
  • 储能系统:额定容量500kWh,最大充放电功率250kW,效率92%,SOC范围20%~90%
  • 峰荷:1200kW
  • 联络线:最大购售电功率600kW

天然气价格、上网电价、储能维护成本、可中断负荷补偿单价这些参数,我按照国内工业园区的常见水平设定,比如天然气按2.5元/立方米折算成度电成本大约0.9元/kWh,可中断负荷补偿按1.2元/kWh。

这里额外提醒一句:预测误差的边界值不是拍脑袋定的,一定要拿现场一年的历史运行数据做统计。我见过不少团队直接把论文里的±20%拿来用,结果实际运行时边界完全不准,鲁棒方案失效或者过度保守,白白挨骂。

5.2 评价指标:鲁棒成本、违约概率、计算时间

设计好测试系统后,怎么评价一个鲁棒调度方案好不好?我习惯用三个指标:

第一个是鲁棒成本,即最坏场景下的总运行成本。这个值代表微电网在面对"最恶劣自然状况"时,一天运行成本的上限。控制住它,就相当于给工程项目方交了底:"不管天气怎么样,一天的运行成本不会超过这个数。"

第二个是违约概率。把求出的调度方案放到500组蒙特卡洛随机场景里去回放,统计有多少组场景会出现功率失衡、储能过放、机组爬坡越限等问题。这个指标用来衡量方案的可靠性,一个好的鲁棒方案违约概率应该接近0。

第三个是平均运行成本,也就是把方案放到所有蒙特卡洛场景里跑出来的期望成本。这个值衡量的是日常经济性,用来判断方案是不是保守过头了。

同时还要记录主问题加子问题总共的求解时间,这是工程可部署性的硬指标。一个算法就算性能再好,如果一次求解要两三个小时,也基本告别日内滚动调度了。

5.3 结果对比:确定性、随机与鲁棒的差距

在我这套测试系统上得到的典型结果如下(数字取自我实际运行的一轮算例,仅供参考,不同参数设置会有差异,但规律是一致的):

调度方法预期日成本(元)最坏情况成本(元)蒙特卡洛违约概率求解时间
确定性优化约8200可到12000+35%左右20秒以内
随机优化(50场景)约8600约98005%~8%约10分钟
两阶段鲁棒(Γ=0.3)约8800约92001%以下约90秒
两阶段鲁棒(Γ=0.6)约9200约94000%约120秒
两阶段鲁棒(Γ=1.0)约9800约98000%约150秒

从这张表能读出几件事:

确定性方案日成本看起来最低,但它在35%的场景下都会出问题,一旦出现问题,实际成本可能飙升到12000元以上,而且切负荷、弃风等违约行为带来的间接损失还没算进去。

随机优化的平均成本控制得不错,但求解时间偏长,而且如果场景生成方式不合理,尾部风险仍然可能失控。

两阶段鲁棒方案用大约10%的成本增量,换来了几乎100%的违约率消除。Γ从0.3增加到0.6,成本增加约4.5%,但违约率从1%降到0;再往上升到1.0,成本增加了6.5%,安全边际却没有显著提升。这说明Γ=0.6附近是目前这个算例的"甜点区"。

5.4 预算Γ的敏感性分析:找到"甜点区"

Γ值的选取直接决定了保守程度,所以敏感性分析是算例验证里必不可少的一环。我一般会把Γ从0扫到1,步长取0.1,每档跑一遍完整的两阶段鲁棒C&CG,然后画一条"成本-Γ"曲线。

从我多次运行的经验看,这条曲线通常不是线性的,而是在某个Γ值附近出现"拐点":小于这个值,违约概率下降很快,成本增加平缓;大于这个值,违约概率已经归零,成本却几乎线性飙升。这个拐点对应的Γ值就值得作为实际运行的保守度基准,然后运营商可以根据自身风险偏好微调——保守型可以取拐点值再往上加0.1,经济型可以往下减0.1。

需要注意的是,不同季节、不同天气模式下Γ的甜点值会漂移。比如夏季强对流天气多,光伏出力的波动幅度明显大于春季,Γ按全年平均取会偏小。所以我后来习惯按季节分组统计预测误差,分别标定边界,运行时就按当前季节取对应参数。

6. 实际工程落地中的几个坑与我的处理建议

6.1 保守性调节:不是越保守越安全

这是我在实际项目中踩过最深的一个坑,拿出来单独讲。

第一次把两阶段鲁棒优化接入园区系统时,出于稳妥考虑,我直接把不确定集合的边界设成了历史最大偏差的1.3倍,Γ也设得比较满。结果算出来的方案是:储能几乎全天保持在80%以上的高SOC,燃气轮机从早开到晚,可调度空间被压缩到了极点。看起来方案很"安全",但实际运行成本比确定性方案高了15%还多,项目方差点推翻整个方案。

后来我仔细回看了历史数据,发现那个1.3倍偏差的"极端场景"其实是一年才出现一两次的雷暴天气,根本不应该作为日常调度的基准。把边界改回历史数据的90%分位数,再把Γ调到0.6附近之后,成本增量降到了可接受范围,同时违约率仍然维持在0。

这里的关键认知是:鲁棒优化的边界应该描述"大概率会碰到的最坏情况",而不是"理论上可能出现的绝境"。边界定得太宽,系统为了保证极端场景下的可行性,会把正常运行资源大量锁死,日常经济性反而被白白牺牲掉。一句话,保守度是调出来的,不是越大越好。

6.2 大规模系统的计算量控制

如果微电网规模很大,设备多、节点多,C&CG的迭代压力会明显上升。我在做区域综合能源系统时遇到过一个模型,光机组就二十多台,储能和冷热电联供设备一堆,直接跑C&CG一次要两个小时,完全不可用。

后来用了几招把计算量压了下来。

第一招是场景去重。子问题迭代过程中,找出来的最坏场景经常非常相似——偏差分布形状类似,只是峰值时刻差一两个时段。可以用简单的聚类或相似度判断,把非常接近的新场景丢弃,避免主问题里积累大量冗余约束。

第二招是热启动。上一轮迭代得到的主问题最优解,可以作为下一轮迭代的初始可行解传给求解器。Gurobi和CPLEX都支持这种MIP start机制,能显著缩短主问题的求解时间,尤其是有大量0-1变量的时候。

第三招是子问题并行化。在不确定集合内部搜索最坏场景时,如果子问题模型不复杂,可以直接用求解器的多线程能力;更精细的做法是把按时间维度解耦成多个子区间并行求解,再把对偶乘子拼回来。这个做法的实现成本略高,但对超大规模问题值回票价。

第四招是在可接受范围内降低求解精度。日前调度对时间精度要求没那么极端,把MIP gap从默认的1e-4放宽到1e-3,求解时间能缩短三四倍,而方案成本差异往往不到0.5%。这个取舍在工程上是完全划算的。

6.3 数据获取与场景生成的现实问题

两阶段鲁棒优化的部署质量,很大程度上取决于预测误差边界的估计质量。这里有个非常现实的问题:很多微电网项目投运时间短,历史数据积累不够,误差分布根本统计不出来。

我在一个新建的园区项目里遇到的就是这种情况——系统投运才半年,光伏有数据,风电几乎没数据。我的处理办法是:先用典型日的数值天气预报预测结果+相似气候区域的公开数据做初始估计,把边界适当放宽(比如取±30%),然后把系统跑起来,一边运行一边积累实际误差数据,每过一个季度就用最新统计去校准一次边界。这个"边运行边校准"的思路很实用,比等到数据攒够了再上线靠谱得多。

另一个容易忽略的问题是预测更新的频率与调度周期要匹配。光伏预测有超短期(未来4小时)、短期(次日)多个版本,如果你做的是日前调度,就得用日前预测的误差边界,而不是拿超短期预测的精度去套日前模型。我用过一次短期预测误差边界去做日前调度,结果实际运行中光伏偏差比预期大得多,方案在上午十点左右就撑不住了,那次教训让我记住了一件事:不确定集合的数据口径必须和调度阶段严格对应。

最后顺便提一个我特别推荐的做法:把两阶段鲁棒优化的日前计划作为基准方案,日内再叠加一个MPC控制器做滚动修正。鲁棒优化负责在日前阶段兜住"最坏情况"的底线,MPC负责在日内利用最新预测信息把方案往经济最优的方向拉回。这个组合在实际运行中的表现,比单独用任何一种方法都要稳。

我自己在项目里最大的收获,其实是慢慢认识到鲁棒优化的价值不在"降成本",而在"控底线"——让微电网不管遇到什么天气、什么偏差,运行成本都有上限、功率平衡都有保障。做工程不是写论文,真正拉开方案差距的,往往不是算法本身多精巧,而是不确定集合边界标定得准不准、Γ参数调得合不合理、子问题建模有没有留下坑。希望这篇文章能给正在做微电网调度项目的朋友一些可以少走弯路的参考。

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

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

立即咨询