
1. 先从一张系统图说起微网调度里为什么要研究场景生成把“场景生成”“微网优化调度”“综合能源优化”和“神经网络光伏预测”这四个词放在同一个标题里乍看像是资料打包的巧合其实它们是同一条研究链路里的前后环节。很多同学第一次接触这个方向是照着某篇论文开始跑的论文里一会儿抛一堆曲线一会儿又跳到优化模型中间的逻辑链完全没有讲清楚结果就是代码跑通了原理没懂换一个数据集立刻就不会改。我自己刚接触这个方向时也是这样对着“场景生成”这个词琢磨了很久心想它不就是抽几个随机数吗为什么值得单独开一章研究后来才意识到场景生成是整个微网优化调度的“输入质量保证环节”。预测负责告诉你未来大致什么样场景生成负责把“大致”变成一组有代表性的可能情况而优化调度在这组情况下寻找成本最低、约束满足的运行策略。综合能源优化则是把单一电力网络扩展成电、热、冷、气多能流协调的更大规模问题难度从一条等式平衡变成多条耦合平衡。这篇东西适合正在做微网调度相关课题的研究生、刚进入综合能源方向的工程师以及想从零复现论文实验的初学者。我会把四个模块各自的核心逻辑拆开再讲它们怎么接成一条完整链路。每个环节都会带上我实际调模型、跑数据时踩过的坑这些很容易踩但很少写在论文里。1.1 微网调度真正要面对的不确定性来自哪里微网调度最麻烦的地方不是设备多而是不确定因素太多。它的核心任务是在未来一段时间内通常是一天24小时或未来4小时提前决定每台设备出多少电、电池充多少放多少、要不要从主网购电。但如果光伏出力预报和实际差别很大那么提前制定的计划就等于白做。不确定性大概来自三个层面来源具体表现对调度的影响源侧光伏出力受辐照度、温度、云层影响波动明显发电计划容易落空需要配置旋转备用或依赖储能调节荷侧负荷受天气、时段、用户行为影响难以精准估计功率平衡约束容易被突破造成切负荷或弃光市场侧购电价格、天然气价格存在波动部分模型还会考虑碳交易价格成本目标函数里的参数本身就不确定最优决策也会跟着变以光伏为例它像一个“不守时的朋友”天气预报说明天晴但实际可能多云连续几个小时出力掉到预测值的一半预报说多云实际反而出了大太阳如果不提前准备多余的电又只能弃掉。这两种情况都会让调度成本上升。理解这一点就能理解为什么预测、场景生成、优化调度这三件事必须放在一起看——它们分别回答“未来什么样”“未来可能有哪些样”“每种样我该怎么办”这三个递进的问题。1.2 预测和场景生成是怎么接上的预测和场景生成之间的关系我用一个生活化的例子解释。天气预报说“明天大概率晴天降水概率10%”这是点预测但你出门前准备伞不会只按“大概率晴天”准备而是会想一下“万一那10%发生了怎么办”。场景生成做的就是这件事把预测的不确定性拆成一堆具体情形每种情形带一个发生概率让后续决策在所有这些情形下都能适应。具体到微网调度神经网络光伏预测一般先输出未来时段的期望功率同时可以得到误差分布比如均值和方差。场景生成在此基础上采样构造出若干条可能的光伏出力曲线再用聚类方法削减成数量较少的典型场景并给每个场景赋概率。优化调度则把这些场景同时放进模型里求一个在各种场景下综合效果最好的调度方案。这就是所谓的随机优化。整个过程缺了任意一环后面模型质量都会打折扣——预测不准场景就不准场景不准调度结果再精细也没有意义。2. 场景生成不是抽几个数是一条“采样—削减—赋概率”的流水线很多初学者以为场景生成就是随机抽样其实它至少包含三个步骤按分布生成大量候选样本、把样本削减成少量典型场景、给典型场景赋概率。每一步都有讲究做得草率会直接影响优化结果的可靠性。2.1 蒙特卡洛与拉丁超立方不同抽样方式的取舍最基础的采样是蒙特卡洛。假设光伏出力某个时段的预测误差服从均值为零、方差为某个估计值的正态分布就用随机数生成器直接抽取。这个方法简单但想要覆盖极端情况就需要大量样本。好比往一个靶子上扔飞镖只有扔得足够多整个靶面才不容易留空。拉丁超立方是对蒙特卡洛的改进核心思想是分层把概率空间按维度均匀切分成网格在每个网格里只取一个样本保证边缘覆盖比较均匀。实际效应是同样的场景数量拉丁超立方覆盖的范围比纯随机更“丰满”。如果只需要生成几十到几百个场景我建议直接用拉丁超立方如果样本量已经到几千甚至上万两者差别就不大了蒙特卡洛反而更简单直接。这里给一个最小示例假设24小时中每个时段光伏功率的预测误差是正态分布先生成200条候选场景import numpy as np n_scenarios 200 n_periods 24 # 假设每个时段的预测误差标准差随时间变化 sigma np.linspace(0.05, 0.15, n_periods) # 归一化后的量纲 # 蒙特卡洛抽样shape (200, 24) mc_samples np.random.normal( loc0.0, scalesigma, size(n_scenarios, n_periods) ) # 将误差叠加到点预测上得到场景集 point_forecast np.ones(n_periods) * 0.6 # 假设归一化光伏预测值 scenarios point_forecast mc_samples拉丁超立方可以用现成统计库实现核心思路就是先分桶再在每个桶内抽样这里不展开代码。重点是你需要先有预测误差的分布估计否则再怎么采样也只是在一堆噪声里打转。2.2 K-means场景削减注意“概率”而不是“均匀”生成上千条场景后直接扔给优化调度是不现实的几百上千个场景会让优化问题膨胀到求解器直接罢工。常见做法是把候选样本聚类用每一簇的中心代表一种典型场景场景概率等于该簇样本数占总样本数的比例。用K-means做场景削减有几个容易踩的坑。第一是K怎么选常用肘部法则或轮廓系数但不是越大越好——场景越多求解压力越大且提升有限。实际中10到30个场景已经能覆盖大多数算例的需求。第二是极端场景容易丢失比如连续阴天、午后突变这种概率低但影响大的情形聚类时会被并进相邻的大簇里。我的做法是额外保留一两条人工构造的极端场景不参与削减直接把它们的概率给定得很小。这样一来既不会让模型过度保守又能避免调度方案在极端天气下完全失效。2.3 要不要一开始就上Copula辐照度、温度、负荷这些变量之间是存在相关性的。太阳出来时辐照度上升温度也会升高空调负荷也跟着变。如果每个变量独立抽样就等于把它们当成互不相关的因素生成出的场景可能违背物理规律比如光伏大出力时气温反而极低。牵引相关性建模的常见工具是Copula它可以灵活拟合变量之间的尾部依赖关系。但代价是需要额外的参数估计和采样逻辑对初学者来说成本不低。我的建议是先用独立抽样把整条流程跑通生成后拿历史数据做个散点图看看相关性强不强。如果相关系数已经很高、明显违反常识再去研究Copula不迟。这种工具属于锦上添花不是入门阶段的第一优先级。3. 微网优化调度的建模骨架目标、约束与求解器怎么搭场景生成完下一步就是把场景放进优化调度模型里求解。这个环节学起来相对有章可循因为几乎所有模型都遵循“目标函数等式约束不等式约束”的骨架。难的不是形式而是在实际约束和求解效率之间找平衡。3.1 最小可复现模型的目标函数与约束以一个最简单的微网为例含光伏、储能、外部电网购电负荷是给定的。决策变量包括每个时段的购电量、储能充放电量可能还要加上蓄电池的充放电状态。目标是运行成本最小既包括从主网购电的成本也包括储能充放电带来的寿命折损。下面是一份伪代码级别的模型描述我用Python风格写方便读者对照理解# 决策变量每个时段 t # p_buy[t]从主网购电功率 # ch[t], dis[t]储能充电功率、放电功率 # u_ch[t], u_dis[t]二进制变量表示该时段是否在充电或放电 # 目标函数 minimize sum( price[t] * p_buy[t] for t in T ) sum( c_degradation * ch[t] c_degradation * dis[t] for t in T ) # 功率平衡约束忽略网络损耗 p_pv[t] p_buy[t] dis[t] load[t] ch[t] # 储能SOC荷电状态递推 soc[t] soc[t-1] ch[t] * eta_ch - dis[t] / eta_dis # 储能SOC上下限 soc_min soc[t] soc_max # 充放电互斥约束 ch[t] ch_max * u_ch[t] dis[t] dis_max * u_dis[t] u_ch[t] u_dis[t] 1上面这段关系里最容易忽略的是充放电互斥。很多初学者图省事只写“SOC递推式”和“SOC上下限”不引入二进制变量结果求解器就会给出一种奇怪的结果同一个时段既充电又放电SOC保持不变但白白产生了运行成本和损耗。这种结果在数值上是可行的物理上却是荒谬的。所以只要你的储能模型涉及成本、损耗和寿命二进制互斥变量基本躲不掉。建模语言方面用Python的CVXPY这类清晰建模工具比较顺手或者用MATLAB环境的Yalmip建模再交给求解器。求解器我一般先用开源免费的HiGHS跑中小规模算例如果问题规模特别大、或者要对比不同求解器效果再考虑商业MILP求解器。对初学者来说不要一上来就纠结最强的求解器先让一个小算例能求出合理结果更重要。3.2 随机优化、鲁棒优化与模型预测控制三套思路怎么选把场景放进调度模型有几种不同做法它们的风险态度和计算成本都不一样。策略对不确定性的建模方式目标适用场景随机优化离散场景加概率期望成本最小化场景分布可信愿意“平均意义上的最优”鲁棒优化不确定性集合不区分概率最坏情况下仍可行安全要求高承受不了意外偏差模型预测控制滚动时域实时更新预测每次只优化未来一段反复重算预测质量持续更新实时性要求高随机优化的好处是贴近实际因为概率信息都用了坏处是场景数量一多模型规模迅速膨胀。鲁棒优化反之不需要精确概率只需要定义不确定性范围但结果通常偏保守成本会更高。MPC则是每隔一段时间重新求解一次利用最新预测不断修正适合实际系统但要把控制周期、预测模型和优化器之间的延迟处理好。做论文复现时随机优化出镜率最高大部分带场景生成的文章走的都是这条路。我建议先掌握它再回头比较鲁棒和MPC的差异这样学起来逻辑更顺。3.3 求解超时和二进制变量爆炸的实战处理微网调度模型最大的隐性敌人是二进制变量。时间粒度细、设备多、每个设备都要启停状态时变量数量指数级增长。我见过一个综合能源算例把调度周期切成96个时段15分钟然后再给燃气轮机、锅炉、储能各配二进制变量求解器跑几个小时都没有收敛到目标误差内。我总结过一套降维顺序按照这个顺序处理问题基本都能回到可控范围先把时间粒度从15分钟放宽到1小时。很多概念验证算例用小时粒度足够说明问题求解规模立刻降为原来的四分之一。暂时固定一些设备的启停状态先当连续变量模型跑。比如燃气轮机在某个时段到底该不该开等整体模型跑通后再逐步放开这样能定位是建模问题还是求解器问题。去掉非必要的分段成本、阶梯碳价、最小开关时间等约束。这些约束建模起来很繁琐但未必影响研究主线先去掉可以大幅度加速。给求解器设置合适的MIP最优性间隙比如1%甚至3%。很多情况下要的不是千分之一精度的最优解而是决策趋势正确的可行解。一旦确认结果在物理上合理再逐步把上面去掉的东西加回来。这套顺序我反复用基本每次都有效。核心思路很朴素先让模型能跑再让它跑得快最后再让它跑得准确。4. 综合能源优化同一套调度框架加上热、冷、气之后会发生什么综合能源系统之所以让初学者压力大不是因为新增了多少设备而是因为能量从“一种”变成了“多种”而且各种能量之间还有转换和耦合关系。调度问题的维度一下子变了。4.1 能源集线器把电热冷气装进一个黑箱理解综合能源优化的有效工具是能源集线器。它把上游的天然气、电网电能作为输入中间经过燃气轮机、余热锅炉、电锅炉、吸收式制冷机组等转换设备输出电、热、冷多种能量。这个模型把能量转换关系画成黑箱输入侧放原始能源输出侧放终端负荷你要决策的其实是黑箱内部那个能量路由问题。典型结构里燃气轮机燃烧天然气发电发电过程产生的余热经过余热锅炉变成热负荷供应再驱动吸收式制冷机变成冷负荷。相比电锅炉直接产热这种“热电联供余热利用”的思路在整体一次能源利用效率上更有优势。但前提是系统里有足够的热需求否则余热无处去整体节能效果也就无从谈起了。在建模时能源集线器带来的直接效果是新变量、新约束天然气进气量、热功率平衡、冷功率平衡、设备之间的效率矩阵。原来微网调度只有一条电能等式现在要变成多条能量等式同时成立。这就是我标题里说的“综合能源优化”和普通微网调度之间最本质的差别。4.2 新增耦合约束热电可行域与负荷平衡综合能源优化的难点不在单台设备而在设备之间的耦合关系。以热电联供机组为例它的电出力和热出力不能独立选取它们围成一个可行域通常像一个梯形或三角形。你选择了某个电功率热功率可取范围就被限定了。这种可行域约束在纯电微网里根本不会遇到是综合能源引入的“新物种”。实际运行中还有个著名的“以热定电”问题。寒冷季节热负荷很大为了满足供热燃气轮机必须多发一些电但电网可能并不需要这么多电多余的电只能外送或者弃掉。反过来夏季热负荷小冷负荷大热驱动制冷设备又会把系统的运行方式彻底打乱。因此调度策略必须在电、热、冷三条能量链之间来回权衡而不是把每个设备独立看待。建模上这会带来两类额外负担一是约束数量和数据准备工作量变大因为你得把每台设备的效率曲线、可行域顶点、上下爬坡速率都列清楚二是求解规模膨胀——综合能源模型动辄多出几十上百条约束二进制变量更难收敛。考虑到这些我更建议用增量式开发而不是一步到位。4.3 增量式开发策略从纯电微网一路加到综合能源我的实操习惯是从一个已经跑通的纯电微网调度模型出发按下面这个版本顺序逐步加复杂度版本内容目的v1纯电微网 储能验证基本求解流程v2加入燃气轮机和天然气输入理解热电联供模型v3加入余热锅炉和热负荷平衡引入第二条能量平衡v4加入吸收式制冷或电制冷联动冷负荷v5加入碳交易、阶梯价格等高级目标扩展应用场景每一步都要确保前一个版本还能算出物理上合理的结果再进入下一步。这样出了问题就知道是哪个环节引入的不至于几百行约束在一起时完全没法排查。很多同学一上来就想搭建一个电热冷气全包含的巨大模型结果求解器半天不出解连模型里哪条约束写错了都找不到最后只能从头开始。我遗憾地看过太多这种案例。5. 神经网络光伏预测从一张数据表到能用的概率模型谈完调度再回到预测环节。神经网络光伏预测看似是标准的时间序列任务但实际做起来有几个细节特别影响效果偏偏这些细节在公开代码里经常被一带而过。5.1 数据处理才是预测效果的分水岭无论用LSTM还是更复杂模型数据质量永远是第一位的。光伏数据表通常有这些列时间戳、有功功率、辐照度、组件温度、环境温度、湿度、风速等。第一步是做清洗剔除夜间数据因为夜间功率基本为零混入训练会让模型学到无意义的偏移处理传感器故障造成的跳变和缺失值。插值方法可以选择线性插值或前向填充但要留意连片缺失时不要硬插那只会把噪声灌输给模型。特征工程上几个经验供参考辐照度几乎是最重要的特征其次是温度和历史功率风速对光伏影响相对小但对综合能源中的风机建模有意义。时间编码小时、星期几可以帮助模型识别时段变化。归一化推荐MinMax或Z-score但要注意用训练集的统计量去归一化验证集和测试集避免用全局信息造成前视偏差。区分训练、验证、测试集时必须按时间顺序切分不能随机拆分。这是新手最常犯的错误之一随机切分会把未来数据混入训练集测试结果虚高实际部署时立刻“翻车”。可以把数据按照比如“前70%训练、接下来15%验证、最后15%测试”的方式来切简单有效。5.2 从LSTM到CNN-LSTM再到Attention做预测我建议先跑一个简单基线比如线性回归或历史均值法把基线指标记下来再用神经网络去超越它。否则模型再复杂你也不知道它到底有没有学到真东西。LSTM是处理时间序列的经典选择它靠门控机制保留长期信息。对光伏预测输入可以是过去24小时的历史功率和天气特征输出未来4小时或未来24小时的功率曲线。代码层面结构大致如下import torch.nn as nn class PVForecaster(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim): super().__init__() self.lstm nn.LSTM(input_dim, hidden_dim, batch_firstTrue) self.fc nn.Linear(hidden_dim, output_dim) def forward(self, x): out, _ self.lstm(x) out out[:, -1, :] # 取最后一个时间步的隐状态 return self.fc(out)CNN-LSTM的思路是在输入序列上先做卷积提取局部趋势再送入LSTM捕捉长期依赖。Attention则更激进直接让模型自己学会“哪个时段更重要”。比如傍晚负荷陡增、午后光伏下降这种事注意力机制会把决策权重放到关键转折点上效果经常比单纯LSTM更稳。对初学者我建议先把LSTM跑通、把训练流程吃透再往CNN、Attention方向扩展。不要一开始就堆SOTA结构训练流程不稳模型再新也救不回来。训练时要注意数据归一化、批次大小一般32到128、滑动窗口长度12到48个点、早停法监控验证集损失连续多个epoch不下降就停止训练。损失函数可以先试MSE如果预测出现明显尖峰Huber损失对异常值更稳健。5.3 把点预测升级为概率预测怎么衔接场景生成点预测只给出一条期望曲线做调度时你还需要它背后的不确定性。我比较推荐两种简单的方法分位数回归和MC Dropout。分位数回归的做法是让模型输出三个值分别对应10%、50%、90%分位数训练时用分位数损失pinball loss。好处是概率含义直接坏处是输出维度变多训练稍慢。MC Dropout则是保留Dropout层并在预测阶段也开启多次前向得到一组结果用这组结果的均值方差来估计不确定性。好处是改动最小原有点预测模型几乎可以无缝升级。有了预测区间场景生成就好办了区间的宽度对应误差分布可以直接在点预测周围按这个尺度采样生成光伏场景。至此“预测—场景—调度”链路彻底闭环。评价指标上除了RMSE、MAE还要看区间覆盖率预测区间是否真的覆盖了实际功率和区间平均宽度如果区间又宽又不准说明误差模型本身有问题。6. 学习资料怎么用把四块内容串成一条能上手的训练路径最后聊聊“学习资料”这本身。很多人的资料包里堆了几十个文件名但打开率很低因为不知道从哪里看起。资料多不是问题问题是没有排好顺序。我按照自己的学习过程总结了一条路径给读者一个参考。6.1 一条按周划分的训练路线假设你每天能投入两小时下面这张表可以作为参考阶段时间内容验收标准1第1周光伏数据清洗、特征工程、LSTM建模在测试集上画出预测曲线RMSE比均值基线低2第2周分位数预测或MC Dropout得到预测区间区间能覆盖大部分真实点3第3周蒙特卡洛/LHS采样K-means场景削减能输出1020个典型场景及概率4第4周纯电微网随机优化调度能复现出“低估光伏则成本上升”的对照实验5第5周加入储能二进制约束、求解时间优化模型能在可接受时间内求出清晰结果6第6周综合能源扩展加入CHP与热平衡电热冷三链路模型能收敛7第7-8周整合预测、场景、调度为完整算例完整跑通并对不同场景数/预测误差做敏感性分析这条路径的核心理念是先打通单点再串成链路。很多人喜欢同时看预测和调度两篇代码结果两边都没跑通效率很低。6.2 论文复现与开源项目怎么选复现论文时有个核心原则能找开源代码就先别看没代码的论文。学术论文再现性参差不齐有些论文的方法描述缺失关键参数光靠文本根本复现不出来。先找到一个带示例代码和数据的项目跑通后对照论文看懂每步对应哪个公式再有精力去尝试复现不开放代码的论文这个顺序最稳妥。遇到bug也不要慌。我排查优化模型时常用“单设备单时段”缩小法把时域缩成两个时段、设备只留一个运行看结果对不对再逐层放大。这样能快速分辨是建模错误还是求解器数值问题。预测模型则先查数据泄露再查归一化和训练循环这两处出问题的概率最高。6.3 一份检索型资料清单的整理建议我不建议直接贴下载链接因为链接变动太快而且你也不清楚对方手里是什么版本。更好的做法是给一份“检索型清单”你拿着关键词去搜找到的资料往往比被动接收更适合自己。我的关键词组合一般是场景生成方面搜“microgrid scenario generation K-means reduction”微网调度搜“microgrid stochastic optimization scheduling”综合能源搜“energy hub CCHP optimal dispatch”光伏预测搜“PV power prediction LSTM quantile regression”。数据集可以在公开的微网测试系统数据和各机构公开气象数据里找优先选时间跨度长、采样间隔短、有配套气象站的CSV数据。资料整理方面我习惯按“综述论文、标准算例文档、教学视频、示例代码”四类归档。综述负责建立知识框架看摘要和结论即可标准算例文档帮助你理解公开测试系统的参数含义教学视频适合入门阶段理解流程示例代码则是你动手复现的直接模板。四类文件缺一个学习过程就可能卡在某个地方。最后说一点我自己的体会这套东西最耗时间的其实是调试过程而不是理解算法本身。预测模型跑不顺场景生成的质量就无从谈起场景生成做得很漂亮优化模型却求解超时整个链路一样走不通。如果你正在学这个方向不用急着一次把四个环节全部做完美先让整条链路以最简单的方式跑通一遍再回头逐环节优化。我见过太多人卡在某个环节迟迟不肯往前走最后进度停滞其实只要把标准放低一些先把完整闭环打通后面提升起来会快得多。