基于多目标粒子群算法的CCHP综合能源系统运行优化策略
1. 综合能源系统运行优化到底优化什么先拆解CCHP系统的运行面1.1 冷热电联供不是简单的三联供设备堆叠很多人第一次接触冷热电联供综合能源系统容易把它理解成燃气轮机余热锅炉溴化锂机组三套设备的简单拼接。我在实际项目里见到的真实情况是设备侧的耦合关系远比想象中复杂而运行优化的空间恰恰就藏在这些耦合关系的缝隙里。一个典型的CCHP系统能量流是这样走的燃气轮机或内燃机烧天然气发电发电后的高温烟气进入余热回收装置一部分变成蒸汽或热水去供热另一部分进入吸收式制冷机变成冷冻水供冷。如果还有电制冷机、燃气锅炉、蓄能装置、光伏和储能电池那整个系统的能量流就不是一条线而是一张网。这张网上每一个节点的设备特性都不一样燃气轮机的电效率随负荷率变化余热回收量随机组功率变化吸收式制冷机的COP随冷冻水温度变化电制冷机的能耗随室外湿球温度变化。设备之间的能量转换还会相互影响——比如多发一度电意味着多产生一份余热这份余热你不管是用掉、存起来还是排掉都直接影响整个系统下一时刻的供热和供冷策略。所以运行优化的第一步不是急着写算法而是先把这张能量网梳理清楚哪些设备能互相替代、哪些约束是硬性的、哪些变量可以调。比如夏季某个时段冷负荷上涨你可以选择多开电制冷机也可以选择提高燃气轮机出力让吸收式制冷机多出力前者耗电、后者耗气还附带多发了一部分电。哪个方案更划算这就是优化问题。1.2 为什么说运行优化是系统收益的最后一公里设备选型和容量配置解决的是能不能供得上的问题运行优化解决的是怎么供最划算的问题。一个设计得很好的联供系统如果运行策略不当年运行成本可能比粗放运行高出10%到15%。在大宗能源价格波动剧烈的时期这个差距会直接决定项目是盈利还是亏损。我见过一个园区项目燃气轮机选型合理、余热利用链条完整但运行人员习惯性地以热定电——就是先满足热负荷再根据余热量来确定发电量。这种策略在整个系统里很常见运维省心但它完全放弃了时间维度上的优化同样是满足今天的电负荷和热负荷上午多发电多蓄热、下午少发电从电网购电和全天恒定出力运行成本可能差出几千块。日积月累这笔账相当可观。运行优化要回答的问题包括每一小时燃气轮机发多少电从电网买多少电或者卖多少电蓄电池是充是放、充放多少蓄水罐是蓄热还是放热吸收式制冷机和电制冷机按什么比例分摊冷负荷这些问题的答案叠加起来就是一套完整的日前调度方案。1.3 运行优化的三类典型场景日前调度、日内滚动、实时调整不同时间尺度下优化问题的数学模型完全不同工程上的处理方式也不一样日前调度以未来24小时为优化周期时间尺度1小时基于日前电价、负荷预测值确定各设备的逐时出力计划。这是运行优化最核心的场景也是多目标粒子群算法最典型的用武之地。日内滚动每15分钟到1小时滚动优化一次更新未来4小时到8小时的调度计划主要应对负荷预测偏差和可再生能源出力波动。实时调整秒级到分钟级处理瞬间的功率平衡和设备跟踪偏差通常由下层控制器完成一般不参与多目标寻优。我接下来说的算法设计主要针对日前调度这个层面。它的结果直接决定日内滚动优化的参考曲线把这一层做好整个系统的运行水平就有了基本盘。2. 为什么选多目标粒子群算法从目标冲突和算法特性说起2.1 多目标问题的核心是目标冲突而非单点最优CCHP系统运行优化的第一个特点是它压根不存在唯一最优解。你想让运行成本最低往往得多开燃气轮机多发电减少高价时段从电网购电但多发电同时带来更多碳排放环保指标就变差了。反过来想控制碳排放就得少烧天然气、多用网电但经济性又会变差。你要是想提高能源利用率那就得想办法让余热全部被利用——可夏季冷负荷低而电负荷高的时候多余的热量排不掉能源利用率就是上不去。这种此消彼长的关系在数学上叫目标冲突。处理目标冲突的正确方式不是找到某一个最优解而是找出一组非劣解——也就是Pareto前沿。什么叫非劣解就是在这组解里你没有办法在不恶化一个目标的前提下改进另一个目标。整个Pareto前沿上的解都是好解至于选哪个取决于决策者更看重经济性还是更看重环保性。单目标优化算法在这里会面临一个尴尬你得把多个目标加权求和变成单一目标但权重怎么定不同季节、不同能源价格下成本和碳排放的权重关系完全不一样。加权法还有一个更麻烦的问题——目标函数量纲差异巨大成本是几万块钱的量级碳排放是几十吨的量级直接把碳排放在目标函数里加权重优化器会完全无视碳排放这个目标。2.2 MOPSO相比其他求解器的三个底层优势解决多目标问题业界成熟算法有NSGA-II、MOEA/D、SPEA2等进化算法多目标粒子群算法MOPSO能在其中占据一席之地主要靠三个特性第一收敛速度快。粒子群算法本质上是在解空间里通过个体历史最优和全局历史最优的引导进行搜索没有传统进化算法那样的选择、交叉、变异操作也没有二进制编码和解码过程。在CCHP这种决策变量是连续实数比如功率出力值的问题里粒子群直接在连续空间里飞收敛速度明显快于需要交叉变异的遗传算法。第二对连续变量的适应性强。CCHP运行优化的大部分决策变量是连续的燃气轮机出力、购电量、蓄能装置充放功率。虽然也有机组启停这种0-1变量但整体上是一个混合整数问题实数的比例很高。粒子群恰好擅长连续实数空间的寻优处理起来很自然。第三实现简单、改造成本低。多目标粒子群的核心就是三件事维护一个Pareto外部档案、从档案里选全局最优、做变异和拥挤度删减以保持解的多样性。这些都可以在标准粒子群代码上增量实现不需要大规模重写。实际工程里算法越简单越容易集成到现有的调度平台里也越容易被后来的人接手维护。我并不是说MOPSO在所有场景下都碾压NSGA-II——在离散变量极多、约束极强的问题里NSGA-II的种群多样性控制往往更稳。但在CCHP运行优化这个具体领域MOPSO的综合性价比是高的。后面我会用算例数据说明。3. CCHP系统建模把物理设备翻译成约束方程3.1 设备模型的三个层次容量模型、效率模型、动态约束写优化算法之前先要有设备模型。模型不是越精细越好过度精细的模型会让优化问题变成无法求解的黑洞模型太粗又有可能给出物理上根本做不出来的方案。我习惯把设备划分成三个层次来建模容量模型确定设备的出力上下限。燃气轮机在某一时刻的出力区间是[P_min, P_max]蓄电池的荷电状态要维持在[SOC_min, SOC_max]之间充放电功率有上限。这些约束很硬违反就意味着设备不可用。效率模型描述设备输入输出之间的关系。燃气轮机的发电效率不是常数而是随负荷率变化的一条曲线——低负荷率时效率低接近额定负荷时效率高。工程上可以用分段线性化或者二次多项式拟合厂家提供的性能曲线。吸收式制冷机的COP一般为0.7到1.3电制冷机在满负荷时的COP可以到4.5以上但部分负荷时COP会衰减。这些曲线直接影响优化结果不能偷懒用固定值。动态约束主要针对蓄能设备。蓄水罐的蓄热量是上一时刻的蓄热量、当前时刻的充放热功率和散热损失共同决定的蓄电池的SOC和充放电功率之间是积分关系。这类约束让优化问题带上时间维度也是运行优化相比单时刻潮流计算更复杂的核心原因。3.2 目标函数怎么定成本、碳排放、能源利用率分别怎么算多目标粒子群算法里三个目标函数是标准配置经济性目标总运行成本最小化C_total C_fuel C_grid_buy − C_grid_sell C_om其中C_fuel是天然气消耗成本C_grid_buy是向电网购电费用C_grid_sell是向电网售电收益如果有余电上网的条件C_om是设备运维成本。购电价在峰谷时段差异很大这才是运行优化能产生经济价值的根本原因。环保性目标碳排放最小化E_total E_grid E_fuelE_grid是购入电力在电网侧折算的碳排放E_fuel是天然气燃烧的直接碳排放。需要注意的是不同区域的电网排放因子差异较大这直接影响优化结果中多发电和多购电之间的平衡点。能耗目标一次能源利用率最大化η (P_e Q_h Q_c) / (F_fuel F_grid)分子是本时段系统输出的电、热、冷三种能量的总和分母是一次能源消耗总量其中购电量按火力发电平均效率折算为一次能源。这个指标衡量的是系统的综合能量转换效率。三个目标维度不同、量纲不同这也是必须用多目标算法而不是加权单目标算法的根本原因。3.3 约束条件里最容易被忽略的环节爬坡约束和供能平衡写约束条件时新手最容易漏掉的是两个一个是爬坡约束。燃气轮机不是你想让它从50%负荷瞬间跳到100%它就能跳的机组每分钟的功率变化率有上限。在日前调度的1小时步长模型里这个约束表现为相邻时段出力的差不能超过某个阈值。漏掉这条约束的后果是优化结果看起来漂亮但送到现场根本无法执行。另一个是电热冷供能平衡约束。每个时刻系统输出的电量加上购电量要等于电负荷加上电制冷机耗电如果有电储能还要算上储能充放电系统输出的热量要等于热负荷加上蓄热充放热量冷量同理。这些是等式约束也是整个优化问题里最容易破坏约束的环节——因为一旦某个设备出力越界平衡等式立刻被打破。后面讲约束处理方式时我会再次提到。4. MOPSO算法设计编码方式、参数整定与迭代流程4.1 粒子编码决策变量怎么排多目标粒子群的第一步是确定粒子怎么编码。在日前调度问题里优化周期是24小时步长1小时所以每个决策变量都是一个长度为24的向量。我这里以一个典型的CCHP系统为例决策变量包括燃气轮机逐时出力 P_gt(t)t 1...24从电网逐时购电量 P_grid(t)电制冷机逐时制冷量 Q_er(t)蓄水罐逐时蓄热/放热量 Q_tes(t)放热为正蓄热为负蓄电池逐时充放电功率 P_bat(t)放电为正充电为负这样单个粒子的维度就是24×5 120维。每个粒子代表一套完整的24小时调度方案粒子群算法就在这个120维的空间里搜索。有些设计会把燃气轮机的启停状态也作为0-1变量加进来。但0-1变量在粒子群里的处理很麻烦——粒子速度更新公式是连续空间的算法碰到离散变量只能强转或取整取整又会造成约束轻微偏离。我的做法是在连续优化的基础上启停判断放在约束处理环节比如当燃气轮机出力低于某个阈值时视为停机停机状态下余热回收量为零。这样既保留了粒子群连续寻优的优势又兼顾了启停逻辑。4.2 参数整定种群规模、迭代次数、惯性权重、学习因子的影响参数整定是MOPSO落地时最需要花时间的环节。我给出的基准参数来自多个项目的实际调试经验可以作为起步值种群规模100到200。CCHP问题的决策变量维度在100左右种群规模小于50时Pareto前沿覆盖会很差大于300则单次迭代计算量剧增收敛速度并不会成比例提升。迭代次数300到500次。以100个粒子为例500次迭代意味着5万次适应度评估而每次适应度评估都要跑24小时的约束平衡计算总体计算时间是分钟级别可以接受。超过800次迭代对结果改进很有限。惯性权重ω采用从0.9到0.4的线性递减策略。前期大权重保证全局搜索能力后期小权重加强局部精细搜索。这个策略简单有效比固定权重效果好得多。学习因子c1、c2取1.5和1.5或者1.8和1.3。c1控制向个体历史最优学习的倾向c2控制向全局最优学习的倾向。在多目标场景下如果c2过大粒子会过早集中到某一小片Pareto区域导致其他区域解缺失。变异概率0.1左右每10个粒子有一次随机扰动用于维持种群多样性防止坍缩到局部非劣区域。4.3 外部档案与拥挤度删除策略多目标粒子群和单目标粒子群最大的区别在于需要一个外部档案来存放搜索过程中发现的非劣解。每次迭代后把当前种群里的非劣解和档案里的旧解合并做Pareto支配筛选被支配的解删除留下来的都是互不支配的非劣解。当档案容量超过上限我习惯设为100到200个解时需要删掉一部分解来给新解腾位置。删除的原则很简单优先删拥挤区域里的解保留稀疏区域的解这样最终得到的Pareto前沿分布更均匀。拥挤度计算的方法很直接把档案里的解按每个目标函数排序计算每个解在目标空间里与其邻近解的密度——密度越大代表这个解周围已经有足够多的替代方案删掉它对前沿覆盖的影响最小。4.4 Pareto前沿的收敛与均匀性权衡实际跑算法的时候你会观察到这样几个阶段的现象前50次迭代Pareto前沿快速向真实前沿逼近解的分布乱七八糟100到200次迭代前沿逐渐成形但某些区域还有空洞300次以后前沿的整体位置基本稳定只剩边缘区域的解在缓慢改善。这时候你要做一个工程决策是追求前沿的极度收敛还是追求解的均匀分布。如果最终目的是给决策者提供几个代表方案那么前沿边缘的极端解比如纯经济优先、纯环保优先很重要如果目的是形成一个可以插值调用的调度策略库那么中间区域解的均匀性更重要。我的经验是与其无限加大迭代次数不如在300次迭代后做一个局部搜索对现有档案里的解做小幅度扰动并重新评估。这样既能改善前沿的均匀性又能让部分解更接近真实前沿计算代价比整体增加迭代次数小得多。5. 算例验证与结果解读从Pareto前沿到调度策略落地5.1 算例设置与基础数据用一个典型园区CCHP系统的冬季工况来说清楚整个流程。系统配置如下燃气轮机额定功率500 kW发电效率40%余热回收效率75%余热锅炉额定供热量375 kW500kW × 0.75吸收式制冷机额定制冷量250 kWCOP 1.2电制冷机额定功率150 kW额定COP 4.5蓄水罐容量2000 kWh蓄放热功率上限300 kW天然气价格3.5元/立方米低热值按9.5kWh/m³折算峰时段电价1.0元/kWh8:00-11:0018:00-21:00平时段电价0.7元/kWh谷时段电价0.4元/kWh23:00-7:00电网排放因子0.581 kgCO2/kWh天然气排放因子0.22 kgCO2/kWh冬季某天的逐时电负荷在350-650 kW之间起伏热负荷在200-500 kW之间波动冷负荷为0冬季不需要供冷。5.2 结果解读为什么经济性目标和环保性目标此消彼长用MOPSO跑500次迭代种群规模150外部档案容量100得到的Pareto前沿大致是一条向右下的曲线。我取三个典型解做对比纯经济最优解总运行成本约2.81万元碳排放约11.2吨。此方案在谷时段大量购电蓄热峰时段燃气轮机满发并尽可能少购电。中间折中解成本约3.05万元碳排放约9.8吨。燃气轮机全天保持较高出力少了一部分低电价蓄电高电价放电的套利操作。纯环保最优解成本约3.42万元碳排放约8.5吨。燃气轮机只在热负荷很高的时段运行其余时段全部从电网购电。看数据就很直观从纯经济解切换到纯环保解成本增加了6000元左右但碳排放减少了2.7吨。如果项目面临碳配额约束那么每吨碳排放的边际成本就是6000/2.7 ≈ 2222元/吨这个换算关系恰好是决策者最需要的——它把环保目标翻译成了可比较的经济语言。还有一个值得注意的现象三个方案的燃气轮机平均出力差距并没有想象中那么大因为冬季热负荷本身比较高吸收式供热的余热需求决定了燃气轮机不能长时间停机。这说明在冬季工况下经济性和环保性的冲突被系统架构天然地缓和了一部分。真正的目标冲突最激烈的时间是过渡季无需供热的春秋季冷热负荷都很低燃气轮机发不发、发多少经济性和环保性就会产生剧烈矛盾。5.3 从Pareto解集到可执行的调度方案决策方法Pareto前沿是一堆解但现场运行只需要一个方案。把前沿上的解转化为可执行调度计划有两种常见做法第一种是目标偏好法。项目方明确说成本权重0.6碳排放权重0.4那就按这个偏好在前沿上找一个折中解。具体操作是把前沿上的每个解的两个目标值做归一化按权重计算加权距离距离最小的解就是要选的方案。第二种是模糊隶属度法。对每个解计算它在每个目标上的隶属度隶属度越高代表这个解在该目标上越接近理想值。综合隶属度最高的解就是最佳折中解。这个方法的好处是不需要决策者事先设定权重而是从解的几何位置自动寻找最不偏科的方案。我实际项目里推荐的做法是两步走先用模糊隶属度法自动选一个基准方案把这个方案的经济性、碳排放指标给业主看然后在Pareto前沿上让业主自己微调选择几个备选方案。大多数业主拿到两个选项就明白怎么回事了比上来就甩一堆专业术语有效得多。6. 工程实现中容易踩的坑从仿真到项目落地6.1 算法收敛慢不一定是迭代次数不够如果你跑MOPSO发现Pareto前沿长时间不推进不要急着加迭代次数。先检查三件事第一决策变量的上下界是否合理。如果燃气轮机出力的上限写成了额定功率而实际上夏季因为环境温度高存在降容出力上限降到额定值的85%到90%那么算法会在一个错误的可行域里搜索收敛得再好也是白搭。第二等式约束的处理方式。CCHP的电热冷平衡是等式约束粒子群算法天生不知道等式约束是什么。你必须在适应度评估时主动让解满足等式约束——具体做法是给定一个决策变量比如燃气轮机出力用平衡等式推导出另一个决策变量比如购电量这样等式约束就自动满足了。如果反过来用罚函数处理等式约束很多解会以微小的平衡偏差逃离惩罚跑出来的方案现场根本没法用。第三目标函数的计算耗时。24小时的模型每次评估都要循环24次计算平衡、累积成本和排放。如果目标函数里又嵌套了效率曲线的插值计算单次评估可能从微秒级恶化到毫秒级。5万次评估就是几十秒到几分钟。这个耗时不是算法问题但会直接影响你调参的效率。优化的思路是把效率曲线预计算成表格用向量化运算替代循环。6.2 约束处理方式直接决定解的质量罚函数法在多目标粒子群里是最容易出问题的环节。罚因子设小了大量违反约束的解混在Pareto前沿里罚因子设大了可行域外的解全部被淘汰种群多样性锐减算法容易早熟。我的处理原则是等式约束尽量消元不等式约束用动态罚函数。等式约束电平衡、热平衡、冷平衡用消元法。上文已经讲过通过平衡等式计算某个决策变量从根本避免违反等式约束。不等式约束设备上下限、爬坡约束、SOC约束采用罚函数但罚因子要随迭代次数递增。前期罚因子小让粒子在宽松条件下充分探索空间后期罚因子大把粒子赶回可行域。这样兼顾了搜索广度和解的可行性。另外一个细节是SOC约束和爬坡约束求的是整个调度周期的可行性而非单时刻。所以罚函数计算要扫一遍整个24小时序列任何时刻违反都要计入惩罚。这个逻辑要在代码里写得非常明确否则很容易只检查了最后一个时刻的状态导致中间时段严重越界。6.3 从仿真到项目落地的几个现实问题算法在仿真环境跑通了不等于现场能用。我认为最值得提前考虑的几个问题负荷预测精度是运行优化的隐形天花板。算法再先进输入的电负荷、热负荷预测偏差超过15%优化结果就没有实际意义。我见过不少项目把优化系统建好了最后因为负荷预测不靠谱调度人员还是手动操作。所以运行优化项目一定要和负荷预测模块强绑定至少要做到每小时的滚动修正。运行策略的鲁棒性。Pareto前沿上选出来的解是不是在各种边界条件下都能稳住我建议做一次简单的蒙特卡洛模拟把负荷和电价加一些小扰动重新评估选中方案的经济性和碳排放。如果目标值波动超过5%说明这个方案太脆了换一个前沿上更中庸的解会更务实。还有一个小细节容易被忽略蓄水罐的散热模型。很多教材模型假设蓄水罐完全绝热但实际上蓄水罐的散热损失每小时可能到1%到3%在24小时的调度周期里累计影响不小。如果不把这个损失加进模型优化出来的蓄热策略会偏乐观。6.4 后续还能往哪些方向扩展最后说一下我看到的扩展方向。多目标粒子群解决了给定设备配置和负荷曲线怎么运行最划算的问题但它没有解决设备容量怎么定、能源价格结构变化后运行策略要不要重构这两个更上层的问题。设备容量优化本质上是一个双层优化问题外层用遗传算法或粒子群算法搜索设备容量组合内层把容量代入运行优化模型求最优运行策略。这两个维度耦合在一起计算量是指数级增长多目标粒子群在这里的优势是模块化——内层的求解可以直接复用现有的MOPSO架构外层管容量内层管运行层次清晰。另外随着更多园区引入光伏和储能CCHP系统变成了综合能源系统运行优化的时间尺度越来越细不确定性越来越强。我最近在探索的做法是把日前调度的Pareto前沿保留下来日内滚动优化时把偏离日前基准解的程度作为额外目标这样既保留了多目标的灵活选择空间又兼顾了日内调整的稳定性。动笔之前我还想说一句运行优化这个领域算法永远只是半条腿另外半条腿是对物理系统的深刻理解。多目标粒子群再通用放到一个你完全不知道内部能量耦合关系的系统上出来的结果大概率是数学上好看、工程上没法用。反过来把设备的每一条性能曲线都摸透了哪怕用最朴素的线性规划也能做出一套不差的调度方案。先懂系统再谈算法这个顺序不能乱。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →