融合混合不确定性与鲁棒协同优化的风光储微电网容量规划方法

融合混合不确定性与鲁棒协同优化的风光储微电网容量规划方法 风光储微电网容量规划在很多实际项目中并不是一次简单的“选风机、选光伏板、选电池”任务。真正困难的是风电和光伏出力天然波动负荷也有随机性而储能容量又直接影响运行策略的灵活性。如果只按典型日曲线做确定性规划项目投运后遇到连续阴雨天或极端风况很可能出现容量不足、弃风弃光、甚至供电可靠性不达标。近几年工程上开始把“混合不确定性鲁棒协同优化”作为容量规划的建模思路就是为了让容量配置在面对不确定环境时仍具备足够鲁棒性。本文围绕“风光储微电网容量规划的混合不确定性鲁棒协同优化”这条技术主线展开适合三类读者一是正在做微电网、分布式能源项目方案设计的工程师二是研究鲁棒优化、随机优化但缺乏工程落地视角的研究生三是在电力系统数字化项目中需要把优化模型落成代码的开发人员。读完本文可以理解混合不确定性建模的思路、两阶段鲁棒优化的数学表达、CCG算法的求解骨架以及用Python实现并验证一个最小案例的方法。1. 为什么风光储容量规划必须处理“不确定性”和“协同”两个难点1.1 容量规划不只是“选几块组件”先明确问题边界风光储微电网的容量规划通常指在给定场地资源、负荷需求、电网接入条件和投资预算的前提下决定风电装机容量、光伏装机容量、储能系统额定容量和功率等级使得系统在全生命周期内的总成本最小同时满足供电可靠性要求。传统做法是取几个“典型日”的风速、光照、负荷曲线建立线性规划或混合整数线性规划模型求出一组最优容量。这种做法的前提是典型日能代表全年运行情况。但工程环境里风速可能连续几天低于切入风速光伏可能因为雾霾或阴雨持续低出力负荷也可能因生产计划调整出现尖峰。典型日方法对这些极端但真实发生的场景几乎没有约束力规划结果容易偏乐观。因此容量规划这个问题的边界不只是“容量选多大”还包括“在什么运行场景下还能满足可靠性”。这决定了建模时不能只用单点预测值而要把不确定性显式写进优化模型。1.2 确定性规划的局限典型日不能代表所有天气确定性规划的典型做法如下取一年8760小时数据用聚类算法提取几个典型日每个典型日包含24小时的风速、光照、负荷曲线然后优化容量。优点是模型规模小、求解快、结果直观。局限也很明显。聚类出来的典型日本质上是“平均场景”或“高频场景”极端低风、极端高负荷场景会被聚到边缘或直接过滤掉。而容量规划恰恰要为这些极端场景留出裕量否则投运后无法应对。另一个问题是典型日方法无法量化“最坏情况下的运行成本或失负荷量”也就无法回答“如果最坏场景发生了系统到底会怎样”。这里要特别说明否定典型日方法不代表完全抛弃它。工程上更稳妥的做法是把典型日作为参考场景同时额外加入一组不确定性集合覆盖极端场景两者协同求解。这就是混合不确定性建模的出发点。1.3 混合不确定性到底指什么概率场景与不确定集并存“混合不确定性”在风光储容量规划中通常有两层含义。第一层一部分不确定性可以用历史数据描述出分布特征例如负荷在某个季节的波动范围、光伏出力在晴天的随机波动。这类不确定性适合用有限场景集合表达也就是随机规划里的“场景法”。场景法能利用历史数据给出相对精细的概率描述但需要足够多的场景才能稳定模型规模会随之增大。第二层另一部分不确定性很难准确估计概率分布例如极端天气下的风电出力下限、设备检修导致的出力缺失、突发负荷尖峰。这类不确定性更适合用区间不确定集或盒式不确定集表达即给定每个不确定参数的上限和下限优化模型在所有参数落在集合内时都能满足约束。这就是鲁棒优化处理的部分。把两者结合就形成了“混合不确定性”模型一部分用场景描述一部分用不确定集描述。这样既保留历史数据信息又对未知极端情况提供保护。1.4 协同优化为什么重要储能容量必须跟运行策略一起算“协同”这个词在项目标题里出现指向的是一个工程事实储能容量不能单独离线确定它和运行策略强耦合。举例来说如果风光的预测出力高储能可以少配依靠弃风弃光来平衡如果运行策略允许储能深度充放电那么同样的储能容量可以支撑更多削峰填谷如果允许一定比例的失负荷储能容量又可以降低。反过来储能容量选择不同运行策略的可行域也不同。这就是容量与运行的协同优化在同一个模型里容量决策变量决定投资成本运行策略决定运行成本和可靠性两个层次互相耦合。如果分开做比如先按经验定储能容量再做运行优化大概率出现两种情况一种是为了满足可靠性过度配置储能投资浪费另一种是运行策略过于保守导致风光利用率不足。协同优化的价值就是把这两层放在一个目标函数里统一决策用数学方式寻找“投资-运行”全局最优解。2. 建模第一步把容量规划写成两阶段优化问题2.1 两阶段结构先投资、后运行风光储容量规划的自然决策顺序是先决定建设哪些容量再在运行中根据实际风速、光照、负荷决定储能充放电、是否弃风弃光、是否需要切负荷。这种“先决策、后运行”的结构非常适合建模为两阶段优化问题。第一阶段决策变量是容量规划变量包括风电装机容量 W、光伏装机容量 P、储能额定容量 E 和储能功率上限 P_ess。这些变量在项目建设时确定不受未来不确定性影响因此也叫“here-and-now”决策。第二阶段决策变量是运行变量包括每个时段的储能充电功率、放电功率、弃风量、弃光量、切负荷量等。这些变量依赖不确定参数的具体实现因此也叫“wait-and-see”决策。第二阶段的目标是在给定容量配置和给定不确定性实现下最小化运行成本或最大化运行收益。两阶段模型的标准形式为第一阶段问题min 投资成本 第二阶段期望或最坏运行成本约束包括总投资预算、每个容量的上下限、非负约束。第二阶段问题在风速、光照、负荷实现已知后求解满足功率平衡、储能SOC状态、充放电功率限制等约束的最优运行方案。2.2 目标函数年化投资成本 运行成本容量规划的目标函数一般写成年度化形式。投资成本通常是一次性投入需要按项目寿命和折现率折算成等年值。这里给出一个常用的目标函数结构min C_inv(W, P, E, P_ess) C_ope C_loss其中C_inv 是年化投资成本包括风电单位容量成本乘以 W、光伏单位容量成本乘以 P、储能单位容量成本乘以 E、储能功率成本乘以 P_ess。不同设备的使用寿命不同折算时要注意。C_ope 是运行维护成本通常按发电量或容量比例估算。C_loss 是失负荷惩罚成本也就是切负荷量乘以单位惩罚电价。这个成本是可靠性约束的另一种表达方式。如果不是并网微电网而是离网微电网目标函数中通常会加入失负荷惩罚作为软约束因为完全不允许失负荷会导致容量配置过大、经济性很差。如果是并网型微电网还需要考虑向电网购电和售电的电价。目标函数的取舍要特别说明把失负荷惩罚放进目标函数而不是作为硬约束是为了让模型在“多花钱提高可靠性”和“少花钱但偶尔切负荷”之间做经济权衡。工程上这个惩罚电价很多项目直接取被切负荷的电价或单位GDP损失但如果没有明确数据可以用一个相对较高的值并做敏感性分析。2.3 约束条件功率平衡、储能SOC、容量上限第二阶段的运行约束至少需要包含以下四类。第一类是功率平衡约束每个时段 t 内风电出力、光伏出力、储能放电功率、电网购电功率之和等于负荷、储能充电功率、弃风弃光量、电网售电功率之和。如果不允许弃风弃光或购售电对应项可以直接设为0。第二类是储能SOC动态约束SOC_{t1} SOC_t 充电功率*效率 - 放电功率/效率并且每个时段的SOC要在[0, E]范围内。运行周期结束时的SOC通常要求恢复到初始值否则模型会把储能“用空”来降低成本这是一个常见的建模漏洞。第三类是储能功率约束每个时段的充放电功率不能超过储能功率上限。同时充放电不能同时进行这个约束在混合整数模型里用二值变量表达如果为了求解速度采用线性松弛则要接受一定误差。第四类是容量上限约束每个时段的实际风电出力不能超过当前容量乘以该时段的可用出力系数光伏同理。这个约束是不确定参数与容量决策变量耦合的核心也是鲁棒优化中最容易出现“悲观解”的地方。2.4 混合不确定性的统一表达场景 区间不确定集在实际建模时很多项目把混合不确定性写成如下结构对于负荷预测偏差、光伏短期波动这类有历史数据支撑的参数用 K 个典型场景表示每个场景 s 有一组参数值和一个概率 p_s。对这些场景模型要求第二阶段约束在“期望意义”或“每个场景”下满足。对于极端低风速、极端高负荷这类难以准确建模的参数用区间不确定集表示eta_w 属于 [eta_w_min, eta_w_max]eta_p 属于 [eta_p_min, eta_p_max]eta_l 属于 [eta_l_min, eta_l_max]。其中 eta_w 是风电实际出力系数相对于额定容量的比例eta_p 类似eta_l 是负荷倍率。模型要求对于不确定集内任意一组参数取值第二阶段优化都存在可行解并且失负荷量不超过规定上限。这就是鲁棒约束的核心含义。“混合”体现在模型里就是场景变量参与随机规划部分的期望成本优化不确定集变量参与鲁棒约束的最坏情况校验。同一个模型里既包含概率信息又包含最坏情况保护所以叫混合不确定性鲁棒优化。这里要提醒如果场景集合和不确定集描述的其实是同一类参数的两种表达组合使用会带来重复保守。使用前需要先判断哪些参数适合场景化哪些参数适合区间化否则模型会变得过于保守。3. 鲁棒协同优化的求解路线CCG算法骨架3.1 为什么不能直接交给常规求解器两阶段鲁棒优化问题直接求解很困难因为第二阶段是一个“给定第一阶段的容量后在不确定集内找最坏情况运行成本”的优化问题它的目标函数和约束都嵌套在第一阶段问题里。普通线性规划求解器只能处理单一层的优化问题无法直接处理这种双层嵌套结构。工程上常用的方法是列与约束生成算法Column and Constraint Generation简称 CCG也叫“割平面法”。它的核心思路是先假设只有少量关键场景求解一个规模较小的主问题然后用主问题得到的容量配置去求解第二阶段最坏场景子问题如果子问题发现一个更坏的场景就把这个场景对应的变量和约束加入主问题继续求解。不断重复直到容量配置和运行成本都收敛。相比Benders分解CCG在第二阶段为连续变量时往往收敛更快生成的割约束质量更高。这也是目前两阶段鲁棒优化在电力系统中应用最广泛的求解算法之一。3.2 CCG主流程CCG的总体流程可以写成以下步骤初始化设置一个初始场景集合可以只包含一个典型场景设置迭代次数 k0设置上界 UBinf下界 LB-inf。求解主问题MP主问题包含容量变量、运行变量、辅助变量 theta以及已经识别出的关键场景对应的运行约束。求解得到容量决策和 theta得到下界 LB。固定容量决策求解子问题SP子问题在完整不确定集内搜索最坏场景求解最坏运行成本。如果子问题不可行需要生成可行性割如果子问题可行用最坏运行成本更新上界 UB。判断 UB - LB 是否小于收敛阈值。如果是输出当前容量配置如果不是把子问题找到的最坏场景和最优解对应的新变量加入主问题生成新的约束kk1回到步骤2。这个流程的文字描述看起来简单但实现时每个环节都有大量工程细节尤其是子问题求解、割约束生成、收敛判据。3.3 主问题MP和子问题SP的作用主问题MP在第一阶段容量决策的基础上只考虑已经枚举出来的有限场景因此规模小、求解快。它给整个迭代过程提供下界因为主问题只考虑部分场景实际可以找到更便宜的解所以主问题的最优值是一个下界。子问题SP固定容量变量在完整不确定集内搜索最坏情况。它给整个迭代过程提供上界因为容量已经固定子问题求出的最坏运行成本对应一个真实可行的容量方案所以它是一个上界。如果子问题搜索到的最坏场景已经包含在主问题中说明当前方案的运行成本在不确定集内被完全覆盖可以收敛。主问题与子问题交替求解本质上是用“识别关键场景”代替“枚举所有场景”。这比直接枚举所有极端组合高效得多尤其当不确定参数维度较高时枚举组合数会爆炸增长而CCG往往只需要十几到几十轮迭代。3.4 收敛判断与保守度控制CCG的收敛判断通常用上界与下界的相对间隙来判断例如 (UB - LB) / UB epsilonepsilon 常见取 1e-3 到 1e-2。工程上还要设置最大迭代次数防止出现无法收敛的问题。保守度控制是鲁棒优化在工程落地时最容易争吵的地方。区间不确定集的范围越大得到的容量配置越保守投资成本越高。为了让结果不过度保守通常在不确定集中引入预算参数 Gamma限制“最坏情况下同时出现的极端参数个数”。例如风电、光伏、负荷三个不确定参数不可能同时处于最坏值Gamma 取 1 表示只允许其中一个取到最坏值其他取预测值。Gamma 取 0 表示退化为确定性问题Gamma 取参数数量表示最保守情况。通过调整 Gamma可以在鲁棒性和经济性之间找到工程可接受的平衡点。这里需要注意Gamma 参数针对的是“不确定参数在集合内同时取极端的程度”不是所有项目一开始就会使用。如果项目前期数据有限可以先从固定区间和 Gamma 的敏感性分析开始不必一开始就上很复杂的“多面体不确定集”。4. 代码实现用Python写出算法骨架4.1 环境准备和依赖实现两阶段鲁棒优化的代码通常需要以下工具工具用途说明Python 3.8主开发语言推荐 3.10 及以上版本NumPy数据处理、数组运算基础依赖Pyomo 或 Gurobi/PuLP数学建模与求解Pyomo 是建模框架底层需要求解器Gurobi 或 HiGHS线性规划求解学术版可用 Gurobi开源可选 HiGHSMatplotlib结果可视化用于画容量配置和成本对比图如果没有商业求解器可以使用 Pyomo HiGHS 或 PuLP CBC 的组合完成教学示例。但要注意完整的两阶段鲁棒优化项目通常需要混合整数规划求解能力开源求解器在规模较大时性能差距明显。生产项目建议先确认许可证和求解器预算。安装依赖示例pip install numpy pyomo highspy matplotlib如果使用 Gurobi 求解器需要单独下载并配置许可证具体版本以官方文档为准。4.2 数据结构设计在正式写 CCG 之前先用一个简化示例说明“鲁棒容量规划”的数据结构和验证思路。下面的代码演示一个非常简化的场景候选容量组合只有有限的几组每组容量配置都要在所有不确定场景下做运行验证取最坏场景的运行成本然后计算总成本。这个示例不是完整的CCG但可以让人理解“容量决策 最坏场景运行成本”的组合关系。import numpy as np # 候选容量组合每组为 (风电容量, 光伏容量, 储能容量) candidate_capacity np.array([ [100, 200, 50], [150, 200, 100], [200, 250, 150], ]) # 单位容量成本简化为固定值 cost_wind 5000 # 元/kW cost_pv 3000 # 元/kW cost_storage 2000 # 元/kWh shed_penalty 20000 # 元/MWh失负荷惩罚 # 不确定场景不同风光出力系数和负荷倍率 scenarios [ {wind_factor: 0.2, pv_factor: 0.1, load_factor: 1.2}, {wind_factor: 0.8, pv_factor: 0.9, load_factor: 0.9}, {wind_factor: 0.5, pv_factor: 0.5, load_factor: 1.0}, ] # 两个时段的基准负荷MW base_load np.array([100, 150]) def run_operation(capacity, scenario): 在给定容量和场景下计算最小失负荷量。 示例中只做了非常近似的功率平衡核算 实际项目应使用线性规划求解储能充放电和弃风弃光。 wind_factor scenario[wind_factor] pv_factor scenario[pv_factor] load_factor scenario[load_factor] W, P, E capacity wind_power wind_factor * W / 1000 # 折算成MW pv_power pv_factor * P / 1000 shed 0.0 for t in range(len(base_load)): load base_load[t] * load_factor if wind_power pv_power load: shed load - wind_power - pv_power return shed for cap in candidate_capacity: W, P, E cap inv_cost W * cost_wind / 1000 P * cost_pv / 1000 E * cost_storage / 1000 worst_shed max(run_operation(cap, s) for s in scenarios) total_cost inv_cost worst_shed * shed_penalty print(f容量 W{W}, P{P}, E{E} - 投资成本{inv_cost:.2f}, f最坏失负荷{worst_shed:.2f}MWh, 总成本{total_cost:.2f})这段代码把问题压缩到了最简形式只考虑功率能不能覆盖负荷忽略了储能充放电时序、SOC约束、弃风弃光等细节。实际项目里run_operation应替换成一个完整的线性规划模型求解目标为最小运行成本并把风电出力、光伏出力、储能充放电、切负荷量都作为决策变量。这里的代码只用于说明“枚举候选容量 最坏场景校验”的鲁棒思路。4.3 主问题与子问题的简化实现下面给出 CCG 主循环的伪代码。它不依赖具体求解器适合理解算法流程。# 伪代码两阶段鲁棒优化 CCG 主循环 def solve_ccg(): # 初始化 critical_scenarios [initial_scenario] LB -float(inf) UB float(inf) max_iter 50 tolerance 1e-3 for k in range(max_iter): # 1. 求解主问题在 critical_scenarios 中寻找最优容量配置 capacity, theta_value solve_master_problem(critical_scenarios) LB theta_value # 主问题目标值简化表达 # 2. 固定容量求解子问题在完整不确定集内寻找最坏场景 worst_scenario, worst_operation_cost solve_sub_problem(capacity) # 3. 更新上界 invest_cost compute_invest_cost(capacity) UB min(UB, invest_cost worst_operation_cost) # 4. 收敛判断 if UB - LB tolerance * abs(UB): return capacity, UB, LB, k # 5. 把最坏场景加入主问题生成新的变量和约束 critical_scenarios.append(worst_scenario) return capacity, UB, LB, max_iter伪代码省略了大量细节最核心的两点在solve_master_problem和solve_sub_problem中。solve_master_problem需要为每个已识别的关键场景引入一组运行变量例如储能充放电功率、SOC、切负荷量并把这些场景对应的约束加入模型。每次迭代新增一个场景的一组变量所以主问题规模会逐步变大。solve_sub_problem需要固定容量变量后在不确定集内最大化运行成本。工程实现上子问题往往是一个“max-min”双层问题需要借助强对偶理论或KKT条件转化为单层混合整数线性规划问题来求解。这一步是整个CCG实现中最容易出错的地方。为了降低理解门槛实际教学中可以先不用完全对偶而是枚举不确定集的顶点场景作为“候选最坏场景”。如果顶点数量不多可以直接求解每个顶点场景的运行成本取最大值作为最坏成本。顶点枚举法只能用于小规模教学生产模型中不确定集维度稍高顶点组合就会爆炸这时必须用对偶或KKT方法。4.4 用 Pyomo 建模两阶段问题的关键片段以下代码展示用 Pyomo 建模一个简单两阶段鲁棒容量规划问题的关键片段。它不是一个完整可运行项目而是给出建模思路和常见接口用法。import pyomo.environ as pyo model pyo.ConcreteModel() # 不确定场景集合实际项目由场景生成模块提供 model.scenarios pyo.Set(initialize[1, 2, 3]) # 时段 model.T pyo.Set(initializerange(24)) # 第一阶段变量容量 model.W pyo.Var(withinpyo.NonNegativeReals, bounds(0, 500)) model.P pyo.Var(withinpyo.NonNegativeReals, bounds(0, 500)) model.E pyo.Var(withinpyo.NonNegativeReals, bounds(0, 300)) # 辅助变量 theta用于表示最坏运行成本 model.theta pyo.Var(withinpyo.Reals) # 第二阶段变量按场景索引 model.charge pyo.Var(model.scenarios, model.T, withinpyo.NonNegativeReals) model.discharge pyo.Var(model.scenarios, model.T, withinpyo.NonNegativeReals) model.shed pyo.Var(model.scenarios, model.T, withinpyo.NonNegativeReals) # 目标函数投资成本 最坏运行成本代理变量 theta def objective_rule(m): return 5000 * m.W 3000 * m.P 2000 * m.E m.theta model.objective pyo.Objective(ruleobjective_rule, sensepyo.minimize) # 关键约束对每个场景theta 要大于等于该场景的运行成本 # 这里运行成本简化为失负荷惩罚 def theta_constraint_rule(m, s): return m.theta 20000 * sum(m.shed[s, t] for t in m.T) model.theta_constraint pyo.Constraint(model.scenarios, ruletheta_constraint_rule)这段代码体现了 CCG 主问题建模的核心思想每识别出一个关键场景就为它增加一组运行变量并通过theta 该场景运行成本把最坏运行成本嵌入目标函数。实际项目中每个场景还需要独立的功率平衡约束、储能SOC约束、风电光伏出力上限约束这些约束都要按场景和时段展开。要特别提醒上面代码中的成本系数只是示例实际项目中要以可研报告、设备询价或历史运维数据为准。不要把示例参数直接用于生产测算。5. 怎么验证和评估结果5.1 用历史极端场景验证鲁棒解容量规划模型求解完成后不能只看目标函数值就收工。工程上必须做“极端场景回验”把模型没有直接使用的历史极端天气、极端负荷数据拿出来固定容量配置重新求解运行模拟看是否出现失负荷、储能越限、功率不平衡等问题。回验的典型做法包括选取过去5到10年内风速最低、光照最差的连续3天。选取负荷最高且风电出力为零的24小时。选取连续多日阴雨天叠加负荷高峰的组合。如果回验失败需要检查是容量配置不足还是储能运行策略不够激进还是不确定集范围设置偏小。回验结果应该作为容量方案评审材料的一部分而不是仅仅依赖模型输出的最优值。运行验证通过的标准可以设置成最坏场景下失负荷率不高于目标值、储能SOC不越限、所有线路功率不超过上限。这些指标最好做成一张检查表逐项确认。5.2 对比确定性模型和鲁棒模型评估鲁棒优化的价值最直接的办法是与确定性模型做对比。指标确定性模型鲁棒优化模型典型日场景下总成本通常更低略高最坏场景下失负荷量可能很大接近0或不超过阈值储能配置容量往往偏小往往偏大对极端场景的适应能力弱强求解时间快慢用两组模型跑同一套基础数据后把结果放进表格就能看到“经济性”和“鲁棒性”的权衡。工程决策时不能只看总成本低就选确定性模型也不能只看鲁棒性就选最保守配置。现在比较通用的做法是计算多组 Gamma 取值下的容量配置和总成本画出帕累托曲线让决策者根据风险偏好选择。5.3 需要关注的指标容量规划项目建议至少展示以下指标总等年值成本包括投资成本、运维成本、失负荷惩罚成本。风电、光伏、储能的容量配置结果。最坏场景下的失负荷率LOLP相关指标。风光消纳率即风光实际发电量占可发电量的比例。储能利用率包括充放电循环次数、日利用小时数。求解时间、迭代次数、上下界间隙用于评估算法本身。这些指标要放到项目报告的结论部分不能只给一组容量数字。决策者需要知道多出来的储能容量到底解决的是哪个极端风险为此多花了多少钱换来了什么可靠性提升。6. 常见问题排查与实践建议6.1 为什么求解时间很长两阶段鲁棒优化模型求解慢通常有以下原因现象常见原因检查方式处理建议每次迭代都很慢主问题场景太多变量规模过大查看主问题统计场景数、变量数、约束数减少初始场景用更紧凑的不确定集启用求解器预求解迭代次数很多子问题发现大量新场景割约束生成不够紧查看每轮UB和LB变化曲线改用更强对偶割增加预算参数 Gamma 控制不确定集子问题本身慢子问题是不连续或混合整数问题检查子问题是否引入了大量二值变量尽量保持子问题为连续线性规划用对偶化处理 max-min如果模型规模实在太大可以考虑先用确定性模型求出近似容量再在鲁棒模型里把容量变量上下界收紧缩小搜索空间。但这种方法会损失一定最优性需要在报告中说明。6.2 为什么鲁棒解过于保守鲁棒解过于保守的常见原因是不确定集设置过宽、多个不确定参数同时取极端、没有使用预算参数 Gamma。修正办法包括基于历史数据分析不确定参数的上下限去掉明显不合理的边界值。引入预算参数限制同一时段最多有几个参数取极端值。把部分参数从“区间鲁棒”改成“场景随机”减少不确定集维度。对储能容量等决策变量做敏感性分析找出鲁棒性成本最高的参数逐项判断是否值得保护。最容易犯的错误是为了让模型“绝对可靠”把每个不确定参数的区间拉得非常大结果最优容量全部堆到储能和风电上成本不可接受。工程上不应该追求“零失负荷”而应该追求“在可接受成本下的目标失负荷率”。6.3 场景数和不确定集边界如何选择场景数和不确定集边界是建模阶段必须回答的问题。场景数的选择没有固定公式常见做法是从历史数据中用 K-means 或场景缩减算法提取 5 到 20 个典型场景先观察成本随场景数的变化曲线取变化趋缓的位置作为场景数。如果场景太少随机部分的代表性不足如果场景太多模型规模上升但收益不明显。不确定集边界建议从历史数据的 5% 和 95% 分位数开始设置再结合工程设计规范中的极端工况调整。不要一开始就用 min max因为极端边界往往由噪声数据主导会把鲁棒模型带偏。不确定参数边界建议说明风电出力系数5%到95%分位数或按最低出力保证值受季节影响大建议分季节建模光伏出力系数5%到95%分位数阴雨天与晴天差异大负荷倍率95%分位数或历史尖峰负荷重点保护尖峰时段电价按市场出清价波动范围离网项目可以不考虑6.4 学习环境与生产环境的差异学习阶段跑通模型和生产项目落地差别很大。这里列几个关键差异学习阶段可以用 24 时段、3 个场景的小模型生产阶段往往是 8760 小时或 8760 小时聚合后的几百个典型小时段场景规模相差一个量级以上。学习阶段可以直接用采样平均值代替随机波动参数的分布生产阶段需要严格的历史数据清洗、场景生成、场景缩减流程。学习阶段可以忽略求解时间生产阶段必须评估每日滚动求解的运行时间必要时用启发式算法或分解算法加速。学习阶段可以不写数据接口生产阶段容量规划模型通常要和天气预报系统、负荷预测系统、SCADA 系统对接。建议先在一个小算例上完整实现 CCG验证上下界收敛然后再扩展到真实数据。直接拿全量数据调模型一旦不收敛很难判断是算法问题还是数据问题。6.5 容量规划项目检查清单以下清单可以用于项目交付前的自检也可以作为新团队接手类似项目的参考是否明确了规划边界包括并网/离网、允许失负荷率、项目寿命期。是否对风光资源数据做了清洗和季节性划分。是否明确哪些不确定性参数用场景建模哪些用不确定集建模。是否设置了预算参数 Gamma并且做了敏感性分析。储能模型是否包含SOC动态约束和周期末SOC恢复约束。是否同时考虑投资成本和运行成本而不是只追求初始投资最低。是否用历史极端场景回验了最优容量配置。是否记录了求解时间、迭代次数、上下界间隙用于评估算法稳定性。是否对比了确定性模型和鲁棒优化模型的经济性与可靠性。是否明确说明模型参数的来源避免把示例参数当作真实成本数据。这份清单不一定能覆盖所有项目细节但可以作为容量规划模型从“数学上可解”走向“工程上可用”的最小检查项。风光储微电网容量规划的双层耦合本质决定了它不能靠拍脑袋定容量也不能靠一次确定性优化覆盖所有风险。混合不确定性鲁棒协同优化提供了一条主线用场景法吸收历史数据中的概率信息用不确定集保护难以建模的极端工况再用 CCG 算法把两阶段问题拆成主问题和子问题交替求解。理解这个框架之后下一步可以往三个方向延伸一是把年度8760小时数据做场景缩减提升随机部分的代表性二是用多面体不确定集和预算参数精细控制鲁棒保守度三是把全年多时段运行优化改成滚动时域策略让容量规划与实时调度衔接起来。对新手而言最有价值的练习不是直接套用现成代码而是从最小两阶段模型开始逐步加入储能SOC、不确定性集合、割约束亲眼观察上下界如何收缩才能真正掌握这套方法。