☰
多目标粒子群算法在冷热电联供综合能源系统运行优化中的应用
2026/10/15 9:16:02 网站建设 项目流程

一个综合能源系统,设备表摆在那里,负荷曲线测出来了,电价气价也都是公开的,优化到底在优化什么?说白了,就是在有限设备容量和能量耦合关系下,把每一台设备的出力安排明白,让整个系统在成本、能效、排放三个维度上都拿得出手。我接手这个项目的时候,第一反应也是先跑通一套能用的调度方案再说,但真正做进去之后才发现,难点不在调度本身,而在如何把三个互相打架的目标放同一个算法框架里一起优化。

这篇博文就以“基于多目标粒子群算法的冷热电联供综合能源系统运行优化”为主线,从系统建模、目标函数构造、MOPSO算法设计到代码实现和调参经验,完整梳理一遍我在实际项目中走过的路径。适合这几类读者:做综合能源调度的工程师、搞算法落地应用的研究生,以及想快速把多目标优化用在实际能源系统中的开发人员。看完你至少能拿到一套可以直接复现的框架思路。

1. 系统建模:先把冷热电联供的底子打清楚

1.1 为什么是冷热电联供,为什么非要运行优化

冷热电联供系统,英文缩写CCHP,核心思路就一句话:能源梯级利用。燃气轮机或内燃机先发电,发电产生的余热不扔,回收起来用于供热或制冷。相比传统的“电网买电 + 燃气锅炉供热 + 电空调制冷”各干各的模式,CCHP等于把一次能源压榨了多遍,系统整体效率能上到70%到90%。

但问题也来了。发电、供热、制冷三种能量需求在一天之内并不同步——白天电负荷高、晚上热负荷可能更高;夏天要冷、冬天要热。设备一多,耦合关系就复杂:燃气轮机发多少电,直接决定余热回收量;余热不够时燃气锅炉要不要补燃;吸收式制冷机吃余热,电制冷机吃电,两者怎么分配。每一个决策都牵一发动全身,靠人工经验排一张固定运行表,基本做不到最优。这就给运行优化算法留出了发挥空间。

1.2 系统拓扑与设备构成

我这次建模的典型系统,设备组成如下:

  • 燃气轮机:发电 + 产生高温烟气余热
  • 余热回收系统(余热锅炉):把烟气余热转化为蒸汽或热水
  • 蒸汽/热水型吸收式制冷机:用余热制冷
  • 电制冷机:用电驱动压缩制冷,作为冷负荷补充
  • 燃气锅炉:余热不足时补燃供热
  • 蓄电池:平滑电负荷波动、实现峰谷套利
  • 电网交互节点:允许从电网购电,条件允许时也可向电网售电

这套配置算比较标准的CCHP联供架构。建模时每个设备都得用数学表达式描述输入输出关系,不能简单写“功率=容量×负载率”,实际要靠效率曲线或者基准效率折算。

1.3 建模阶段的三条硬经验

第一,能量平衡约束必须严格写,不能拍脑袋省略。电平衡、热平衡、冷平衡各写一条等式,这是优化问题里最容易出错也最容易被人忽略的地方。第二,设备效率别全用常数。燃气轮机在部分负载下效率会掉,如果效率固定取额定值,优化结果偏向高负载工况,工程上就很失真。我在建模时把效率处理为负载率的分段线性函数,实测效果比常数效率好太多。第三,时间尺度统一。系统调度步长取1小时还是15分钟,直接影响决策变量规模和计算量。做典型日优化,1小时步长、24个时段就够了;做日内滚动优化,再考虑15分钟或30分钟粒度,不要一上来就追求细粒度。

2. 三个目标函数,光是把账算明白就够折腾

2.1 经济性目标:运行成本到底该怎么算

多目标优化的第一个目标是运行经济性,一般用系统在一个调度周期内的总运行成本表示。公式拆开来看,主要有四块:

  • 购电费用:从电网买电的成本,按分时电价计算
  • 燃料费用:燃气轮机和燃气锅炉消耗天然气的费用,按热值和气价折算
  • 设备运维费用:各设备出力对应的维护成本,通常用单位出力运维系数估算
  • 售电收益:如果政策允许向电网反送电,则作为负成本计入

我在代码中写目标函数时,用逗号表达“把每个时段的费用累加再汇总”,算出来的成本是24个时段的总和。这里有个实际细节:燃气轮机的燃料费用不能直接按发电量算,必须结合机组效率和天然气热值来反推耗气量。简单说,就是“电功率 ÷ 发电效率 × 热值”再乘以气价。不做这一步,成本会低估不少。

2.2 能效与环保目标:不能只算经济账

第二个目标是能源利用效率,常见做法是用一次能源利用率(PESR)来评估。PESR的物理含义是系统输出的总能量(电+热+冷)与输入的一次能源总量之比。输入一次能源包括天然气和电网购电对应的等效一次能源。追求的目标就是让这个比值尽可能高。

第三个目标是碳排放量。系统碳排放主要来源于两部分:天然气燃烧产生的直接排放、外购电力对应的间接排放(按电网碳排放因子折算)。目标函数里写成总碳排放量最小化即可。工程上取区域电网平均排放因子是常见简化做法,不丢主流精度。

实际项目中,这三个目标往往是矛盾的:想把成本压到最低,可能会多用便宜的网电、少烧气,但网电排放因子高,排放目标就恶化;想多利用余热提升能效,又可能受限于负荷匹配必须开启辅助设备。所以不能用单目标优化硬压成一个加权和,这恰恰是采用多目标算法的根本原因。

2.3 约束条件:等式约束、不等式约束一个都不能漏

约束分三类:

  • 功率平衡约束:逐时刻电、热、冷的供需平衡,写为等式约束
  • 设备出力上下限约束:每台设备出力在最小技术出力和额定容量之间
  • 储能约束:蓄电池的SOC在上下限之间,充放电功率受限,且S OC初值等于末值

约束怎么处理直接决定算法能不能收敛到可行域。我的经验是:不等式约束用罚函数处理,等式约束先尝试修复(把平衡偏差强行分摊给可调设备),修复不了再加惩罚。这种方法比纯靠惩罚项把所有约束打包处理要稳定得多。

3. 多目标粒子群算法:从单目标到Pareto前沿的跃迁

3.1 粒子群优化(PSO)的底子

传统粒子群算法是受鸟群觅食启发的群体智能算法。每个粒子代表一个候选解,粒子在搜索空间中飞行,飞行方向由三个因素决定:自身惯性、个体历史最优(pbest)、群体历史最优(gbest)。速度更新公式是:

v_i(t+1) = w * v_i(t) + c1 * r1 * (pbest_i - x_i) + c2 * r2 * (gbest - x_i) x_i(t+1) = x_i(t) + v_i(t+1)

w是惯性权重,c1、c2是学习因子,r1、r2是[0,1]的随机数。

单目标PSO很成熟,但拿到多目标问题上来,事情就变了。因为不存在唯一的最优解,而是一组互不支配的Pareto最优解集。这时“谁是最优粒子”这个问题没法直接回答,需要重新设计。

3.2 MOPSO的核心机制:外部档案、归档修剪、gbest选择

多目标粒子群算法相较PSO,最主要的进化有三个地方。

第一,外部档案维护。需要一个外部存档(Archive)来存放当前找到的非支配解,每一轮迭代后把新解与档案里的解做Pareto支配比较。如果一个新解支配了档案里的旧解,旧解出局;如果互不支配,新解入档;如果被支配,丢掉。档案容量有限,满了之后要用剪枝策略淘汰多余解。

第二,全局引导选择。gbest不能直接选“最优粒子”,而是从外部档案中挑一个。挑选方式关系到解的分布性,常用做法是按档案中解的拥挤度密度来选择,密度越低的位置越容易被选中,这样能引导粒子去探索稀疏区域。

第三,自适应网格机制。把目标空间划分为网格,统计每个网格内的解的个数,作为拥挤程度估计。密度最小的网格优先被选为gbest来源,同时在归档修剪时优先删除密度大网格中的解。这套机制实现起来并不复杂,但效果比随机删解好得多。

3.3 我在MOPSO里加的三个实用改造

直接套论文里的标准MOPSO也能跑,但要工程上稳定,我做了三处改动。

一是惯性权重动态递减。迭代早期w大,粒子全局搜索能力强;后期w小,局部精细搜索。我常用线性递减,从0.9降到0.4。二是引入变异操作。迭代过程中按一定概率对粒子位置进行扰动重置,这个操作能有效防止整个种群收敛到某个局部Pareto前沿片段,保证解的多样性。三是速度边界和位置边界分开处理。粒子速度限制在最大速度以内,位置越界时重置到边界,而不是简单截断,否则大量粒子会挤在边界上,多样性会稀烂。

4. 编码设计与代码架构:把想法变成能跑的优化引擎

4.1 决策变量编码:选什么作为粒子位置

多目标粒子群算法解决系统的运行优化,决策变量怎么取是第一个问题。我的做法是:把每个时段内各台设备的出力值作为决策变量。

以24个时段为周期,假设系统有5组可调设备(燃气轮机、燃气锅炉、吸收式制冷机、电制冷机、蓄电池),那粒子维度就是24乘以5等于120维。每个维度的取值范围就是对应设备的出力上下限。蓄电池维度取充放电功率,SOC通过递推公式算出。

这样编码直观,但维度较高。另一种做法是比例编码,把每台设备出力表示成该时刻对应负荷的比例,好处是天然处在合理范围附近,收敛更快。我建议工程上先用比例编码跑通,再用绝对出力编码精调,两种模式在代码里做成可切换的配置项。

4.2 主循环结构:从初始化到Pareto前沿输出

主循环代码结构大致是:

初始化粒子种群 初始化外部档案为空 for iter in range(max_iter): for each particle: 解码粒子得到设备出力序列 调用系统模型计算目标函数值、约束违约量 更新pbest(基于约束支配排序) 比较外部档案,更新Archive for each particle: 从Archive中选择gbest(基于网格密度) 更新速度和位置 处理边界 以一定概率执行变异 输出Archive中的Pareto前沿

重点在于目标函数计算和归档更新这两个模块,做得干净,算法就稳定大半。

4.3 三个容易踩坑的实现细节

代码层面我踩过的坑,整理出来对大家比对有用。

第一个坑是目标函数计算模块里的单位不统一。成本是元,碳排放是千克,PESR是百分比。三者量级差距大,在计算拥挤距离时如果不做归一化,量级大的目标会完全主导排序结果。我的处理方式是先把三个目标分别映射到[0,1],再做Pareto比较和密度估计。

第二个坑是功率平衡修复的优先级。冷热电三类平衡,优先修电平衡,因为电平衡涉及蓄电池和电网交互,调节空间大;热平衡和冷平衡分别与余热分配、制冷机分配强耦合,修复时要注意设备的出力范围不被破坏。修复逻辑放到“罚函数之前”,能修复的先修复,修复不了的才计入惩罚项。

第三个坑是外部档案的重复解问题。粒子多轮迭代后,很多解目标值完全相同,会占满档案空间,导致多样性假象。判断“重复”时不能直接比对浮点数,要把目标值保留到小数点后三位再比较。这一招操作简单,但对档案有效利用率的提升立竿见影。

5. 典型日优化结果:Pareto前沿到底怎么分析

5.1 实验场景与参数设置

我拿某典型园区的典型日数据做验证,夏季工况,包含典型电、热、冷负荷曲线。系统参数尽量采用工程基准值:燃气轮机额定容量若干兆瓦级,余热回收效率0.7左右,吸收式制冷机COP约1.2,电制冷机COP约3.5,蓄电池容量按园区峰值负荷的一定比例配置。天然气价格、分时电价采用当地实际数据。

MOPSO参数设置如下:

参数取值
种群规模100
迭代次数200
外部档案容量80
惯性权重范围[0.4, 0.9],线性递减
自我学习因子c11.6
社会学习因子c21.8
变异概率0.1
网格划分数10×10

这个参数组合经过多次调优,算是在收敛速度和解集分布性上比较均衡的一组值。

5.2 Pareto前沿的形态与折中解选取

跑完200次迭代后,外部档案里留下了一批非支配解,它们在三维目标空间里形成一个曲面。为了方便看,我把PESR固定或投影,用“成本-碳排放”二维平面展示前沿曲线。

典型的Pareto前沿呈“L”形或外凸曲线:越靠近左端,成本越低,但碳排放偏高;越靠近右端,碳排放越低,但成本上去了。端点解的经济最优与环保最优是矛盾的直观体现。

实际项目里决策者并不需要全部Pareto解,需要一个或多个折中解。最常用的选解方法是模糊隶属度法:对每个目标值归一化后计算综合满意度,选择满意度最高的解作为推荐运行方案。还有一种做法是让运行人员直接指定偏好权重——例如成本权重0.4、能效权重0.3、碳排放权重0.3,在Pareto前沿面上找到最靠近偏好方向的那个解。这个思路对应“偏好多目标优化”,工程落地很容易。

5.3 与常规规则策略的对比

为了验证优化效果,我把MOPSO生成的推荐方案与两种传统规则策略做了对比:

策略总运行成本碳排放量一次能源利用率
跟随电负荷策略(FEL)基准基准基准
跟随热负荷策略(FTL)略低略低略高
MOPSO折中解明显更优明显更优更优

需要说明的是,规则策略的结果也是经过合理调度假设得到的,不是随便拍的。MOPSO优化后,成本能再压8%左右,碳排放能再降10%左右。这个提升幅度在能源系统里已经相当可观,折算到全年运行就是一笔不小的费用和碳配额优势。

6. 调参实战:从结果劣化到逐步可靠的排错经验

6.1 粒子数与迭代数:不是越多越好

我最早跑实验时粒子数设到300,迭代数设到500,结果跑了特别久,Pareto前沿却没有明显改善。后来把粒子数降到100、迭代数降到200,效果基本没差。原因在于,CCHP优化问题虽有120维决策变量,但可行域形状相对规整,粒子群在这个量级已经足够覆盖。

我的经验值是:典型日静态优化,粒子数80到150,迭代150到250足够;如果做日内滚动优化,每个时段单独优化,粒子数可以降到50。跑之前先做一组“计算时间与前沿质量”的权衡实验,别一上来就堆算力。

6.2 惯性权重和学习因子:经典参数区间就很好用

惯性权重设成线性递减0.9到0.4,效果稳定。有段时间我试过自适应惯性权重更新策略,结果收敛反而变慢。原因可能是目标空间中多个Pareto解并存的复杂结构,过快降低惯性会导致粒子丧失全局探索能力。

学习因子c1、c2取1.5到2.0之间,保持c1和c2相近即可。c2过大会导致粒子过度向档案解聚集,Pareto前沿边缘开发不足;c1过大会让粒子越来越“自我”,收敛太慢。真要微调,建议观察“档案新增数量随迭代的变化曲线”,如果后期新增率突然暴跌,再回头调参数。

6.3 惩罚系数的平衡:太大太小都出事

约束处理是调参里最容易出问题的一环。惩罚系数设太大,粒子一旦越界目标值就被拉爆,大量粒子涌向可行域边界,Pareto前沿的稀疏部分会被忽略;设太小,不可行解大量混进档案,前沿看上去很满,但很多点实际不可行。

我的做法是把约束违约量分成两类:等式平衡偏差用单独的小惩罚系数,不等式越界用大惩罚系数。调试时先看档案里可行解占比,如果低于80%,惩罚系数往大调;如果Pareto前沿边缘出现“断崖式”缺失,说明惩罚过重。这个消除不可行与维持分布性之间的平衡,是整个调参过程的核心。

6.4 归档过满与前沿丢失的排查

最让我头疼的一次问题是:Pareto前沿的形状跑着跑着从完整曲线变成几个孤立点簇。排查了半天,发现是归档更新逻辑写错了——新解与档案中某个解互不支配时,我把双方都保留下来,但档案容量有限,一旦满了就被网格密度大的位置强制踢人,结果边缘解大量丢失。

修正方法很简单:当档案达到容量上限时,优先移除网格密度最大区域内的解,并且在插入新解之前先判断该解是否在稀疏区域内。若在稀疏区域,即使暂时超容量,也允许暂存再进行修剪。这个策略被很多MOPSO论文称为epsilon归档,实际操作效果很好。

最后再分享一点我自己的体会

整个项目做下来,最耗时间的不是算法代码本身,而是设备模型定参和约束梳理。MOPSO作为一种算法框架已经非常成熟,但能源系统优化的瓶颈往往在模型精度。效率曲线差几个点,优化结果可能偏掉很远。

另一个体会是别一上来就追求“三目标全优化”。我建议先跑通单目标经济性优化,验证设备模型和负荷平衡逻辑没有bug;再加排放目标跑双目标;最后才上三目标。这种渐进式调试方式能帮你把问题定位得很清楚,省下大量排查时间。

如果你准备在自己的项目里复现这套流程,可以直接从我前面给出的编码方式和主循环结构入手,先把单目标PSO跑通,再逐步加入外部档案、自适应网格和归档修剪逻辑。一步一个脚印,这个系统优化工具会很听话地为你工作。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询