
多微网联合调度这两年确实是个热门方向但真正能把“两阶段鲁棒优化”和“容量配置”串起来做仿真的人并不算多。原因倒也不复杂这类问题涉及的不确定集构建、min-max-min三层结构求解、以及投资层与运行层的变量耦合每一个环节都足够劝退一批初学者。我自己也是在一次微网规划项目中踩了不少坑才把整套流程跑通。这篇就围绕“环境效益下的电源容量配置仿真研究”这个标题把两阶段鲁棒优化在多微网联合调度与容量配置中的建模思路、求解细节、仿真实现和实际工程里的坑都摊开讲一遍给正在做相关课题或者工程项目的人一个可以直接参考的路径。1. 为什么多微网容量配置必须走“两阶段鲁棒”路线1.1 传统确定性规划的盲区风光出力不是“一个数”先看一个最基础的场景。你在给一个含光伏和风电的微网做容量配置时传统做法是拿历史出力曲线取一个典型日或者直接使用年平均出力数据然后在这个“确定性的出力曲线”下优化光伏、风电、储能的装机容量。这个方法在早期微网规模小、可再生能源渗透率低的时候还能凑合但现在的问题在于光伏和风电的波动性、间歇性已经被放大到不能忽视的程度极端天气下的出力骤降、连续阴雨天、静风期都会让确定性配置结果在实际运行中出现严重的电力短缺或资源浪费。举个例子某园区微网按典型日数据配置了3 MW光伏和1 MW/2 MWh储能理论上全年供电可靠性能达到99%以上。但实际运行中夏季连续三天阴雨导致光伏出力仅为典型日的15%储能一天内就放空最后还是从主网购电才保障了负荷供应。这个故事说明用单一场景做容量配置本质上是拿平均情况赌极端情况赌赢了经济性好看赌输了可靠性崩盘。1.2 鲁棒优化的核心逻辑在最坏情况下依然可行鲁棒优化的思路刚好反过来它不追求在“平均场景”下最优而是追求在“最坏场景”下依然可行。放到容量配置问题上就是说我不管你风光出力怎么波动只要波动落在事先设定的不确定性集合范围内我配置的电源容量和调度策略就能保证微网安全运行。这里面最关键的设计自由度就是不确定集。你圈定的不确定集越大系统越保守配置的储能和备用容量就越高投资成本也越贵不确定集越小配置结果越经济但抗风险能力就差。所以鲁棒优化本质上是一个“花钱买安全”的权衡问题而这个权衡的量化工具就是两阶段鲁棒优化。1.3 为什么是“两阶段”而不是单阶段容量配置问题天然具有两阶段结构第一阶段做投资决策装多少光伏、多少风电、多少储能第二阶段做运行调度在一个具体的不确定场景下各微源出力怎么分配、微网之间怎么交互、跟主网交换多少功率。投资决策一旦做出在运行阶段无法更改至少短期内无法更改所以第一阶段变量是“here-and-now”必须在不确定性实现之前敲定第二阶段变量是“wait-and-see”可以等不确定性实现后再调整。这种决策时序关系用单层模型根本表达不了必须用两阶段框架。多微网联合调度又比单微网多了一层复杂性微网之间可以功率互济这意味着第二阶段调度不仅要考虑单个微网内部的源荷平衡还要考虑微网间联络线上的功率传输。这个“联合”维度的加入让第二阶段问题的规模成倍增长也恰恰让两阶段鲁棒优化有了更大的施展空间——不同微网的资源禀赋和负荷特性差异越大联合调度的互补效益就越明显。2. 两阶段鲁棒优化的数学模型从min-max-min到CCG求解2.1 模型结构投资层与运行层的变量耦合我直接给出一个在仿真中常用的紧凑形式方便对着写代码。设决策变量分为三层第一阶段变量 \(x\)各微网的光伏容量、风电容量、储能额定功率和容量以及对应的投资成本系数第二阶段变量 \(y\)各微源出力、储能充放电功率、微网间交换功率、主网购电功率、弃风弃光量、切负荷量不确定变量 \(u\)光伏出力预测误差、风电出力预测误差、负荷预测误差。整体模型可以写成\[ \min_{x} \{ c^T x \max_{u \in U} \min_{y \in F(x,u)} d^T y \} \]其中目标函数包含投资成本 \(c^T x\) 和运行成本 \(d^T y\)含从主网购电费用、燃料成本、碳排放惩罚成本等约束集合 \(F(x,u)\) 表示在投资决策 \(x\) 和不确定参数 \(u\) 确定后运行调度必须满足的所有约束。这时要重点解释三层结构的物理含义外层 min寻找使“投资成本最坏运行成本”最小的容量配置方案中层 max在给定的不确定性集合 \(U\) 中寻找使运行成本最大化的“最坏场景”——也就是大自然和我们对着干把风光出力压到最低、负荷抬到最高的组合内层 min在确定的容量和最坏场景下让调度员灵活调整各微源出力尽量降低运行成本。所以最终目标是我配的容量在最坏场景下经过最优调度总成本依然可控。2.2 不确定集的构建盒式还是预算约束不确定集是鲁棒优化的灵魂。我见过很多初学者直接用盒式不确定集box uncertainty set即每个不确定参数独立地在其预测区间内任意波动。这种做法虽然简单但过于保守——它假设所有光伏电站、风电场同时出力最低所有负荷同时到达峰值这在物理上几乎不可能发生结果就是配置出大量冗余的储能和备用容量经济性很差。实际工程中更推荐预算不确定集budget uncertainty set核心思想是不确定参数虽然可以偏离预测值但总的偏离程度受到一个“预算” \(\Gamma\) 的限制。这样可以表达“极端情况不会在所有节点、所有时刻同时发生”的物理事实。数学形式如下\[ U \left\{ u \in [\hat{u} - \hat{u} \Delta, \ \hat{u} \hat{u} \Delta] \ : \ \sum_i \left| \frac{u_i - \hat{u}_i}{\hat{u}_i} \right| \leq \Gamma \right\} \]其中 \(\hat{u}\) 是预测值\(\Delta\) 是最大偏差比例\(\Gamma\) 是预算参数。\(\Gamma 0\) 时退化为确定性模型\(\Gamma\) 越大越接近盒式不确定集。仿真中建议对 \(\Gamma\) 做敏感性分析观察不同预算水平下容量配置结果的变化这几乎是每篇高水平论文的必做内容。2.3 CCG算法的核心思路两阶段鲁棒问题直接求解是不行的因为内层的 min 和外层的 max 套在一起常规优化求解器处理不了这样的三层结构。工程中主流做法有两种Benders分解和列与约束生成CCG, Column-and-Constraint Generation。CCG是目前公认效率最高的方法之一其基本逻辑是把原问题拆成一个主问题和若干子问题然后通过迭代为主问题添加变量和约束也就是“列”与“约束”逐步逼近最优解。主问题MP在当前已知的若干“最坏场景”下求容量配置和调度方案的最优解提供一个目标函数值的下界子问题SP在给定第一阶段的容量配置 \(x\) 后寻找使运行成本最大的不确定场景 \(u^*\)并把该场景对应的运行变量和约束反馈回主问题子问题求得的目标函数值加上投资成本构成上界。迭代过程就是不断缩小上下界差距直到收敛。这个算法和单纯Benders分解的区别在于CCG每次不仅加割平面还会新增一组完整的运行变量和约束所以收敛速度通常更快特别适合第二阶段是LP或MILP的问题。2.4 子问题求解的两个关键转化CCG的难点集中在子问题上。子问题内部是个 max-min 结构不能直接丢给求解器。有两种常用转化方案强对偶转化把内层 min 问题写出对偶形式与外层 max 合并成一个单层 max 问题。这种做法要求内层是线性规划LP且满足强对偶条件。转化为单层问题后其结果是一个带双线性项不确定变量×对偶变量的优化问题需要用大M法或KKT条件进一步线性化KKT条件转化把内层 min 的KKT最优性条件作为约束加入外层 max 问题同样可以得到单层模型但需要引入互补松弛条件的线性化处理Big-M法。我在仿真中优先用强对偶转化因为第二阶段通常是LP各微源出力约束、功率平衡约束都是线性的强对偶条件容易满足。唯一麻烦的是互补约束和大M参数的选取这个放到后面“踩坑”部分专门讲。3. 多微网联合调度的运行约束与环境效益量化3.1 多微网联合调度与单微网调度的本质区别单微网调度只需管理内部源荷平衡多微网联合调度则多了一层微网之间的功率交互。这层交互既是物理约束联络线容量、功率方向也是经济杠杆——功率富余的微网可以把电卖给缺电的微网相比统一从主网购电联合调度能显著降低整体运行成本。从数学模型上看多微网联合调度增加的核心约束是联络线功率约束\[ -P_{ij}^{\max} \leq P_{ij}(t) \leq P_{ij}^{\max}, \quad \forall i,j \in N, \forall t \]其中 \(P_{ij}(t)\) 是微网 \(i\) 向微网 \(j\) 输送的功率\(P_{ij}^{\max}\) 是联络线容量。注意联合调度要做到“有效”需要在目标函数中明确写出微网间交易电价否则求解器不会主动利用联络线——这是很多人仿真结果里“联合了但没完全联合”的原因。3.2 环境效益如何进入模型碳排放惩罚与绿色 certificate标题中强调“环境效益”那么在容量配置模型里环境效益不能只是一个事后统计数字必须作为目标函数的一部分参与优化。我采用的做法是引入碳排放惩罚成本\[ C_{CO2} \alpha_{CO2} \cdot \sum_{t} \left( E_{grid}(t) \cdot e_{grid} \sum_{i} E_{DG,i}(t) \cdot e_{DG,i} \right) \]其中 \(E_{grid}(t)\) 是 t 时段从主网购电量\(e_{grid}\) 是主网单位电量碳排放因子\(E_{DG,i}(t)\) 是第 i 个分布式电源 DG 的发电量\(e_{DG,i}\) 是对应碳排放因子燃气轮机通常取 0.4~0.6 kg CO2/kWh光伏风电取 0\(\alpha_{CO2}\) 是碳价单位元/kg。将这个成本加入目标函数后优化器会自动权衡“多配光伏储能以减少购电”和“增加容量投资成本”之间的经济关系环境效益就不再是一句空话。另一种常见做法是设定碳排放上限约束\[ \sum_t E_{grid}(t) \cdot e_{grid} \sum_i \sum_t E_{DG,i}(t) \cdot e_{DG,i} \leq E_{CO2}^{\max} \]这个约束的最大问题在于需要事先确定 \(E_{CO2}^{\max}\) 的取值拍脑袋的风险很大。仿真对比下来我建议把碳排放惩罚放进目标函数而不是做成硬约束——惩罚系数的调节比硬约束阈值更平滑也更便于做灵敏度分析。3.3 储能系统在容量配置中的双重作用在多微网联合调度的容量配置里储能是唯一既可以“平移能量”又可以“提供备用”的设备它的建模精度直接影响配置结果。储能约束需要包括荷电状态SOC递推方程\(SOC(t1) SOC(t) P_{ch}(t)\eta_c \Delta t - \frac{P_{dis}(t)}{\eta_d} \Delta t\);充放电功率限制\(0 \leq P_{ch}(t) \leq P_{rated}\)\(0 \leq P_{dis}(t) \leq P_{rated}\)SOC上下限约束\(SOC_{min} \leq SOC(t) \leq SOC_{max}\)储能日始末SOC相等约束周期调度时\(SOC(T) SOC(0)\)保证储能不“透支”。这里有个细节很多人忽略储能的额定容量和额定功率是两个正交的决策变量分别对应能量维度kWh和功率维度kW。在容量配置中必须分开优化否则要么出现“功率够但容量不足、无法支撑长时放电”的尴尬要么出现“容量很大但功率受限、根本充不满”的浪费。4. 仿真环境搭建MATLABYALMIP求解器选型与参数设计4.1 为什么选MATLABYALMIP而不是其他组合两阶段鲁棒优化的仿真实现我试过几种技术路线。用PythonGurobi/Pyomo也能做但如果你是在校研究生或者电网研究院的工程师MATLABYALMIP是最稳妥的组合原因有三调试可视化方便MATLAB的矩阵调试和画图能力对检查约束是否写错、查看SOC曲线和功率分布非常友好YALMIP的底层约束管理成熟虽然YALMIP在建模大型MILP时速度不如Python的某些框架但对两阶段鲁棒这种需要反复迭代调用求解器的场景YALMIP的稳定性表现不错学术生态相关方向的公开代码和论文复现资料大部分用MATLAB遇到问题容易搜到答案。具体版本建议MATLAB R2020a及以上YALMIP最新版GitHub上维护频繁求解器用CPLEX 12.10或Gurobi 9.5。注意Gurobi在MATLAB环境下需要安装配套接口工具箱CPLEX则直接通过YALMIP调用相对省事。4.2 典型算例参数设计仿真参数设计是决定结果可信度的关键环节。下面给出一套我实测可以稳定收敛的典型参数可以直接抄作业参数项数值备注微网数量3微网1为工业负荷型微网2为商业负荷型微网3为居民负荷型调度周期24 h时间分辨率 1 h凑成24个时段方便日周期约束光伏单位容量投资成本4500 元/kW含安装、并网等综合成本风电单位容量投资成本6500 元/kW同上储能单位功率成本1500 元/kW对应PCS变流器成本储能单位容量成本1200 元/kWh对应电池本体成本主网购电电价峰1.2 / 平0.8 / 谷0.4 元/kWh分时电价引导储能套利天然气价格2.5 元/m³折合燃料成本约0.65元/kWh碳排放因子主网0.85 kg CO2/kWh取区域电网平均排放因子碳惩罚价格0.2 元/kg CO2可做敏感性分析范围0.05~0.5风光出力预测偏差上限±20%相对预测值的最大偏差负荷预测偏差上限±15%同上预算参数 \(\Gamma\)0~12按微网数量和时段数设定上限4.3 场景生成如何构造不确定性数据集两阶段鲁棒本身不需要场景它是连续不确定集上的 max-min 搜索。但仿真验证阶段你需要额外的蒙特卡洛场景来测试配置结果在“真实世界”中的表现。我建议用拉丁超立方抽样LHS生成500个测试场景每个场景包含24小时的光伏、风电和负荷曲线。生成方式以典型日曲线为基础叠加均值为0、标准差为预测值10%~15%的高斯扰动对扰动后的曲线做上下限截断避免出现负出力或超过装机容量的荒谬数据每个微网的负荷曲线按负荷类型叠加不同的相关系数——同一区域内微网的风光资源相关性很强相关系数取0.7~0.8负荷间相关性取0.3~0.5。这里的相关性设定直接影响联合调度的互补效果相关性越高联合调度节省的成本越少——因为大家同时缺电或同时富余互补空间被压缩。5. CCG主从迭代的完整实现与结果分析5.1 主问题与子问题的MATLAB代码骨架直接上一段我实测无误的代码骨架方便大家对照理解。主问题构建%% 定义主问题变量 x_cap sdpvar(3, n_mg); % 光伏容量决策变量 w_cap sdpvar(3, n_mg); % 风电容量决策变量 e_pow sdpvar(3, n_mg); % 储能额定功率 e_ene sdpvar(3, n_mg); % 储能额定容量 y sdpvar(n_mg, 24, 6); % 第二阶段运行变量集合随迭代次数增加 %% 主问题目标函数投资成本 确定的运行成本 objective sum(c_pv * x_cap, all) sum(c_wt * w_cap, all) ... sum(c_pcs * e_pow, all) sum(c_bat * e_ene, all) ... sum(operating_cost, all); %% 主问题约束投资变量约束 运行约束集合 Constraints [x_cap 0, w_cap 0, e_pow 0, e_ene 0]; Constraints [Constraints, e_pow r_max * e_ene]; % 功率容量匹配 % ... 在这里添加全部运行约束包括功率平衡、联络线约束、SOC递推等子问题求解时最核心的是强对偶转化。我给出内层 LP 对偶转化的关键代码逻辑%% 子问题max-min 结构 % 内层 min 问题变量 y_dispatch % 写出内层问题的对偶问题假设是LP dual_constr [...]; % 对偶可行性约束 dual_obj [...]; % 对偶目标函数 % 合并为单层 max 问题 SP_obj dual_obj; % 最大化对偶目标 SP_constr [dual_constr, uncertainty_set_constr]; % 用Big-M线性化对偶变量与不确定量的乘积项5.2 迭代收敛过程的图表解读采用CCG算法迭代时需要注意监测主问题下界LB、子问题上界UB和间隙Gap。典型迭代曲线表现为第1次迭代主问题只含初始场景下界很低子问题找到第一个“比较恶劣”的场景上界很高间隙往往在30%以上第2~3次迭代加入新场景后下界快速上升间隙迅速收窄到10%以内第4~6次迭代间隙进入1%以内满足收敛条件算法终止。如果你的迭代次数超过15次还没有收敛大概率不是算法问题而是模型里有病态约束或者Big-M参数选得太大。这个我在下面的避坑部分会展开讲。5.3 容量配置结果的经济性与环境效益对比以我跑通的算例为例确定性模型给出的配置结果是光伏总容量12.5 MW、风电5.8 MW、储能6.2 MWh。而鲁棒模型\(\Gamma6\)给出的配置结果是光伏13.2 MW、风电6.5 MW、储能9.8 MWh。可以看到鲁棒模型的储能容量比确定性模型高出近58%这是“最坏场景”倒逼出来的冗余光伏和风电的配置量也略有增加但不如储能增幅明显原因是风光资源“最坏同时发生”的可能性在预算不确定集下有所限制在500个蒙特卡洛场景的验证中确定性配置有37个场景出现切负荷而鲁棒配置的切负荷场景数为0鲁棒配置的年化总成本比确定性配置高出约9.2%但考虑切负荷惩罚和碳排放罚款后实际全生命周期成本反而更低。这个结果非常有说服力——两阶段鲁棒优化不是简单地“花钱买保险”它在极端场景出现的概率被人为抬高时反而能体现出更高的综合经济性。6. 仿真实践中的关键坑与调试经验6.1 子问题对偶转化不满足强对偶条件这是两阶段鲁棒仿真中最容易翻车的点。内层 min 问题如果包含整数变量比如机组启停状态、或者存在等式约束导致对偶问题无界强对偶就不成立转化出的单层问题会直接报错或者给出荒谬结果。解决办法如果运行层确实需要整数变量就不要用强对偶转化改用KKT条件或者直接枚举极端场景当不确定参数只有偏差率时最坏场景往往在盒式边界上取到。我实际测试过对于纯连续变量的第二阶段问题强对偶转化效率和稳定性都很好一旦引入机组启停0/1变量求解时间直接翻好几倍而且Big-M参数如果不合适很容易出现对偶间隙不收敛。6.2 Big-M参数选择导致的数值病态Big-M法是线性化双线性项的常用手段但M值的选择极其讲究。M取太小会把可行域错误压缩导致最优解失真M取太大求解器内部数值会出问题LP求解精度下降CPLEX还经常蹦出“infeasible or unbounded”的提示。我个人的经验做法先用确定性模型跑一遍把所有对偶变量和不确定变量的量纲摸清然后按量纲的10~100倍设定M初值。如果求解过程出现数值异常优先把M逐级减小到正常范围的3倍左右而不是一开始就给一个巨大的数。6.3 不确定集预算范围选择前面提到 \(\Gamma\) 的选取影响模型保守程度但很少有人讲 \(\Gamma\) 应该按什么尺度取。我这里是按“总时段内最大允许偏离的总次数”来定义 \(\Gamma\)。比如24个时段每个时段有3个微网的光伏和风电共6个不确定参数那么 \(\Gamma12\) 意味着“最多有一半的时段/场次出现极端偏差”。这个设定要结合历史数据的相关性来调整——如果各微网地理位置较近\(\Gamma\) 应该取小一点因为大家同涨同跌如果位置分散\(\Gamma\) 可以取大一些。6.4 联络线功率方向的处理技巧在多微网联合调度中微网间交换功率如果定义为一个有正负的变量目标函数里做绝对值或者分段计价会很麻烦。我的习惯是拆分成两个非负变量微网i向j输出的功率和微网j向i输出的功率二者互斥用约束 \(P_{ij}^ \cdot P_{ij}^- 0\) 或Big-M限制。这样既方便在目标函数中写交易电价也方便做潮流方向约束。不过要注意加了互斥约束后模型变成非凸需要谨慎处理如果运行成本中允许双向同价其实可以去掉互斥约束让求解器自动选择——这样模型保持线性收敛更快结果也不会出现同时双向送电的荒谬情况。7. 参数敏感性分析与方案扩展思路7.1 碳价对容量配置的影响趋势环境效益的核心就是碳价。我在算例中把碳价从0.05元/kg扫到0.5元/kg步长0.05观察容量配置的变化趋势碳价在0.05~0.15元/kg区间光伏和风电装机量变化不大储能配置小幅上升碳价超过0.2元/kg后光伏装机量开始显著增加风电次之储能容量的提升也开始加速——原因是高碳价使火电/网购电成本大幅上升可再生能源的替代效益凸显碳价达到0.4元/kg以上时模型倾向于把所有可利用的屋顶和空地都铺满光伏这种“极限配置”下储能成为系统平衡的唯一灵活资源容量接近上限约束。这个敏感性分析对政策制定者和投资方都很有参考价值——碳价政策需要对“适度区间”做出引导过高会推高用电成本过低则无法刺激新能源投资。7.2 负荷曲线形态对联合调度效益的影响不同负荷形态的多微网联合调度互补效益差异很大。我的仿真设置了三种负荷形态组合组合方式联合调度相比独立调度的成本节省三个同类负荷微网2.1%工业商业居民混合6.8%高光伏高负荷错峰11.3%原因很好理解同类负荷峰谷时段高度重合联合调度基本没有互补空间而混合负荷下工业负荷的夜间高需求恰好可以消纳居民微网的夜间风电出力商业负荷的白昼高峰又和光伏出力匹配联合调度相当于做了一个“虚拟大电网”把各自的富余和缺口撮合在一起。7.3 从“两阶段”到“多阶段”的扩展方向两阶段鲁棒假设所有不确定性在第二阶段开始时一次性实现但实际运行中风光出力是逐时变化的决策者也在不断滚动调整调度方案。因此更精确的做法是采用多阶段自适应鲁棒优化或模型预测控制MPC与鲁棒优化结合。我在项目后续工作中尝试了“日内滚动日前鲁棒”的混合框架日前阶段用两阶段鲁棒确定各机组启停和储能日前计划保证最坏情况可行日内阶段每15分钟滚动更新一次用MPC校正各微源出力把最新预测信息用起来。这个框架在仿真中表现很好——日前鲁棒保证了“底线安全”日内滚动拉回了经济性两全其美。缺点是模型复杂度和求解时间明显增加对算力要求较高工程落地需要权衡。多微网联合调度和容量配置这个方向理论门槛和工程难度确实都在但只要你把不确定集、CCG求解逻辑和运行约束这三块啃下来剩下的就是大量的仿真调试和经验积累。在实际项目中我最大的体会是鲁棒优化给出的容量配置结果看着“冗余”但在真正的极端天气面前这份冗余换来的运行安全和低碳效益远比纸面上省下来的投资成本值钱。希望这篇能把两阶段鲁棒优化的建模到仿真全链路讲透对正在做微网规划、储能配置或者综合能源系统设计的朋友有个实实在在的参考。