风光储微电网容量规划,本质上回答一个问题:在一个区域内,风机、光伏和储能分别装多少容量、按什么比例配置,才能在满足供电可靠性的前提下,让全生命周期的经济成本最低。这个问题听起来像是常规的优 化问题,但当风电、光伏出力的随机性,与负荷预测误差、极端天气事件、电价波动这些混合不确定性叠加之后,问题就变成了一个典型的“混合不确定性下的两阶段鲁棒协同优化”问题。这也是为什么普通的确定性规划方法在工程落地时经常出现配置偏差——不是算法写错了,而是不确定性没有被结构化建模。
这次我们看的项目,就是围绕“风光储微电网容量规划”展开的混合不确定性鲁棒协同优化方案。它的核心不是简单的容量计算,而是把源-网-荷-储的协同关系、规划层与运行层的双层决策、随机场景与鲁棒边界结合起来,求解一套兼顾经济性与鲁棒性的容量配置结果。如果你正在做微电网规划、综合能源系统优化、储能容量配置,或者需要把鲁棒优化方法落地到实际工程项目,那这篇文章可以直接收藏。
本文会带你把下面几件事做一遍:第一,梳理风光储微电网容量规划中混合不确定性的来源和建模方式;第二,建立一套两阶段鲁棒协同优化的数学模型;第三,给出C&CG列约束生成算法的求解流程;第四,用Python+Pyomo+Gurobi写一个可运行的最小实现框架;第五,讲清楚仿真验证中如何设计对比实验、观察收敛、定位不可行问题。
1. 核心能力速览
先给一张表,把项目解决的问题和能力边界说清楚。
| 能力项 | 说明 |
|---|---|
| 项目类型 | 微电网容量规划 / 鲁棒优化算法框架 |
| 核心决策 | 风电、光伏、储能的容量配置与功率分配 |
| 不确定性来源 | 风光出力随机性、负荷波动、预测误差、极端场景 |
| 建模方法 | 两阶段鲁棒优化 + 随机场景耦合,形成混合不确定性模型 |
| 协同维度 | 源-网-荷-储协同、规划-运行协同、多时间尺度协同 |
| 求解框架 | C&CG列约束生成 / Benders分解 / 商用求解器迭代求解 |
| 推荐工具链 | Python + Pyomo + Gurobi/MindOpt,或 MATLAB + YALMIP + CPLEX |
| 硬件要求 | 普通CPU即可完成中小规模算例,大规模算例建议多核并行 |
| 支持批量任务 | 支持多场景批量求解、参数扫描、对比实验批处理 |
| 适合场景 | 微电网规划方案比选、储能配置论证、园区能源系统设计 |
从材料看,这个项目更适合作为算法研究和工程方案论证的底层框架,而不是一个带界面的Web工具。它的价值在于:当你面对“风、光、储到底装多少”这个问题时,有一套可量化的建模和求解流程,而不是凭经验拍脑袋。
2. 适用场景与使用边界
2.1 适合谁用
这个项目适合三类人。
第一类是微电网和综合能源系统的规划工程师。你手里有某个园区或台区的负荷曲线、气象数据、设备价格,需要给业主一份容量配置方案,这个框架可以帮你把“经济性最优”和“可靠性约束”同时纳入计算。
第二类是研究鲁棒优化、随机优化算法的同学和老师。混合不确定性建模、两阶段鲁棒、C&CG算法在论文里是成熟理论,但落地成可复现代码需要一套完整工程实现,这个项目直接把问题定义、数学建模、求解流程串起来了。
第三类是做智慧能源平台的后端开发者。你需要在能源管理系统中嵌入一个容量测算模块,给客户提供快速测算能力,这个项目的批量场景求解和多参数对比能力可以直接支撑这一类功能。
2.2 能解决什么问题
- 在风光出力不确定的条件下,确定风机、光伏的装机容量和储能额定容量、额定功率。
- 在保证系统供电可靠性(如失负荷率低于阈值)的前提下,最小化总投资成本和运行成本。
- 回答“多装储能划算还是多装光伏划算”这类协同配置问题。
- 评估不同鲁棒保守度水平下的方案成本变化,给决策者提供“花钱买可靠性”的量化依据。
2.3 不适合什么场景
- 实时控制场景。鲁棒优化模型求解耗时通常以分钟甚至小时计,不适合日内滚动实时调度。
- 设备级精细建模场景。如果要求模拟逆变器开关级动态、设备N-1详细校验,需要另建电磁暂态模型。
- 数据极度匮乏的新区域。如果完全没有历史气象和负荷数据,不确定性集合的参数无从标定,模型效果会受限。
2.4 合规与数据边界
微电网规划涉及实际用电数据、气象数据、负荷数据。在使用项目数据时,需要遵守数据来源的授权协议,对涉及企业或个人的负荷数据做脱敏处理。容量规划结果用于工程可研、投资决策时,应结合当地电网接入规范、行业标准复核,不能直接替代正式的可研评审。
3. 风光储容量规划问题定义
3.1 要规划什么
风光储微电网容量规划问题的决策变量可以分两类。
第一类是规划层决策变量:
- 风电装机容量
- 光伏装机容量
- 储能额定容量
- 储能额定功率
- 变流器容量
第二类是运行层决策变量:
- 各时段风机出力
- 各时段光伏出力
- 储能充放电功率
- 储能SOC状态
- 从主网购电功率
- 切负荷功率
两层决策之间是耦合的。规划层决定设备装多少,运行层在给定容量下寻找最优调度策略。这个关系决定了问题天然是双层优化结构。
3.2 目标函数
目标函数通常是总成本最小化,包含三部分:
- 设备投资等年值成本,包括风电、光伏、储能的初始投资按寿命折算到每年的成本。
- 系统运行成本,包括从主网购电费用、储能退化成本、运维成本。
- 惩罚成本,包括失负荷惩罚费用和弃风弃光惩罚费用。
目标函数的典型形式如下:
min C_invest + C_oper + C_penalty其中投资成本是规划变量的线性函数,运行成本是运行变量的线性函数,惩罚成本用来量化可靠性水平。
3.3 约束条件
约束条件覆盖四个维度:
- 电量平衡约束:任意时段风电出力 + 光伏出力 + 储能放电功率 + 主网购电功率 = 负荷功率 + 储能充电功率 + 切负荷功率。
- 设备出力约束:风机、光伏出力受到装机容量和实时可用出力的限制。
- 储能运行约束:储能SOC状态递推公式、SOC上下限约束、充放电功率约束、单时段不能同时充放电约束。
- 投资预算约束:总投资不能超过规划上限。
此外,针对鲁棒优化,还需要引入不确定性集合并构造鲁棒约束,这部分是模型的核心难点。
3.4 为什么双层结构难处理
规划层和运行层耦合在一起,如果直接求解,问题规模会非常大。常见的处理方式是把双层问题重构为单层MPEC问题,或者采用两阶段鲁棒优化的框架:第一阶段是“这里现在做决策”的规划决策,第二阶段是“等待不确定实现后做调整”的运行决策。
4. 混合不确定性建模与分析
4.1 微电网中的不确定性从哪里来
风光储微电网中的不确定性至少有四类。
第一类是风光出力随机性。风速、光照强度天然是随机过程,风机出力受切入风速、切出风速和额定风速约束,光伏出力受云层遮挡、温度、辐照度影响。
第二类是负荷波动。负荷不是固定曲线,工作日和周末、不同季节、不同温度条件下的负荷曲线差异明显。
第三类是预测误差。风电、光伏和负荷的预测模型总有误差,误差大小随预测时间尺度增加而增大。
第四类是极端事件和故障场景。极端天气导致风电机组大面积停机、线路故障导致输电能力下降,这类场景虽然概率低,但一旦发生影响大。
4.2 随机不确定性与鲁棒不确定性的区别
随机优化用概率分布描述不确定性,目标通常是期望成本最小化,决策依据是“平均情况下表现最好”。
鲁棒优化用不确定性集合描述不确定性,目标是最坏情况下成本最小化,决策依据是“最坏情况下也能满足约束”。
两者对不确定性的刻画维度不同:随机优化需要分布信息,鲁棒优化只需要集合边界。前者风险态度更中性,后者更保守。
4.3 混合不确定性如何耦合
混合不确定性模型把随机性和鲁棒性放在同一个框架里:
- 对于概率信息充分、可以准确估计分布的不确定性,例如常规负荷波动,采用随机场景描述。
- 对于概率信息匮乏、但边界可以估计的不确定性,例如极端天气下的风电大范围跌落,采用鲁棒盒子集合描述。
- 对于同时具有随机特性和边界约束的变量,可以在约束中加入机会约束与鲁棒约束的混合形式。
这在工程上对应一个很直观的决策逻辑:日常运行波动用场景期望来处理,极端风险用鲁棒边界来兜底。
4.4 不确定性集合的典型构造
常用不确定性集合包括:
- 盒式集合:每个不确定参数独立变化在一定区间内。
- 预算集合:限制所有不确定参数同时达到最坏情况的个数,避免过于保守。
- 椭球集合:用二次约束描述参数的相关性。
在容量规划问题中,风光的出力不确定集合经常采用盒式加预算的混合形式:
U = { xi | xi_min <= xi <= xi_max, sum |xi - xi_nominal| / Delta <= Gamma }Gamma是鲁棒预算系数,控制保守程度。Gamma = 0时退化为确定性模型,Gamma越大越保守。
5. 鲁棒协同优化数学模型
5.1 通用两阶段鲁棒优化形式
两阶段鲁棒优化的标准形式是:
min c^T x + max_{u in U} min_{y in F(x, u)} d^T y s.t. Ax <= b Gx + Hy <= g + Mu其中:
- x是第一阶段决策变量,例如装机容量。
- u是不确定参数,例如风光出力。
- y是第二阶段决策变量,例如实时调度功率。
- F(x, u) 是在给定x和u下的可行域。
目标逻辑是:先选一组容量配置x,然后面对最坏的不确定场景u,再通过最优调度y把成本降到最低。
5.2 容量规划模型实例
下面给出一个简化但完整的模型框架。
下标与集合:
- 时段集合
- 风电、光伏、储能设备类型集合
决策变量:
- 风电容量
- 光伏容量
- 储能额定容量
- 储能额定功率
- 各时段购电功率
- 各时段切负荷功率
- 储能充放电状态
约束方程要点:
- 电量平衡
P_wind[t] + P_pv[t] + P_dis[t] + P_buy[t] = P_load[t] + P_ch[t] + P_curtail[t]- 风电光伏出力上限由不确定参数决定
0 <= P_wind[t] <= xi_wind[t] * Cap_wind 0 <= P_pv[t] <= xi_pv[t] * Cap_pv- 储能SOC递推
SOC[t+1] = SOC[t] + eta_ch * P_ch[t] - P_dis[t] / eta_dis- SOC范围
SOC_min <= SOC[t] <= SOC_max- 充放电互斥
P_ch[t] <= M * z[t] P_dis[t] <= M * (1 - z[t])- 失负荷率约束
sum(P_curtail[t]) <= alpha * sum(P_load[t])5.3 将模型改写成可求解形式
两阶段鲁棒模型不能直接用求解器求解,需要分解。常用方法:
- C&CG:主问题逐步添加最坏场景对应的变量和约束,子问题求解最坏场景并生成切割。
- Benders分解:子问题对偶后生成Benders割回主问题。
- 启发式算法:用群智能算法迭代搜索容量组合,内部调用SCED求解运行成本。
其中C&CG是当前应用最广、收敛速度较快的方案,下面第6节重点展开。
6. 协同优化框架设计
6.1 源-网-荷-储协同
协同优化的第一层含义是设备之间的协同。光伏和风电天然具有互补性——白天光伏强、夜间风电往往更强;储能作为灵活调节资源,可以在风光出力富余时充电、在出力不足时放电。模型需要让这些设备在时间维度上形成配合,而不是各自独立容量叠加。
6.2 规划-运行协同
第二层含义是规划与运行的协同。容量规划决定设备上限,而运行阶段的实际收益取决于调度策略。同样的容量配置,在不同的调度策略下经济性和可靠性差异很大。因此,容量规划模型必须内嵌运行模拟,否则容量配置结果在真实运行中会打折扣。
6.3 多时间尺度协同
第三层含义是多时间尺度协同。容量规划考虑的是年度或全生命周期尺度,但运行约束是小时级别的。模型通常采用典型日法:选取多个典型日场景,每个典型日用24个时段代表小时级运行,再把典型日的结果折算到年度成本。
6.4 协同优化的目标平衡
协同优化的最终目标不是让某一个指标独大,而是在成本、可靠性、新能源消纳之间取得平衡。模型通过约束条件表达硬性要求,通过目标函数的权重表达权衡方向。例如:
- 松弛失负荷率约束,系统成本会下降,但可靠性下降。
- 增加鲁棒预算Gamma,系统成本上升,但抵抗极端场景能力增强。
- 提高储能容量,弃风弃光率下降,但投资成本上升。
这些权衡关系正是容量规划方案比选时要呈现给决策者的核心内容。
7. 求解算法与流程
7.1 C&CG主问题-子问题框架
C&CG的总体流程分四步:
第一步,初始化。选择一个初始场景作为最坏场景,设置下界LB为负无穷,上界UB为正无穷,迭代次数k=1。
第二步,求解主问题。主问题在当前已知的最坏场景集合下求解规划决策和运行决策,得到目标函数值作为新的下界LB。
第三步,求解子问题。固定主问题求出的规划决策x,在不确定性集合U中寻找使运行成本最大的场景,同时求解该场景下的调度成本。如果子问题目标值加上第一阶段成本大于当前UB,则更新UB。
第四步,收敛判断。如果UB与LB的相对间隙小于设定阈值,停止迭代;否则把子问题找到的最坏场景添加到主问题中,k=k+1,返回第二步。
C&CG的伪代码如下:
初始化: LB = -inf, UB = +inf, k = 1 选择初始不确定场景 u_1 循环 while (UB - LB) / UB > epsilon: 求解主问题 MP(k): min 规划成本 + 运行成本 s.t. 所有约束 得到 x_k, 目标值 LB = objective_MP 固定 x_k, 求解子问题 SP: max_{u in U} min_{y} 运行成本 得到最坏场景 u_{k+1}, 目标值 objective_SP UB = min(UB, c^T x_k + objective_SP) if (UB - LB) / UB <= epsilon: break 把场景 u_{k+1} 对应的变量和约束加入主问题 k = k + 1 输出 x*, 目标值介于 [LB, UB]7.2 子问题的双线性问题处理
子问题中通常存在“不确定参数乘以第二阶段变量”的双线性项,求解困难。标准处理方式是:
- 如果第二阶段问题是线性规划,先写出子问题的对偶形式,把内层min问题转化为对偶最大化问题,再把外层max与对偶max合并成一个max问题。
- 双线性项在连续变量和盒式集合下,可以通过大M法和线性差分法把“取最坏边界”转化为线性约束。
- 如果模型中有二进制变量,子问题变成混合整数线性规划,求解难度增加,需要把不确定场景采样或采用启发式搜索。
7.3 求解器选择
常用求解器组合如下:
| 求解器 | 类型 | 适用规模 | 说明 |
|---|---|---|---|
| Gurobi | 商用 | 中大规模 | 性能强,学术界常见 |
| CPLEX | 商用 | 中大规模 | 经典MIP/LP求解器 |
| MindOpt | 商用/免费 | 中规模 | 国产求解器,上手快 |
| CBC | 开源 | 小规模 | 免费,适合教学验证 |
| SCIP | 开源 | 小中规模 | 支持MINLP |
需要注意的是,Gurobi和CPLEX需要授权,在论文复现和教学场景要注意许可证范围。
7.4 网格法和启发式替代方案
如果不想处理C&CG的复杂度,也可以采用更工程化的方案:把不确定集合离散成多个代表性场景,然后把模型转为大规模确定性优化问题直接求解。这种方式实现简单,但保守度偏高,且场景数量增加会显著拉长求解时间。
另一种方案是两级嵌套启发式:外层用遗传算法或粒子群算法搜索容量配置,内层对每个容量配置调用确定性经济调度求解器计算运行成本和可靠性指标。这种方案对模型形式要求低,但每次迭代都要求解大量调度问题,总耗时较长。
8. 仿真验证流程设计
8.1 实验数据准备
需要四类输入数据:
- 气象数据。典型年的风速、辐照度小时序列,用于计算风光理论出力。
- 负荷数据。典型日负荷曲线,区分工作日、周末、季节。
- 设备参数。风机、光伏、储能的技术参数和成本参数。
- 电价数据。分时电价或实时电价曲线。
建议准备至少三个典型日场景,覆盖:
- 风光资源好的典型日。
- 负荷高峰的典型日。
- 风光出力受限的典型日。
8.2 对比实验设计
容量规划方法好不好,要和基准方法对比。建议至少设计四组对比:
- 确定性模型:用预测值作为确定性输入,不引入不确定性集合。
- 随机优化模型:用多个随机场景的期望值作为目标。
- 鲁棒优化模型:用盒式不确定集合,选择不同Gamma值。
- 混合不确定性模型:同时包含随机场景和鲁棒边界。
每组实验记录:
- 总成本
- 风电、光伏、储能配置结果
- 失负荷率
- 弃风弃光率
- 求解时间
- 收敛迭代次数
8.3 评价指标体系
评价指标分三个维度:
经济性指标:总投资等年值、年运行成本、单位供电成本。
可靠性指标:失负荷率、供电可用率、储能可用容量裕度。
新能源消纳指标:弃风率、弃光率、新能源渗透率。
8.4 典型结果解读思路
以Gamma参数扫描为例。随着Gamma增大,模型越来越保守,风电、光伏配置量可能下降,储能容量可能上升,系统成本上升,但失负荷率下降。做方案比选时,建议输出一条“成本-可靠性帕累托曲线”,让决策者根据自己的风险偏好选择配置方案。
9. 编程实现与最小示例
9.1 环境准备
建议使用Python 3.8以上版本,安装Pyomo和求解器:
# 创建虚拟环境 python -m venv microgrid_opt source microgrid_opt/bin/activate # Windows下使用 microgrid_opt\Scripts\activate # 安装依赖 pip install pyomo numpy pandas matplotlib # 安装求解器(以MindOpt为例,也可替换为Gurobi) # MindOpt安装包需要从官网获取,安装后将可执行文件路径添加到PATH如果没有商用求解器授权,也可以先用CBC做小规模验证:
pip install cbcpy9.2 Pyomo模型骨架
下面给出一个两阶段鲁棒容量规划模型的Pyomo骨架,只包含确定性问题部分,用于演示建模结构。完整C&CG迭代需要在此基础上扩展子问题求解逻辑。
import pyomo.environ as pyo from pyomo.opt import SolverFactory model = pyo.ConcreteModel() # 集合 model.T = pyo.Set(initialize=range(24)) # 时段 # 参数 cap_wind_max = 5.0 # 风电最大装机容量(MW) cap_pv_max = 5.0 # 光伏最大装机容量(MW) load = [100, 95, 90, 85, 80, 85, 110, 140, 160, 170, 180, 175, 170, 165, 170, 180, 190, 200, 180, 170, 160, 150, 130, 110] # 典型日负荷 pv_factor = [0, 0, 0, 0, 0.05, 0.2, 0.5, 0.75, 0.9, 0.95, 1.0, 0.98, 0.9, 0.8, 0.7, 0.5, 0.2, 0.08, 0, 0, 0, 0, 0, 0] wind_factor = [0.6, 0.7, 0.8, 0.6, 0.5, 0.3, 0.2, 0.3, 0.4, 0.5, 0.4, 0.3, 0.2, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.6, 0.5, 0.4, 0.5, 0.6] # 决策变量 model.cap_wind = pyo.Var(domain=pyo.NonNegativeReals, bounds=(0, cap_wind_max)) model.cap_pv = pyo.Var(domain=pyo.NonNegativeReals, bounds=(0, cap_pv_max)) model.cap_ess = pyo.Var(domain=pyo.NonNegativeReals) # 储能容量 model.p_buy = pyo.Var(model.T, domain=pyo.NonNegativeReals) # 购电功率 model.soc = pyo.Var(model.T, domain=pyo.NonNegativeReals) # SOC model.p_ch = pyo.Var(model.T, domain=pyo.NonNegativeReals) # 充电功率 model.p_dis = pyo.Var(model.T, domain=pyo.NonNegativeReals) # 放电功率 # 目标 cost_invest_wind = 3.0 * model.cap_wind cost_invest_pv = 2.5 * model.cap_pv cost_invest_ess = 1.2 * model.cap_ess cost_buy = sum(model.p_buy[t] * 0.8 for t in model.T) model.total_cost = pyo.Objective( expr=cost_invest_wind + cost_invest_pv + cost_invest_ess + cost_buy, sense=pyo.minimize ) # 约束 def power_balance_rule(model, t): return (wind_factor[t] * model.cap_wind + pv_factor[t] * model.cap_pv + model.p_dis[t] + model.p_buy[t] == load[t] + model.p_ch[t]) model.power_balance = pyo.Constraint(model.T, rule=power_balance_rule) def soc_init_rule(model): return model.soc[0] == 0.2 * model.cap_ess model.soc_init = pyo.Constraint(rule=soc_init_rule) def soc_rule(model, t): if t == 0: return pyo.Constraint.Skip return model.soc[t] == model.soc[t-1] + 0.95 * model.p_ch[t-1] - model.p_dis[t-1] / 0.95 model.soc_dynamic = pyo.Constraint(model.T, rule=soc_rule) # 求解 solver = SolverFactory("mindopt") # 根据实际安装的求解器调整 result = solver.solve(model, tee=True) print("total cost =", pyo.value(model.total_cost)) print("wind cap =", pyo.value(model.cap_wind)) print("pv cap =", pyo.value(model.cap_pv)) print("ess cap =", pyo.value(model.cap_ess))9.3 C&CG主循环框架
完整C&CG实现较长,这里给出主循环的关键结构:
# 主问题MP:包含已发现的最坏场景集合 def build_master_problem(worst_scenarios): # 遍历worst_scenarios,为每个场景复制运行变量和约束 pass # 子问题SP:给定规划解求解最坏场景 def solve_subproblem(cap_wind, cap_pv, cap_ess): # 双层优化:max_{u in U} min_y cost # 通过KKT条件或对偶变换转化为单层问题 pass # 主循环 LB = -float("inf") UB = float("inf") scenarios = [initial_scenario()] while (UB - LB) / abs(UB) > 0.01: mp = build_master_problem(scenarios) x_solution, lb_val = solve(mp) LB = lb_val subobj, worst_u = solve_subproblem(x_solution) UB = min(UB, subobj) if (UB - LB) / abs(UB) <= 0.01: break scenarios.append(worst_u)9.4 数据文件组织
建议把输入参数和求解结果分开管理:
# input_data.yaml wind: unit_cost: 3000 # 元/kW lifetime: 20 # 年 max_capacity: 5000 # kW pv: unit_cost: 2500 lifetime: 20 ess: unit_cost: 1200 # 元/kWh power_cost: 1500 # 元/kW lifetime: 10 grid: buy_price: [0.8, 0.9, 1.2]10. 资源占用与性能观察方法
10.1 求解时间预算
两阶段鲁棒优化是迭代算法,求解时间取决于主问题规模、子问题复杂度和迭代次数。中小规模算例(24时段、10个以下设备候选点、20个以内随机场景)用普通CPU即可完成,可能在几分钟到十几分钟。如果要做全年8760小时模拟,不建议直接展开,建议采用典型日聚类。
10.2 观察指标
运行仿真时重点观察四个指标:
- 主问题目标值变化:应该是单调增加的曲线,反映下界逐步逼近最优值。
- 上界更新情况:上界曲线逐步下降,上下界之间形成收敛通道。
- 每次迭代生成的场景是否重复:如果不断生成相似场景,说明不确定性集合或场景削减策略需要调整。
- 求解器gap:最终gap应小于设定阈值。
10.3 加速手段
- 场景削减。用K-means或后向削减算法把大量历史场景压缩为少量代表性场景。
- 简化时间断面。用典型日替代全时段序列,或者每个典型日只取关键12个断面。
- 求解器参数调优。设置MIPGap为合理值,开启求解器的并行计算。
- 热启动。把上一轮C&CG的规划解作为下一轮主问题的初始解。
10.4 避免资源浪费
批量对比实验时,建议先跑一个最小规模的算例验证代码正确性,再逐步扩大场景数和不确定性集合规模。不要一上来就跑全年+多Gamma全扫描的组合,避免等数小时才发现模型有bug。
11. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 模型求解结果不可行 | 约束条件过紧,例如失负荷率约束接近0 | 检查约束松弛度 | 增加松弛变量或适当放宽约束 |
| C&CG迭代不收敛 | 子问题双线性项处理错误 | 检查对偶变换和线性化步骤 | 改用场景枚举验证子问题正确性 |
| 求解时间过长 | 不确定集合规模过大,场景冗余 | 查看每次生成的场景相似度 | 引入场景削减算法 |
| 求解器提示无许可证 | 求解器授权问题 | 检查求解器安装状态 | 改用开源CBC或申请试用授权 |
| 结果中出现大量切负荷 | 容量配置偏低或惩罚系数偏小 | 检查失负荷率约束和惩罚成本 | 调整惩罚系数或增加装机容量 |
| 风电光伏容量结果极端 | 没有设置互补约束或分时电价异常 | 检查目标函数和资源约束 | 补充设备规模上限约束 |
| Python与Pyomo版本不兼容 | 依赖版本冲突 | 检查安装日志 | 重装虚拟环境并用固定版本 |
| 批量对比实验脚本中断 | 内存占用过高 | 监控内存使用 | 分批运行并保存中间结果 |
12. 最佳实践与使用建议
12.1 先从最小算例开始验证
不要一上来就构建完整工程模型。建议先用3个时段、1个不确定参数、2类设备的最小算例,跑通Pyomo模型和C&CG算法,确认代码逻辑正确,再逐步扩展到24时段和完整不确定性集合。
12.2 数据与模型分离
把气象、负荷、设备参数、电价数据存放在独立的配置文件中,模型代码只读取参数,不硬编码。这样换数据时不需要修改代码,也能方便地做批量参数扫描。
12.3 构建基准测试集
建议建立一套本地基准测试集,包含:
- 三个不同规模的算例(小型园区、中型工业区、大型区域微电网)。
- 一组不动的基础参数。
- 一组已知的参考配置结果。
后续修改模型时,用基准测试集回归验证,确保修改没有破坏原有功能。
12.4 保留不同鲁棒水平的配置方案
鲁棒优化给出的解是“最坏情况下依然可行”的方案,但它可能比确定性方案昂贵很多。工程上建议输出多个Gamma水平下的方案,让业主在成本与风险之间做选择。
12.5 注意单位一致性
微电网容量规划中经常出现单位不一致问题:储能容量单位是kWh,功率单位是kW,风机容量单位是MW,电价单位是元/kWh。建模前统一单位,否则目标函数会出现量级错误,这类错误很难通过约束检查发现。
12.6 批量实验加日志
做参数扫描时,每一次实验都输出一条结构化日志,记录参数组合、求解时间、成本、可靠性和容量结果。批量实验跑完后,用pandas汇总成表格,直接生成对比报告。
13. 总结与下一步
这次我们把这个风光储微电网容量规划的混合不确定性鲁棒协同优化项目完整梳理了一遍。最值得尝试的点是它的建模框架:不是简单地把随机优化和鲁棒优化叠加,而是把风光出力随机性、负荷波动、极端场景统一到两阶段鲁棒优化模型里,用C&CG算法迭代求解。这个思路在工程上的价值很直接——你可以量化回答“多装一个单位储能能降低多少失负荷风险”这类问题,而不是靠经验估计。
拿到项目后,第一步建议先跑通第9节的最小Pyomo示例。确认求解器可以正常调用、目标函数和约束没有单位问题后,再逐步加入不确定性集合、C&CG主循环和批量对比实验。
最容易踩的坑主要有三个:一是子问题的双线性项没有正确处理,导致C&CG迭代不收敛;二是数据单位不统一,目标函数量级失真;三是初始场景设置不合理,主问题第一轮就不可行。
后续可以从三个方向继续扩展:把确定性模型扩展为多目标优化,同时考虑经济性、低碳性和可靠性;把全年8760小时数据接入,用场景聚合法替代典型日法,提升精度;把模型接入实际工程数据库,做成一个面向规划人员的容量测算工具。如果做批量方案比选,建议先把最优解的上下界Gap控制到1%以内,再输出配置结果,这样方案更有说服力。