首页 / 资讯中心 / 文章详情

含碳捕集微网多时间尺度低碳经济调度:改进粒子群算法及Matlab实现

含碳捕集微网多时间尺度低碳经济调度:改进粒子群算法及Matlab实现 ★ FEATURED ARTICLE
做微网调度研究的人这两年普遍有个感受经济性和低碳性已经不能分开算了。我最早接触这个方向时模型里就是燃料费加运维费碳排放最多折算成碳税在目标函数里加一笔。后来意识到一个问题把碳捕集装置CCS写进微网模型后调度问题的结构完全变了。CCS不是多装了一台设备那么简单它直接改变了电力、碳流、储能之间的耦合关系——机组的电出力会影响捕集能耗捕集能耗反过来又挤占负荷平衡储能和碳储液罐在时间维度上形成新联动传统单目标、单时间尺度的调度模型根本接不住这套逻辑。这篇文章要聊的是基于改进粒子群算法的含碳捕集微网多时间尺度低碳经济调度一套已经在我这边跑通、可以直接拿去做二次开发的Matlab实现方案。适合正在做微网优化调度、碳捕集课题的研究生也适合刚接触粒子群算法、想找一个真实工程案例练手的同学。文章会把数学模型、算法改进思路、代码结构、算例结果解读一次讲完代码层面的坑也会单独拉一节出来说。1. 为何要把碳捕集放进微网调度电-碳耦合与多尺度分工1.1 传统微网调度模型的盲区传统微网经济调度里目标函数通常是这样一个形式min F 燃料成本 运维成本 购电成本 启停成本约束条件就是功率平衡、机组出力上下限、爬坡约束、储能SOC递推。这个模型很成熟但有几个明显的盲区一是碳排放只作为“事后惩罚”存在最常见的是在目标函数末尾加一项碳税等于对每一吨CO2罚款。这么做看似绿色实则并没有改变系统运行的结构——燃气轮机该怎么出还是怎么出因为碳税只是一个价格信号它没有提供“主动减少碳排放”的手段。二是模型假设机组出力越高越好只要成本画得来。但加入CCS之后机组出力和碳捕集能耗是同时发生的本来可以用来满足负荷的电有一部分要分给捕集装置去压缩、吸收CO2这就不是简单的惩罚系数能表达的问题了。三是所有决策都用同一个时间粒度。实际运行中风电和光伏预测在日前尺度上误差很大等到日内实时运行时计划调整是滚动进行的。用一个粗粒度模型去管所有时段决策必然失真。多时间尺度就是要解决这个问题。1.2 碳捕集装置带来的三层变化碳捕集装置进入微网之后贴近工程实际来看至少带来三层变化第一层能量流被切出一条支路。燃气轮机燃烧产生电力和烟气烟气里的CO2进入捕集装置捕集装置本身要消耗额外电能。于是微网的功率平衡从原来的“电源出力 负荷”变成了“电源出力 负荷 CCS能耗”。这一项看起来不大但在日尺度上累计下来的电量消耗不可忽略。以一套处理500kg/h CO2的捕集装置为例单位捕集能耗在0.2~0.4 kWh/kg之间意思是捕一吨CO2要吃掉200到400度电这足以改变机组出力的调度顺序。第二层碳排放从“直接排放”变成“净排放”。系统真正的减排效果要看“原始排放减去捕集量”之后的净排放。捕集到的CO2要么封存要么利用无论哪条路都受储罐容量约束。因此调度决策里必须多一组变量——捕集率、捕集能耗、储液罐液位这些变量和机组出力强耦合。第三层时间维度多了一条“碳惯性”。储能系统有SOC状态碳捕集系统的储液罐也有类似液位的状态量两者在时间上都会跨时段延续。日前决策定了储液罐液位轨迹日内修正如果变动太猛液位就可能越界。所以调度不仅要做电力平衡还要做“碳平衡”。1.3 多时间尺度调度解决什么问题实际微网运行中的数据流是这样的日前根据24小时负荷、风光预测制定机组启停和储能大策略日内提前4小时左右做滚动修正因为天气变了、负荷变了实时再根据秒级到分钟级的偏差做调整。三个尺度各管一摊事但又不能各自为战。在含碳捕集的系统里这种多尺度需求更加突出。CCS装置的启动和停机有能耗成本和响应延迟日内频繁启停不现实。而储液罐的液位变化比较慢适合放在日前做粗排日内只做小幅修正。标准粒子群算法直接拿来做这类问题容易出问题但先说模型模型是整个调度的地基。2. 调度模型的完整建立目标函数、约束条件与尺度衔接2.1 目标函数经济成本与碳成本怎么叠加我采用的调度模型是一个日前-日内两级优化的复合结构先把日前的目标函数和约束写清楚。目标函数如下min C_total Σ_t [ C_fuel(P_MT(t)) C_om·P_MT(t) C_grid(t)·P_grid(t) C_ESS·|P_ESS(t)| C_CCS(P_CCS(t), R_cap(t)) C_co2·E_net(t) ]式中各项含义C_fuel是燃气轮机的燃料成本按二次函数近似a·P_MT² b·P_MT cC_om是机组每度电的运维成本取常数C_grid(t)是分时购电价负荷高峰时段电价高低谷时段电价低C_ESS是储能充放电的等效损耗成本按放电深度折算C_CCS是碳捕集成本包含捕集能耗费用和捕集剂损耗费用后者与捕集量成正比C_co2·E_net是净碳排放成本E_net E_emit - E_cap - E_quota其中E_emit是机组原始碳排放E_cap是捕集到的碳量E_quota是系统免费碳配额。这个目标函数的关键在于碳成本不是简单把排放乘一个系数而是要把“捕集”和“排放”放在一起净核算。如果碳税单价设得高系统就会倾向于多开捕集装置、多储碳如果碳税低捕集装置可能反而不划算系统选择直接排放。2.2 平衡、爬坡、SOC与CCS约束约束条件这一块每一类都要落到可编程的形式功率平衡约束P_WT(t) P_PV(t) P_MT(t) P_grid_in(t) P_ESS_dis(t) P_load(t) P_ESS_ch(t) P_CCS(t) P_grid_out(t)这里P_CCS是碳捕集装置的耗电功率必须显式放进平衡方程里。很多初学者第一次跑出荒谬结果回头一看就是功率平衡里漏了CCS耗电。燃气轮机约束P_MT_min ≤ P_MT(t) ≤ P_MT_max爬坡约束 |P_MT(t) - P_MT(t-1)| ≤ P_ramp·Δt启停状态由二进制变量u(t)控制。储能约束SOC(t1) SOC(t) (η_ch·P_ESS_ch(t) - P_ESS_dis(t)/η_dis)·ΔtSOC_min ≤ SOC(t) ≤ SOC_max充放电功率不超过额定值且同一步长内充放电不能同时进行。电网交互约束购电功率和售电功率分别设上限并且为了防止模型同时买电又卖电做套利需要加一个互斥约束或通过电价结构自然避免。碳捕集系统约束P_CCS(t) β_cap·R_cap(t)说的是单位碳捕集率消耗的电能。R_cap(t)是捕集到的CO2质量流率上限不能超过机组实际产生的CO2量R_cap(t) ≤ η_cap·E_emit(t)。储液罐液位状态V_storage(t1) V_storage(t) R_cap(t)·Δt - V_release(t)其中V_release是运输或利用掉的碳量同样有容量上限。备用约束运行时通常还要留旋转备用即系统可调出力机组上限储能剩余可放量要大于负荷加上CCS用电的某个比例。这项约束在单一目标模型里容易被忽略但工程上特别重要。2.3 日前、日内、实时三层如何衔接这三层不是一个模型跑三遍而是决策粒度不同、信息更新频率不同、变量粗糙度不同。日前层步长1小时共24时段直接决定燃气轮机的启停计划、储能的日充电节奏、CCS的日运行时间窗口。它的任务是把大框架定下来不用太纠结风光预测的随机扰动。日内层每个时段向前滚动优化常用步长15分钟、预测时域4小时。它以日前计划为基准根据最新的负荷和风光预测数据修正微源的出力设定值。算出来的结果要尽量贴近日前计划偏离太大就丧失了多尺度的意义。实时层做偏差纠正时间粒度可以到5分钟甚至1分钟主要应对联络线功率波动和储能SOC偏差。在实际建模时我并没有把三层全部揉进同一个目标函数而是按“顺序递进”的方式做先解日前再把日前结果作为日内优化的边界条件。这样既符合工程习惯又让粒子群算法的变量维度控制在合理范围内不至于一天调度问题就要优化几百个变量。3. 标准粒子群算法在这个问题上为什么不够用3.1 标准PSO的基础流程粒子群算法PSO的思路特别直观一群粒子在解空间里飞每个粒子记录自己的历史最优位置pbest群体共享全局最优gbest。每次迭代按这个公式更新v(t1) w·v(t) c1·r1·(pbest - x(t)) c2·r2·(gbest - x(t)) x(t1) x(t) v(t1)w是惯性权重c1、c2是学习因子r1、r2是[0,1]均匀随机数。这个算法易实现、收敛快、不需要求梯度所以工程里用得很广。在微网调度这类问题上PSO的编码方式也很直接把每个时段的决策变量压成一个向量比如[P_MT(1)...P_MT(24), P_ESS_ch(1)...P_ESS_ch(24), P_ESS_dis(1)...P_ESS_dis(24), u_MT(1)...u_MT(24), P_CCS(1)...P_CCS(24)]每个粒子就是一组完整调度方案。但问题恰恰就出在这种“直接编码”上。3.2 早熟收敛与粒子同质化标准PSO在低维、单峰、无约束的问题上表现很好可含碳捕集微网调度不是这种问题模型。它有几十上百个决策变量目标函数非凸、多峰、强约束大量可行域被边界条件切割成碎片。早熟收敛的成因在于所有粒子都存在向gbest靠拢的趋势。一旦某个粒子偶然发现一个局部较好的方案周围粒子都会被“吸”过去。更麻烦的是粒子靠拢之后群体多样性迅速下降。到迭代后期所有粒子的速度和位置几乎相同搜索变成了在局部邻域里的小尺度抖动。在这个问题上多维、多约束放大了这个缺陷——因为局部最优解太多粒子一旦落进去就很难靠自身速度冲出来。在实际测试中标准PSO跑300代之后往往在迭代前80代就停止有效进化后续两百代都在同一个适应度附近来回震荡。3.3 高维、混合变量带来的实际困难含碳捕集微网调度还有一个容易被忽视的难点决策变量里既有连续变量机组出力、储能功率、捕集率又有离散变量机组启停状态、CCS启停状态。标准PSO的速度-位置更新公式天然面向连续空间遇到二进制变量只能做松弛或取整取整会破坏粒子飞行方向的一致性轻则收敛变慢重则产生大量毫无意义的不可行解。举个例子u_MT(t)表示燃气轮机在t时段是否开机。标准PSO里这个值可能是0.73取整后变成1但取整操作会让粒子的“飞行轨迹”变得非常跳跃。你本来在连续出力变量上优化得很好的粒子一旦离散变量取整后变成了完全不同的启停组合前面的连续优化成果全部作废。另外约束条件太多了粒子在随机初始化阶段大量掉进不可行域。功率平衡不满足、储能SOC越界、储液罐过充、爬坡超限这些问题在标准PSO里主要通过罚函数来处理但罚函数系数调不好要么罚得太轻让不可行解“浑水摸鱼”要么罚得太重导致算法失去搜索能力直接僵化在可行域边缘。4. 改进粒子群算法混沌初始化、自适应权重与精英突变4.1 基于混沌映射的种群初始化改进的第一步不是改过程而是改起点。标准PSO用均匀随机数生成初始种群在高维约束问题下这种初始化方式的覆盖率很差——大量的初始粒子根本不是可行解算法开局就要花很多代去“挣扎”回可行域。我采用的方案是用Tent混沌映射生成初始位置。Tent映射形式很简单x(k1) μ·(1 - |2·x(k) - 1|)μ取2左右。混沌序列表面随机实际上有很好的遍历性——它会在定义域内不重复地遍历每一个区域而且相邻两个混沌变量之间的相关性比伪随机数更低。把混沌序列线性映射到每个决策变量的上下界就能让初始种群在可行域边界内部均匀铺开而不是一堆乱点。这样做的好处很明显第一初始粒子的多样性显著提升第二初始时刻就有更多粒子落在可行域附近罚函数机制启动时的“阻力”小很多第三混沌序列的确定性还让算法具备了一定的可复现性这在学术对比实验里很关键——同样一个算例你有记录地复现出结果审稿人那一关就好过很多。4.2 自适应惯性权重与异步学习因子标准PSO的惯性权重w如果固定前期探索和后期收敛永远无法兼顾。我这边用的是非线性递减加动态修正w(k) w_max - (w_max - w_min)·(k / K_max)^2其中K_max是最大迭代次数w_max取0.9w_min取0.4。平方形式让权重在前期衰减较慢保证充分探索后期快速变小加速收敛到gbest附近。学习因子c1、c2则采用异步策略。c1管的是粒子向自己的历史最优靠拢c2管的是向全局最优靠拢。迭代前期c1应该大、c2应该小让粒子多探索迭代后期反过来c1小、c2大让粒子集中精力围绕当前最优解精细搜索。具体取值可以这样设c1(k) 2.5 - (2.5 - 0.5)·(k / K_max) c2(k) 0.5 (2.5 - 0.5)·(k / K_max)这两个公式看起来简单但实际效果非常明显。我之前的实验里异步学习因子配合非线性惯性权重在同样的迭代次数下平均适应度比固定参数的PSO能低10%~15%而且波动性小得多。4.3 精英突变与粒子再生机制自适应权重解决的是“早收敛”和“后期振荡”的问题但还不能完全解决粒子同质化。迭代到中期粒子会逐渐聚成两三个簇局部最优区域附近挤满了一模一样的粒子。这时候需要用突变机制强行注入新信息。我在每轮迭代中做两件事第一每隔15代随机选出一批适应性较差的粒子用混沌映射重新初始化其位置和速度方向朝当前gbest的邻域偏移相当于“定向重启”。第二记录gbest连续不更新的代数如果超过20代就对所有粒子中适应度排在后30%的粒子做一次高斯扰动扰动幅度随迭代次数递减。这两个机制合在一起的效果是算法在陷入局部最优时不会“死耗”而是主动丢出一些新粒子去探索其他区域。哪怕探索失败也只是浪费少量计算资源收益远大于代价。我还加了一个细节全局最优粒子不做突变否则会丢失最优信息。gbest只被记录、不会被扰动除非另一个粒子找到了更优解替换它。4.4 改进后的算法整体流程与参数建议整合起来改进后的一次调度求解流程如下读取负荷、风电、光伏、分时电价、碳税等基础数据根据CCS和微网参数生成决策变量的上下界矩阵用Tent混沌映射初始化种群每个粒子随机赋予初始速度对每个粒子做约束校验计算罚函数修正后的适应度更新每个粒子的pbest和全局gbest按非线性递减公式更新惯性权重w按异步策略更新学习因子c1、c2更新每个粒子的速度和位置对越界变量做边界吸收或反射每15代执行精英突变gbest连续停滞超20代时执行高斯扰动重启判断是否达到最大迭代次数未达到则跳回第4步输出gbest对应的调度方案和各项成本明细。参数方面我的默认经验值是种群规模120最大迭代次数500w_max0.9w_min0.4c1从2.5递减到0.5c2从0.5递增到2.5变异间隔15代停滞判定20代。这个组合在大多数含碳捕集微网算例上都能在300代以内收敛到稳定解。5. Matlab实现代码架构、约束处理与调试思路5.1 工程文件怎么组织Matlab代码我建议按四块组织分得清楚后面改起来才不痛苦数据层load_case_data.m 负责读取或生成负荷、风光出力、电价、碳参数模型层objective_function.m 计算目标函数constraints_check.m 校验全部约束算法层pso_improved_main.m 是主程序chaos_init.m 、update_velocity_position.m 、elite_mutation.m 是改进算子输出层plot_schedule.m 、plot_convergence.m 负责画图。这样分层的好处是后续你想换一个目标函数只需要改模型层想换个算法做对比只需要重写算法层数据层和模型层全部复用。我见过太多人把几百行代码写在一个脚本里最后连自己都分不清某个变量到底是哪个模块算出来的。5.2 粒子编码与目标函数映射粒子编码的细节直接影响算法性能。我的做法是把连续变量全部放在粒子向量的前段离散变量放在后段这样便于统一做边界处理。一个周期T24时段、含MT、ESS、CCS的微网粒子向量设计成[P_MT(1:T), P_ESS_ch(1:T), P_ESS_dis(1:T), P_grid(1:T), R_cap(1:T), u_MT(1:T)]前5组是连续变量最后一组是0/1离散变量。连续变量的上下界由机组参数决定离散变量在更新速度后做一个逻辑判断u_MT 0.5就取1否则取0。这么做虽然简单但在混沌初始化和精英突变的配合下离散变量的寻优效果已经足够。目标函数计算时先解码粒子得到各时段的决策值然后计算功率平衡、爬坡、SOC递推、储液罐液位。注意SOC和储液罐液位都是递推量必须按照时间顺序逐时段算不能用向量化方式一次搞定否则时序逻辑会完全错乱。5.3 约束处理策略罚函数设计针对含碳捕集微网这种强约束问题我用的罚函数分两层第一层硬约束越界直接罚。功率平衡偏差、SOC越界、液位越界、爬坡超限每一项算一个归一化偏差量乘以一个大的惩罚系数加入适应度。第二层启停状态约束用逻辑修正。MT只能处于开或关状态储能不能同时充放电这些用逻辑判断来做避免生成物理上不可能的组合。罚函数系数的经验值很讲究。我第一次做的时候系数设小了算法给出的最优解里SOC一路冲到1.0还继续充电功率平衡误差大得离谱。后来把惩罚系数从100调到5000才把方案压回可行域。但系数也不能太大否则粒子一旦偏离可行域适应度函数梯度就被罚函数淹没搜索方向全被可行域边界拽着走收敛速度暴跌。一个实用技巧是在迭代前期用中等惩罚系数让部分粒子可以探索不可行域边缘到迭代后期逐步增大惩罚系数逼着所有粒子回到可行域。这种“动态惩罚”策略在工程上比单用固定惩罚系数更稳定。5.4 关键调试技巧调试这个模型我常用的方法就是看“三个残差”功率平衡残差每个时段P_WTP_PVP_MTP_grid_inP_ESS_dis减去负荷P_ESS_chP_CCSP_grid_out这个值必须贴零SOC递推一致性把SOC轨迹按递推公式反向验算一遍检查首尾是否自洽碳流平衡机组原始排放减去捕集量再减去净排放核算值应该对得上。三个残差里任意一个非零问题一定出在对应模块。这个方法比在断点里加一堆disp命令好使得多。另外建议先用一个小规模算例验证正确性比如把24时段缩成6时段把变量数降到30个以内确认模型无误后再跑完整规模能省下大量调试时间。6. 算例验证与结果解读仿真怎么设计才不踩坑6.1 案例数据与情景设计验证算法当然不能只跑一组数据。我设计的标准算例包含含风电机组、光伏阵列、燃气轮机、储能电池、碳捕集装置和一个常规负荷曲线的孤立微网系统。取24小时为调度周期步长1小时。分时电价高峰段设在10:00-14:00和18:00-22:00碳税初始值取50元/吨。情景设置上我通常做三组对比A组不含CCS直接用改进PSO求解作为经济调度的基准B组含CCS用标准PSO求解C组含CCS用改进PSO求解。三组结果放在同一张表里对比重点看总成本、净碳排放量、弃风弃光率、CCS捕集总量、储能日充放电次数这五个指标。6.2 改进PSO与标准PSO的收敛对比收敛曲线是我每次算例最关注的东西。标准PSO在这类问题上的收敛曲线通常会呈现一种“假收敛”形态前几十代适应度速降之后曲线逐渐水平看起来像是找到了最优解。但你把改进PSO的曲线叠上去就会发现查标准PSO在100代以后完全不动了改进PSO还在缓慢下降最终适应度能再降10%以上然后稳定下来。所谓的“假收敛”本质就是粒子群体过早同质化所有粒子挤在同一个局部最优解附近。自适应权重和精英突变能在后期把粒子拉出来所以改进PSO的收敛曲线是阶梯式的——平台期和下降期交替出现每个平台代表算法在局部最优区域搜索下降则意味着突变机制发现了更优区域。计算时间方面改进PSO因为增加了混沌初始化和精英突变单次迭代耗时比标准PSO高出约15%~20%但总迭代次数经常比标准PSO少两到三成所以总耗时基本相当甚至更快。6.3 碳捕集系统对调度结果的影响对比A组和C组碳捕集系统的影响非常明显燃气轮机的出力曲线整体抬高。因为CCS在捕碳时需要耗电为了在满足负荷的同时扛起这部分额外电耗机组必须多发一点电净碳排放显著下降。原始排放虽然升高但一部分CO2被捕集封存净排放比完全不含CCS的场景低很多储能充电策略变化。为了给CCS留出用电空间储能在光伏大发的中午时段会提前多充一点负荷晚高峰时再放出来整个充放电曲线会往高峰时段挤压弃风弃光率下降。风电和光伏本来在负荷低谷会面临弃电但CCS相当于给系统增加了一个“可控负荷”多出来的绿电可以供捕集装置使用一举两得。从成本角度看CCS的运行会让燃料成本和运维成本上升但碳成本大幅下降。最终总成本在碳税足够高时低于不含CCS的模型在碳税偏低时则未必划算。碳税的临界值是多少跟捕集能耗效率、储液罐容量和电价结构都有关系这个临界点分析可比笼统说“CCS能降碳”有价值得多。6.4 结果合理性检查仿真结束后别急着写报告先做两轮合理性检查。第一轮是物理性检查储能SOC曲线是否在0.1到0.9之间连续变化有没有突变尖峰燃气轮机出力是否符合爬坡约束CCS耗电功率是否非负且不超过设计上限联络线功率是否在允许范围内。这些检查里任何一项异常都说明模型或算法有隐患。第二轮是经济学检查分时电价高价时段购电量应该明显少于低价时段如果结果里出现“高价时段大额购电、低价时段不买电”八成是功率平衡约束写错了或者粒子早熟陷进了不可行解的罚函数盲区。另外把CCS情景和不含CCS情景的成本分项拆开对比哪一项变化不符合直觉就要回头查那一项的函数实现。我遇到过最典型的一个坑是储能SOC递推方向写反了充电时SOC反而下降导致算法刷出一个“永远在充电”的假最优解成本低得离谱。这种情况靠Sigma点在粒子群迭代里是翻不出来的只有回到物理检查才能抓住。一些实际操作层面的经验说完算例再把代码层面和模型层面的实际经验集中说一下。粒子群算法这种启发式算法单次运行结果存在随机性。算例对比时我坚持每个情景独立跑20次取平均结果和最好结果两个口径不能只贴一次运行的数据。碳捕集能耗我最初用常数近似后来发现准确性不足。捕集能耗应该跟捕集率呈近似线性关系但不同负荷水平下效率会变动。线性化后的模型足以反映调度层面的主要耦合关系但要意识到这是简化做敏感性分析时最好把能耗系数的波动区间一起测。改进粒子群算法是个组合拳混沌初始化、自适应权重、精英突变三者单独用各自都有效果但叠加起来效果最明显。我在调参时先固定前两个只调突变参数再固定突变参数反溯权重和学习因子的匹配度这样比全部参数一起调更容易收敛到稳定状态。多时间尺度的日前日内衔接实际代码里最简单的做法是先把日前结果固化日内优化时把机组启停变量锁死只优化出力修正量这样维度降低、计算量也小不少。如果一开始就把所有尺度全部放开粒子维度爆炸式增长求解质量会明显下降。最后再提醒一句不管算法改进得多花哨模型正确性永远是第一位的。先用一个已知结果的简单算例把代码逻辑全部验证通过再上完整模型这是所有做优化调度的人最应该养成的好习惯。跑出一个好看但物理上不可能的结果比算不出结果更麻烦。
阅读完成 · 觉得有帮助?
咨询建站