ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

改进鲸鱼优化算法与多时间尺度在冷热电联供微网调度中的应用

改进鲸鱼优化算法与多时间尺度在冷热电联供微网调度中的应用 做冷热电联供微网CCHP优化调度的人大概率遇到过这种场景模型建得没毛病、跑的也是经典智能算法可调度结果拿出来一看燃气轮机白天电价高峰期满发余热却用不完只能白白扔掉蓄电池像个钟摆似的反复充放热负荷这边又因为供热量不足得启动燃气锅炉顶上。代码没报错但方案根本没法用。这不是某个参数没调好而是单一时间尺度优化在冷热电联供场景下的结构性缺陷。我最近完整做了一套「改进鲸鱼优化算法 多时间尺度优化调度」的探索方案用来解决CCHP微网里冷、热、电三种能量在时间响应特性上天然错配的问题。这篇文章把整个探索过程从头到尾理一遍为什么单时间尺度会翻车、多时间尺度框架怎么搭、CCHP模型怎么建、标准鲸鱼算法到底哪儿不够用、哪几处改进最关键、最后还有我在实际调试中踩过的坑。适合正在做微电网、综合能源系统优化调度方向的研究生和工程师参考想了解智能优化算法在能源系统里怎么落地的人也能读。1. 冷热电联供微网调度的真正难点热电耦合与时间尺度错配1.1 燃气轮机让电和热变成了连体婴儿冷热电联供系统的核心设备是燃气轮机或燃气内燃机它烧天然气发电同时产生大量余热。听起来很美好一次能源投入同时产出电和热综合效率能到70%~85%。但麻烦也出在这里电和热的产出比例是强耦合的——你要它多发200kW电它就会多产差不多固定比例的余热这些热量如果不被即时消耗掉就得通过散热器扔掉。而用户侧的需求恰恰是不匹配的电负荷波动快、幅度大比如工厂白天启动大型设备、商场空调机组启停分钟级就能出现明显变化热负荷和冷负荷则被建筑围护结构的热惯性抹平了小时级的波动都算剧烈。电网侧可以靠大电网兜底但微网内部如果只做单时间尺度的调度就会出现我在开头说的那种局面为了追电价高峰让燃气轮机满发电全用上了热却过剩等热负荷真正上来了燃气轮机又因为电负荷低谷得降出力余热不够用只能靠燃气锅炉来补。1.2 为什么单一时间尺度优化必然顾此失彼先统一一下概念传统微网调度通常把一天24小时按1小时为步长离散成24个时段或者按15分钟离散成96个时段然后一次性求解所有时段的最优出力计划。这叫做日前调度。问题在于CCHP里的三种能量动态响应速度差了一个数量级电秒级平衡光伏突然被云遮住功率瞬间掉一半冷/热分钟到小时级惯性管道里的水还没热起来建筑温度几乎没变化储能取决于电池和蓄热罐的容量响应可以很快但容量限制严格如果你把调度步长设成1小时那在这1小时里光伏、负荷的波动全靠储能和电网扛燃气轮机只能跑一个固定出力点热惯性完全体现不出来如果你把步长缩到5分钟一天288个时段每个时段的决策变量再乘以设备数量优化变量能到上千个而且超短期预测误差本身就大这么细的步长反而让优化问题变得又难又没意义。单时间尺度的本质问题是用一个固定采样周期去描述不同时间常数的物理过程必然导致信息丢失或计算爆炸。所以工程上的解法思路很明确把调度问题按时间尺度拆层每层只处理自己该处理的事上一层的结果作为下一层的约束。2. 多时间尺度调度框架日前计划、日内滚动与实时修正的分工逻辑2.1 时间尺度怎么划分为什么是1小时加15分钟的组合我采用的是目前综合能源系统里比较主流的三层框架日前调度、日内滚动调度、实时控制。后两层核心是模型预测控制MPC的思想。日前调度提前一天做时间尺度1小时预测时长24小时。它的任务是解决机组启停和长期储能策略这类需要提前确定的决策比如燃气轮机明天哪些时段开机、蓄电池今天整体是充还是放。步长选1小时的原因一是日前预测精度在这个尺度上还算可靠二是机组启停本身就不需要频繁变动1小时足够。日内滚动调度每15分钟触发一次预测未来4小时16个时段的超短期曲线重新优化一遍但只执行第一个15分钟的计划到下一个时刻再滚动。为什么选15分钟这是预测精度、计算量、可控性三者的折中——15分钟以上的光伏/负荷超短期预测误差可以控制在5%~10%15分钟的优化窗口又刚好能覆盖燃气轮机爬坡、储能充放电切换这些动态过程。实时控制层秒级到分钟级由底层控制器完成功率追踪、频率调节不属于优化调度问题但调度层要留出功率调节裕度给它。2.2 三层之间怎么衔接计划、修正与限幅多时间尺度调度不是简单地把同一个模型跑三遍层与层之间的信息传递才是精髓。日前层输出的机组启停计划是硬约束日内层不能推翻它只能修正出力大小。比如说日前定了燃气轮机9:00开机日内就算发现光伏比预测强很多也只能让燃气轮机降到最低技术出力以下或者停机但开机这个动作本身不能改改了启停次数就超了设备寿命和设备启停成本都受不了。日内层以日前计划为基准求解的是修正量ΔP而且这个修正量要限幅。我采用的限幅是日前出力的±10%~15%超出就钳位。这个环节特别关键——如果没限幅滚动优化为了追最新预测可能在相邻两个15分钟段里让储能一会儿大充一会儿大放出现调度振荡这在实际工程里是要避免的。还有一个容易被忽略的点日内层的储能SOC终点必须匹配日前计划的SOC轨迹。如果日内滚动只看自己窗口内的最优不管储能在未来几个小时的SOC终点等晚高峰来临时蓄电池可能已经在下午被借光了晚上该放电的时候没电可放。所以我在日内层优化里额外加了一个约束滚动结束时蓄电池SOC要回到日前计划给出的对应值附近。这套框架跑下来之后你会发现各层各司其职日前层把握大局日内层处理不确定性实时层处理瞬时波动。但框架只是骨架想让优化器在这套框架里算出合理方案CCHP的数学模型才是第一道坎。3. CCHP微网数学模型设备建模、目标函数与约束条件3.1 关键设备的能量耦合建模一个典型的CCHP微网包含燃气轮机供电余热、余热锅炉回收烟气热量、溴化锂吸收式制冷机余热驱动制冷、电制冷机、燃气锅炉热/冷不足时补充、光伏、风电、蓄电池、蓄热罐外加与大电网的联络线。写模型时的核心逻辑是跟踪每一股能量的产生、转化、存储、消耗。表里是拆解结果设备能量输入能量输出建模要点燃气轮机天然气电 高温烟气余热发电效率η_e30%~42%、热电比随出力变化余热锅炉高温烟气供热热水换热效率η_hr80%~90%溴化锂吸收式制冷机余热/热水冷冻水冷量制冷COP约0.7~1.4取决于热源温度电制冷机电冷量COP约3~5响应快燃气锅炉天然气热量效率85%~95%作为热/冷补充蓄电池电电SOC递推、充放电效率90%~95%蓄热罐热热蓄热/放热功率限制、热量损失率燃气轮机的数学表达是CCHP建模里最核心也最容易错的地方。我采用的简化模型是发电功率P_GT η_e(P_GT) × F_GT × LHV回收余热Q_rec η_r × F_GT × LHV注意η_e不是常数它随燃气轮机负载率变化通常是一条先升后降的曲线。早期很多论文图省事用固定效率这在优化结果上会产生明显偏差——满负荷附近实际效率最高如果模型里用平均效率优化器就不会有尽量让机组运行在经济区间的动力。蓄热罐是给热系统解耦的关键设备。没有蓄热罐时燃气轮机的产热必须即时被热负荷消耗掉电和热牢牢绑定有了蓄热罐产热可以存起来晚点用燃气轮机的出力自由度就大多了。所以模型里一定把蓄热罐的SOC状态变量带上H_HS(t1) H_HS(t) × (1 - loss) Q_cha × η_cha - Q_dis / η_dis3.2 目标函数除了运行成本还要管什么主目标我用的是日运行总成本最小包括购气成本燃气轮机和燃气锅炉消耗的天然气费用购电成本/售电收益分时电价下向电网买电花钱、卖电赚钱设备运维成本按各个设备的出力线性折算启停惩罚项燃气轮机启动/停止一次的成本防止优化器让机组频繁启停弃风弃光惩罚项光伏、风电没被消纳的功率加一个足够大的惩罚系数数学形式大致是min C Σ [ C_gas(t) C_grid(t) C_om(t) C_su(t) C_curtail(t) ]为什么把碳排放也考虑进去现在很多园区、工厂在推进碳交易和绿色用能认证纯成本最优的方案往往是电价低谷疯狂买电、燃气轮机少开但这可能增加整体碳排放。我在目标函数里加了一个可选的双目标版本把碳排放折算成碳成本放进目标函数或者做成约束比如碳排放量不能超过历史均值的90%。探索下来觉得先做成本优化然后把碳成本作为可调参数扫描一遍比直接做多目标加权更实用因为实际决策者往往需要看到碳排降低5%对应成本涨多少这样的帕累托曲线。3.3 约束条件里最容易被忽略的坑约束分四类能量平衡约束电P_GT P_PV P_WT P_bat_dis P_buy P_load P_EC P_bat_cha P_sell热Q_HR Q_GB Q_HS_dis Q_load Q_HS_cha冷C_AC C_EC C_load溴化锂制冷机出力 电制冷出力这里有个隐藏细节冷负荷和热负荷不能简单加总到一个平衡方程里。如果项目里既有供热又有供冷比如夏季既需要热水洗澡又需要空调制冷溴化锂机组到底是吸收式制冷还是换热供热取决于机组模式建模时得明确分开不然优化器会钻空子——把冷负荷交给溴化锂、热负荷交给燃气锅炉看似平衡了实际上余热全浪费了。设备出力上下限与爬坡约束出力上下限实际工程里要注意的是最低技术出力燃气轮机不是从0到100%都能任意调的通常有30%~50%的最低负载率。爬坡约束燃气轮机每15分钟最多升/降多少MW。这个参数我觉得比出力限值还重要很多论文模型不加爬坡约束优化出来的方案里燃气轮机一会儿满发一会儿停机现实里设备早就跳闸了。储能系统约束蓄电池/蓄热罐的充放功率限值、SOC上下限一般电池设10%~90%蓄热罐设20%~100%、SOC连续性方程。这里的坑是充放电功率和SOC的非线性关系电池在不同SOC区间接受能力不一样如果简化模型的话至少要把充放电效率区分开。联络线功率约束微网与电网交换功率的上下限这个很简单但容易漏。模型建完优化问题就是在满足上述约束的前提下最小化目标函数——一个大规模、非线性、混合整数启停变量0/1的优化问题。下一步就是选求解算法。我在这个问题上对比过很多方案商业求解器如Gurobi、Cplex做线性化后的 MILP 确实快又稳但问题一加非线性效率曲线、爬坡非线性就麻烦启发式算法虽然不能保证全局最优但胜在灵活能直接塞进复杂模型里。考虑到我在探索阶段经常要改模型结构启发式算法改起来最快这也是我选择鲸鱼优化算法作为基线的直接原因——它结构简单、参数少、实现快但真的跑起来之后标准版本的问题立刻暴露了。4. 标准鲸鱼优化算法为什么不够用早熟收敛与解空间搜索失衡4.1 WOA三个阶段的数学直觉标准鲸鱼优化算法WOA是Mirjalili在2016年提出的模仿座头鲸的捕食行为包含三个阶段包围猎物X(t1) X*(t) - A·D其中D |C·X*(t) - X(t)|。直觉上就是朝当前最优位置靠拢A和C是决定靠拢力度的系数A的取值范围由收敛因子a控制a从2线性递减到0。气泡网攻击X(t1) D·e^(bl)·cos(2πl) X*(t)也就是以螺旋方式逼近最优解。这个阶段是WOA的局部开发阶段负责在当前最优解附近精细搜索。随机搜索猎物当 |A| ≥ 1 时鲸鱼不再朝最优解移动而是随机选一个个体更新位置这是全局探索机制。三个阶段由随机数pp 0.5 时收缩包围p ≥ 0.5 时螺旋更新和|A|共同决定切换。4.2 用在微网调度上的具体问题理论看起来挺美好但真把标准WOA扔到CCHP调度问题上三个问题非常突出第一初始种群质量差导致早熟收敛。标准WOA的初始种群纯随机生成。CCHP调度问题的决策变量有几十上百个解空间维度高可行域在整体解空间里占比又小因为有大量等式约束随机初始化的个体大部分落在不可行域里算法需要花大量迭代去找门。而且随机分布不均匀早期群体可能扎堆在解空间的某个角落跳出来很难。第二收敛因子线性递减导致探索和开发失衡。标准WOA里a从2线性降到0整个迭代过程里探索和开发的节奏是固定的。但CCHP调度的目标函数是非线性、多峰值的分时电价造成明显峰谷、设备效率曲线非线性前期需要的探索时间比线性递减给的要长后期又需要更强的局部开发能力来精细搜索。线性递减都做不到。第三处理混合整数变量的能力弱。CCHP问题里有大量0/1启停变量。WOA本质上是为连续优化问题设计的位置更新公式产生的都是连续值对0/1变量只能通过Sigmoid函数转换或随机舍入来处理。这会产生连锁问题舍入误差让约束容易越界又需要额外的修复机制。这两个问题叠加的结果我在测试标准WOA时体验很明显前100代收敛挺快然后就卡住了目标函数值在一个平台期小幅振荡跑20次每次结果差异都不小标准差能达到十几块钱。对调度方案来说这种可复现性差比不是全局最优更致命——你没法跟决策者交代这个方案明天再跑一遍可能成本差出一截。所以改进的重点就很明确一是把初始种群铺开二是让收敛过程自适应三是对0/1变量有更稳定的处理方式。5. 改进鲸鱼优化算法的四个关键改动5.1 Tent混沌映射初始化让种群从均匀分布开始第一处改进是用Tent混沌映射代替纯随机初始化。Tent映射的迭代公式是当 x(t) 0.5x(t1) 2x(t)当 x(t) ≥ 0.5x(t1) 2(1 - x(t))它产生的序列有两个优点遍历性——能在给定范围内走遍几乎所有位置不均匀但有规律——比纯随机更均匀地覆盖解空间。把混沌序列映射到每个决策变量的上下界就得到一组质量更高的初始解。为什么选Tent映射而不是Logistic映射我之前试过Logistic它在参数接近4的时候产生的序列会在0和1两端聚集导致初始化后很多个体堆在边界附近对储能这类需要中间状态的变量来说很不利。Tent映射的均匀性好很多实现也简单三行代码的事。实测下来仅这一个改动就能让最终成本平均降低1%~2%收敛代数提前10~15代。5.2 非线性收敛因子探索期多逛、开发期细挖第二处改进是把线性递减的收敛因子a换成非线性形式。我用的表达式a(t) 2 × (1 - (t/T)^μ) μ取2这个改动的逻辑很简单迭代前期t/T小(t/T)^2更小a衰减得慢保持较大的取值让 |A| 更大、更容易触发随机搜索全局探索更充分迭代后期t/T接近1a快速掉到0附近算法转入精细开发。比线性递减多了一个参数μ可以调节探索/开发的转换速度。对比测试时我扫了μ1.5、2、3 三组μ2在中型算例48个决策变量上表现最均衡μ3收敛太快容易早熟μ1.5后期收敛太慢。5.3 自适应惯性权重个体与全局的博弈第三处改进是在螺旋更新和包围更新里引入自适应惯性权重。标准WOA更新位置时新位置直接由当前个体和最优个体决定没有记忆——个体上一时刻的位置信息完全被覆盖容易来回震荡。借鉴粒子群算法的思路我加了权重ww(t) w_min (w_max - w_min) × (t/T) 这里是从大到小变化位置更新变成X(t1) w(t) × X*(t) - A·D 包围阶段这样迭代早期w较大个体更倾向于保留当前自身的位置信息不容易被某个局部最优直接拉过去迭代后期w变小算法更信任全局最优信息快速收敛。直观类比就是前期保持自己的主见多探索后期跟紧领头羊冲刺。5.4 随机差分变异打破局部最优的枷锁第四处改进针对早熟收敛问题。虽然加了混沌初始化和非线性收敛因子高维调度问题依然可能让算法卡在局部最优——尤其是优化器发现一个分时电价低谷大量购电的局部小盆地之后很难自己爬出来。我引入了一个基于差分进化思想的变异操作每迭代一定代数我设的是每10代对所有个体按变异概率p_m 0.1执行X_new X_best F × (X_r1 - X_r2)其中F取0.5r1、r2是随机选取的另外两个个体。这个操作的意义在于在最优解的基础上叠加两个随机个体的差分扰动产生一个偏离但仍在合理方向的新解。如果新解比原来好就替换掉不好就丢弃。它给了算法一个跳出局部最优的弹跳力。为什么用差分变异而不是莱维飞行我也试过莱维飞行效果其实不错但差分变异实现更简单、参数更少——只需一个F而且在我这个数学模型经常改动的情况下简单可靠比炫技更重要。到这里改进鲸鱼优化算法我叫它IWOA的四个改动就齐了混沌初始化提升起点质量非线性收敛因子调整搜索节奏惯性权重平衡个体与全局差分变异提供逃逸能力。四个对策恰好对应标准WOA的四个痛点下面看它怎么嵌入多时间尺度框架。6. 算法嵌入多时间尺度框架的求解流程与实验设计6.1 决策变量编码与约束处理把算法用到调度问题上第一件事是定义鲸鱼的位置代表什么。我的决策变量排列方式是日前层24维 × 设备数燃气轮机每小时出力、蓄电池每小时充放电功率、蓄热罐每小时蓄放热功率日内层16维 × 设备数未来4小时内各设备的修正出力变量顺序固定方便约束校验时按索引快速定位。对0/1启停变量我用Sigmoid函数把连续值映射到(0,1)再按0.5阈值转成0/1。这个处理比随机舍入更平滑算法优化时梯度信息更连续。约束处理用的是罚函数法等式平衡约束的偏差量如电功率不平衡的绝对值乘一个较大的惩罚系数加进目标函数越限约束同理。关键在罚系数怎么定——太小的话算法会心安理得地输出不可行解太大的话可行域边缘的梯度信号被放大优化器会偏向保守。我的做法是采用自适应罚函数前一半迭代罚系数从小到大爬升让算法先探索可行域边缘后一半迭代罚系数固定在较大值逼它找出严格可行的解。实测这在冷热电平衡这种多等式约束问题上特别管用比固定罚系数效果好很多。6.2 完整求解流程读取数据预测曲线、分时电价、设备参数、初始SOC日前层用IWOA求解24时段优化问题得到机组启停计划P0和SOC参考轨迹日内层循环每15分钟一次更新超短期预测数据以日前计划为基准设置修正量限幅±10%~15%用IWOA求解滚动窗口内的优化问题未来4小时只执行第一个时段的控制指令进入下一时刻每层求解后做约束校验对越界量进行修复或罚函数兜底这个流程在MATLAB里实现日前层种群数50、迭代次数150单次求解耗时不到30秒日内层种群数30、迭代次数100单次求解5~10秒完全满足15分钟触发一次的要求。6.3 对比实验怎么设计才有说服力做算法改进最怕自说自话。我设计的对照实验包含四组标准WOA、改进WOAIWOA、PSO、GA在同一个测试系统上跑一个包含光伏、风机、燃气轮机、燃气锅炉、溴化锂制冷、电制冷、蓄电池、蓄热罐的典型园区CCHP微网分夏季典型日和冬季典型日两组场景每组场景随机独立运行20次统计指标说明日运行总成本目标函数最终值收敛代数达到最优值95%时的迭代次数多次运行标准差20次运行结果的离散程度衡量稳定性求解时间单次完整优化耗时从我做的典型测试结果看趋势非常一致IWOA的日运行成本比标准WOA降低约5%~8%比PSO和GA低2%~4%更重要的是20次运行的标准差从标准WOA的十几块钱降到两三块钱调度方案的可复现性大大提升收敛代数上IWOA在70~90代左右就进入平稳状态而标准WOA经常要110代以后还在小幅波动。日内滚动这块我还专门统计了日前计划与日内修正后的实际总成本偏差。不接日内修正时光伏预测误差导致的成本偏差能到8%~12%接了日内滚动修正后偏差压缩到2%以内。这印证了一个观点在预测误差面前光靠算法改进是不够的多时间尺度框架的价值比算法本身更大。7. 实操中踩过的坑与调试心得7.1 可行域窄到让人崩溃CCHP的等式约束太多电、热、冷三个平衡方程一压可行域在解空间里占比极小。我第一次跑IWOA时算法输出了一个成本极低的方案——燃气轮机全程停机电全靠电网买冷全靠电制冷这样等式平衡居然也满足了。问题出在哪我没给燃气轮机设最小运行时间约束优化器直接把机组关了余热锅炉、溴化锂制冷机跟着全部闲置。这个方案在数学上可行工程上完全不合理——园区本来就为了冷热电联供才建的这套系统你让它变成纯买电的微网那还联供什么修复方法是加两条约束一是燃气轮机每天最少运行时长我设的是8小时二是如果日前给定某个时段开机日内层不能擅自停机只能降出力。加了之后方案才变得像个联供系统该有的样子。7.2 日内滚动出现的调度振荡接入日内滚动后的第一版我遇到了非常典型的调度振荡相邻两个15分钟段里蓄电池一会儿以最大功率充电、一会儿又以最大功率放电蓄热罐也类似。查了半天原因有三修正量没有限幅滚动优化完全自由发挥超短期预测每15分钟更新一次相邻两次预测本身就有噪声目标函数里储能充放电切换的惩罚项没用上解决方式是三层修正量限幅±10%~15%、储能动作惩罚相邻时段充放状态变化加一个小成本、SOC终点匹配滚动结束SOC要贴近日前计划。这三个措施一上振荡立刻消失。我发现这个问题在很多论文里都被一笔带过但实际工程上不做处理这套系统根本没法投运。7.3 参数敏感性的意外发现做参数扫描时有个意外收获Tent混沌映射的初始值x0对结果几乎没影响因为混沌遍历性让不同初始值产生的序列在统计上等价但差分变异里的F参数影响很大F从0.3改到0.9最终成本能差3%。原因也好理解F太大变异步长过大可能跳出有利区域太远F太小变异效果不明显成了摆设。F0.5附近是个不错的平衡点。另外种群规模从30提到100对最终成本影响不到1%但求解时间翻了三倍。多时间尺度调度本身要反复求解计算效率比理论最优性更重要我最后取的是规模50、迭代150次求解时间和质量的平衡点。7.4 一个值得多花心思的方向模型准比算法秀更重要最后说点个人体会。整套系统做下来一个很深的感受是算法改进带来的收益在模型准确性面前是次要的。我试过把燃气轮机的效率从常数改成负载率相关的非线性曲线只这一个改动就让日运行成本结果变化了4%以上——比我改进算法的收益还大。设备模型的精度、预测数据的质量、约束条件的完备性这些脏活累活才是决定优化结果真正的上限算法只是逼近这个上限的工具。如果你也想在这个方向试试水我的建议是别急着改算法先把设备模型和约束条件做扎实把日前、日内两层框架跑通再回来琢磨优化算法。等模型稳定了你会发现改进鲸鱼算法最大的价值不是把成本降低了多少而是让你在改需求、调场景的时候有一个改起来快、跑得稳、结果不飘的求解工具。这也是为什么我现在依然把它作为主力算法在用——在探索阶段灵活和稳定比极致的最优性更实用。
返回列表