
做综合能源系统优化的朋友对这个方向肯定不陌生。冷、热、电、气四类能量在园区或建筑层面耦合起来燃气轮机发电、余热回收制冷制热、不足的部分用电或燃气补充再叠加上需求响应和碳交易这两个市场化机制——这基本就是当前综合能源系统优化研究的标准配置。题目标题里的“采用Cplex求解”则是这个领域最常见的落地方式把系统建模成一个混合整数线性规划问题交给商业求解器去算最优调度计划。这篇文章我把自己做这类项目的完整思路、建模细节、求解技巧和踩坑记录整理出来。准备做类似方向毕业设计、科研项目或者在实际园区里搞过能源调度、想系统了解模型写法的朋友可以直接照这个框架去搭。整个研究的内核可以概括成一句话在满足冷、热、电、气负荷需求的前提下考虑用户侧可调节的响应能力以及碳排放配额和碳价带来的成本信号以总费用最小为目标求解未来24小时或更长时间尺度内各设备的出力计划。别看这句话简单真把模型写出来、让Cplex稳定求出结果、再让结果能讲出道理每一步都有不少细节。1. 先搞清楚这个研究到底在算什么1.1 四联供系统到底长什么样所谓四联供是指系统同时供应冷、热、电、气四种能量形式。注意这个“气”有两层含义一是天然气作为燃料输入驱动燃气轮机和燃气锅炉二是某些场景下天然气本身也会直接供给用户比如餐饮用气、工业用气不过绝大多数优化研究中气主要作为燃料侧出现实际优化变量是“买多少气”以及“气如何分配给不同设备”。典型场景我习惯拿一个综合园区举例。园区里有办公楼、实验室、食堂可能还有小型数据中心。楼宇有电负荷、冬季有热负荷、夏季有冷负荷。能源站里装了一台燃气轮机烧天然气发电发电的同时产生高温烟气通过余热锅炉回收变成蒸汽或热水。这部分余热一部分直接供热一部分进入吸收式制冷机变成冷水供冷。如果余热不够就用燃气锅炉补热或者用电制冷机补冷。电不够就从电网买电电多了也能反售给电网。再加上电储能、蓄热罐、蓄冷罐整个系统的能量流动网络就成型了。这个构型为什么流行因为它抓住了联供系统最核心的经济逻辑燃气轮机发一度电大约产生1.5到2.5倍于发电量的余热这些余热如果不利用就直接排掉了利用起来制冷或供热替代了原本要用天然气或电去产生的冷热量综合能源利用效率可以大幅提升。优化的本质就是在不同时段、不同价格信号下决定每一度气是“先发电再用热”更划算还是“直接烧锅炉”更划算。1.2 需求响应和碳交易为什么会改变调度结果很多人一开始想不明白没有需求响应和碳交易系统已经能优化了加上这两个机制到底改变了什么先看需求响应。传统优化把负荷当成刚性数据空调该开多少就是多少电梯该跑就跑。但实际上楼宇负荷有相当大的柔性。夏天最热的时候办公室空调温度从24度调到26度人的体感变化不大但冷负荷能降下去一块工厂里某些可中断工序被通知后在高峰时段停一小时补偿一点费用给用户电网削峰效果立竿见影。需求响应引入后负荷从“不可动”变成了“可削、可移、可调”这等于给优化问题增加了新的自由度。优化的结果会倾向于在电价高的时段削减或转移用电在碳价和电价叠加的尖峰时段更加明显。再看碳交易。传统优化只算经济账烧多少气、买多少电乘以价格就行。碳交易加入后碳排放本身变成了一项有价格的“资源”。免费配额就像政府发的“碳排放额度信用卡”实际排放一旦超过额度就得去碳市场买配额低于额度富余的配额可以卖钱。于是燃气轮机什么时候开、开多少不再只看气价和电价还要看天然气燃烧产生的碳排放成本以及从电网购电对应的间接排放成本。当碳价升高时系统可能倾向于减少低效机组的出力或者调整天然气和电网购电的比例。这正是碳交易机制发挥减排引导作用的具体体现。1.3 研究路线总览按我自己的经验这类研究的标准路线分四步走。第一步搭系统架构确定设备类型、容量、效率参数明确能量流动方向第二步数学建模写目标函数和约束条件本质是把物理规律和经济规则翻译成数学表达式第三步求解分析用Cplex等求解器计算最优调度方案第四步对比讨论设置不同场景比如无需求响应、有需求响应、有碳交易、两者都有做对照实验观察系统运行成本、碳排放量、设备出力结构的变化规律。整条路线看起来简单但每一步的细节决定成败接下来逐项拆开讲。2. 系统建模从设备到约束的完整拆解2.1 参考系统架构与设备配置建模之前先定义物理系统。我常用的参考架构包含一条燃气轮机联供主线一套补燃/补冷设备再加上储能和电网交互。设备清单和关键参数如下表所示供你搭模型时参考。设备输入能量输出能量关键参数典型取值范围燃气轮机天然气电 高温烟气发电效率、热电比发电效率30%-40%热电比1.2-2.0余热锅炉高温烟气热余热回收效率80%-90%吸收式制冷机热冷COP0.7-1.3电制冷机电冷COP3.0-5.5燃气锅炉天然气热热效率85%-95%电储能电电充放效率、SOC范围效率90%-95%SOC限值20%-90%蓄热罐/蓄冷罐热/冷热/冷储放效率、容量效率90%左右电网交互电电购电价、售电价分时电价曲线建模时燃气轮机我习惯简化成一个“电出力变量 余热出力变量”的耦合关系燃气轮机烧气产生电和热热电比通常近似看作常数余热量等于发电功率乘以热电比。这个简化在项目初期完全够用等学位论文需要精细化时再改成随负载率变化的非线性效率曲线。2.2 能量平衡约束四个母线的写法整个优化模型的核心是四个能量平衡方程分别对应电、热、冷、气四条“母线”。每条母线代表一个能量节点所有注入该节点的能量之和等于所有流出该节点的能量之和。以24小时调度周期为例每个时段t都要满足电平衡燃气轮机发电 光伏发电 电网购电 储能放电 电负荷 - 需求响应削减 电制冷机用电 电网售电 储能充电热平衡余热回收 燃气锅炉产热 蓄热罐放热 热负荷 - 需求响应削减 蓄热罐充热冷平衡吸收式制冷 电制冷 蓄冷罐放冷 冷负荷 - 需求响应削减 蓄冷罐充冷气平衡购入天然气 燃气轮机耗气 燃气锅炉耗气 可选直接供气负荷写这些方程时有三个容易踩的坑。第一个是单位统一热负荷和冷负荷有的用kW有的用GJ/h混着用必出错建模之前先统一成kW。第二个是方向约定储能充电是负荷、放电是电源代入平衡方程时正负号要一致。第三个是“同时性”问题电网不能同一时刻既大量购电又大量售电热网里蓄热罐也不能同时充放这些需要用0-1变量加互斥约束来限制否则求解器会给出一看不合理但数学上“最优”的出工结果。2.3 设备运行约束启停、爬坡与储能动态能量平衡只是物理定律的约束设备本身还有运行限制。燃气轮机和燃气锅炉存在最小技术出力不能低于额定容量的某个比例比如不能低于30%机组启停是0-1决策变量停机时段不耗气不产能量相邻时段出力变化受爬坡速率限制不能从零直接蹦到满负荷。储能设备要加状态递推约束当前时段的储能量等于上一时段储能量加上本时段充入量乘以充电效率减去本时段放出量除以放电效率。同时储能容量有上下限充放电功率也有上限。这里要强调一个细节储能SOC的初始值怎么设。我建议取调度周期首尾SOC相等也就是“日循环约束”这样结果更具工程参考意义否则模型会把初始储存的能量免费用光导致结果偏乐观。具体写法就是SOC(0)SOC(24)让一个调度周期内充进去的总能量和放出来的总能量在效率修正后相等。2.4 综合需求响应怎么建模题目里“综合”两个字意味着需求响应不只管电力负荷冷、热、电三种负荷都要纳入响应范围。这也是很多初学朋友最容易漏掉的部分。电力需求响应相对成熟两种基本形式可削减负荷与可转移负荷。可削减负荷就是高峰时段直接砍掉一部分用电用户获得补偿可转移负荷比如某些生产工序、洗衣房、充电桩可以把用电量平移到其他时段但一天内总用电量守恒。建模时可削减量不能超过负荷的一定比例可转移量要满足“移出的量等于移入的量”这一守恒约束。热力需求响应和冷需求响应很少被仔细讲但恰恰是综合能源系统里最有意思的部分。供热系统本身有巨大的热惯性房间温度在一定范围内变化用户感知不强所以热负荷可以在允许范围内上调或下调只要保证时段总供热量不低于最低舒适阈值即可。冷负荷同理但冷响应更适合用“预冷策略”表达电价低谷时段提前多供冷把建筑物或蓄冷罐的冷量存起来电价高峰时段少供冷甚至不供冷实现“移峰填谷”。写模型时热/冷负荷响应可以建模成负荷值在上下限区间内连续可调而不是简单的0-1削减。这样处理更贴近实际也给求解器提供了连续调整空间优化效果更平滑。2.5 碳交易机制怎么进模型碳交易建模分三块配额怎么给、实际排放怎么算、交易成本怎么进目标函数。配额分配最常见的是基准线法即以历史强度或区域基准值为准给系统一个免费排放额度。额度可以表示成与负荷水平挂钩的线性函数也可以直接给一个固定常数。固定配额的好处是形式简单便于做灵敏度分析。我实际做的时候更推荐固定配额先跑出无碳交易时的最优排放量再反设一个比它低5%-10%的配额模拟“逐步收紧”的政策环境这样故事线更完整。实际排放核算覆盖两个碳排放源一是天然气燃烧的直接排放包括燃气轮机和燃气锅炉二是从电网购电对应的间接排放。直接排放等于耗气量乘以天然气碳排放因子间接排放等于购电量乘以电网平均碳排放因子。注意通过电网反售出去的电量对应的排放是负的从总排放中扣除否则会高估系统碳责任。碳交易成本等于实际排放量 - 免费配额乘以碳价。实际排放小于配额时这项是负值相当于卖配额获利大于配额时是正值变成额外的运行成本。碳价可以设固定值也可以设阶梯价格模拟碳价上涨阶梯会引入整数变量模型规模会增大前期建议先用固定碳价后期做价格灵敏度扫描时再考虑阶梯。2.6 目标函数与线性化处理目标函数是所有决策者最关心的部分我通常写成min ∑ [ 购气费用 购电费用 - 售电收入 需求响应补偿费用 碳交易成本 ]其中购气费用等于总耗气量乘以天然气价格购电费用是电网购电量乘以分时电价售电收入是反售电量乘以上网电价需求响应补偿是削减或转移的负荷量乘以补偿单价碳交易成本按上一节方式计算。光伏发电成本通常忽略或按度电成本计入储能折旧成本可以在目标函数里加一个很小的单位损耗系数让模型自动减少无效充放循环。写模型时容易碰到非线性项最常见的三个燃气轮机发电效率随负载率变化导致产气量与出力的非线性关系、阶梯碳价导致的分段线性成本、需求响应补偿价格分档。Cplex本身支持二次约束和二次目标但混合整数二次规划求解速度明显慢于线性规划。我的经验是项目前期全部线性化把效率曲线用分段线性逼近把阶梯价格用大M法转成线性约束。这样模型就是一个标准的MILPCplex求解稳定、速度快、调试方便。等后续想提升精度再逐步把非线性项加回去对比效果。3. 用Cplex求解从建模到出结果的完整流程3.1 先确认问题类型写代码之前先判断自己手里拿的是什么样的优化问题。上面的模型带有0-1整数变量机组启停、充放互斥目标函数和约束都是线性的所以这是典型的混合整数线性规划MILP。Cplex最擅长的就是这类问题。如果去掉整数变量退化成LP求解会快一个数量级但会失去启停逻辑的刻画能力。实际写模型时我会把变量分成三类连续变量各设备出力、储能充放功率、购售电量、0-1整数变量设备启停、储能状态、购售电状态、辅助变量大M法产生的中间量。分类清楚之后再去写约束和目标函数据思路会清晰很多也方便后续查错。3.2 数据准备与表格规范求解之前先整理数据。时序数据包括24小时电负荷预测、热负荷预测、冷负荷预测、分时购电价、上网电价、天然气价格。价格型参数包括碳价、需求响应补偿单价、各设备效率、容量限值。我的习惯是用Excel或CSV统一存数据在建模脚本里一次性读取并赋值给参数结构体。注意校验负荷数据的数量级比如某栋楼的电负荷峰值是几百千瓦还是几兆瓦直接决定了设备容量参数怎么设。数据错误是模型不可行最常见的原因没有之一。调模型之前先把每条数据曲线画出来看一眼比花几个小时查约束高效得多。3.3 核心代码框架我习惯用Matlab加Yalmip调Cplex开发效率高调试方便。核心代码框架如下你可以直接参考。这里只展示关键片段完整模型按前面章节的约束逐个添加即可。% 参数定义示例 T 24; % 调度周期 P_gt_max 2000; % 燃气轮机最大电出力kW P_gt_min 600; % 最小技术出力kW R_gt 800; % 爬坡速率上限kW/h eta_gt 0.33; % 发电效率 alpha_chp 1.5; % 热电比 eta_gb 0.9; % 燃气锅炉效率 cop_ec 4.0; % 电制冷COP cop_ac 1.0; % 吸收式制冷COP % 决策变量 P_gt sdpvar(1, T); % 燃气轮机发电功率 Q_gb sdpvar(1, T); % 燃气锅炉产热 P_ec sdpvar(1, T); % 电制冷机耗电 Q_ac sdpvar(1, T); % 吸收式制冷耗热 P_buy sdpvar(1, T); % 电网购电 P_sell sdpvar(1, T); % 电网售电 u_gt binvar(1, T); % 燃气轮机启停 u_buy binvar(1, T); % 购电状态 u_sell binvar(1, T); % 售电状态 % 储能变量略类似SOC递推和充放功率定义 % 约束条件 C []; C [C, P_gt_min * u_gt P_gt P_gt_max * u_gt]; C [C, abs(P_gt(2:T) - P_gt(1:T-1)) R_gt]; C [C, u_buy u_sell 1]; % 购售电互斥 % 电平衡约束 C [C, P_gt P_pv P_buy P_bat_dis P_load - P_dr P_ec P_sell P_bat_ch]; % 热平衡约束 C [C, alpha_chp * P_gt Q_gb Q_hs_dis Q_load - Q_dr Q_hs_ch]; % 冷平衡约束 C [C, cop_ac * Q_ac cop_ec * P_ec Q_cs_dis C_load - C_dr Q_cs_ch]; % 目标函数 F_gas_total P_gt / eta_gt * 1 / 10.55 Q_gb / eta_gb * 1 / 10.55; % 折算成kW天然气耗量简化式 Objective sum(F_gas_total * price_gas P_buy .* price_buy - P_sell .* price_sell ... P_dr * price_dr carbon_cost); % 求解 ops sdpsettings(solver, cplex, verbose, 2); ops.cplex.mip.tolerances.mipgap 0.001; ops.cplex.timelimit 600; ops.cplex.threads 8; optimize(C, Objective, ops);代码里的天然气折算公式是高度简化的示意实际建模时通过“输入燃料量 输出电功率 / 发电效率”的关系还原耗气量再乘天然气低热值统一到kW单位。3.4 Cplex参数调优Cplex开箱即用能解大多数中小规模模型但遇到大规模场景比如8760小时全年调度、几百个0-1变量就得调参数。我常用四个关键参数mipgap混合整数规划的相对间隙容忍度。默认0.0001即要求解的目标值与下界差距小于0.01%。对大多数工程分析设到0.001-0.005就足够可以明显缩短求解时间。timelimit最长求解时间防止模型陷入长时间搜索。我一般设300到600秒到点取当前最优可行解。threads并行线程数。新机器核心多设成8到16能有效加速分支定界过程。mip.strategy / nodefile问题太大会吃满内存需要开节点文件缓存把部分分支树放到硬盘上。这时候求解变慢是正常的属于拿时间换空间。参数调优要遵循“先保证可行、再追求最优”的原则。先把mipgap调松确认模型能在一个合理时间内给出可行解再逐步收紧看最优解的变化。如果收紧gap后目标几乎不变说明当前精度已经够用再往下调只是浪费计算时间。3.5 结果输出与对比分析求解完成后把关键结果全部导出并作图各设备逐时出力柱状图、购售电曲线、储能SOC曲线、需求响应量曲线、碳配额与排放量对比图。这些图不仅是论文素材更是验证模型正确性的工具。我习惯做三组对照实验。第一组是基础场景不加入需求响应和碳交易得到传统调度结果第二组只加需求响应第三组同时加需求响应和碳交易。对比三组的总运行成本、总碳排放量和设备出力结构能够清晰看出两个机制各自的贡献。再加一组碳价灵敏度分析把碳价从20元/吨扫到200元/吨观察系统碳排放变化和设备出力调整这种结果非常出效果审稿人和答辩老师都爱看。4. 求解器选型与模型收敛性优化4.1 Cplex、Gurobi、开源求解器怎么选综合能源优化领域用到的主流求解器各有特点我列一个实际对比求解器类型许可方式MILP性能建模友好度适用场景Cplex商业学术免费/商用收费极强高支持多种建模工具大规模MILP标准选择Gurobi商业学术免费/商用收费极强部分场景略优于Cplex高大规模MILP性能敏感场景SCIP开源免费较强中预算有限的学术项目CBC开源免费中等中中小规模教学示例OSQP开源免费只支持QP中纯二次规划场景Cplex的优势在于行业二十多年的积累求解器稳定性好对MILP的分支定界和割平面算法非常成熟并且支持MATLAB、Python、C多种接口。我用Yalmip调Cplex时连求解器内部参数都可以直接透传修改非常方便。Gurobi在某些纯整数问题上会更快一点但两者在中小规模综合能源模型上的差距不明显。真到百万级变量的大规模问题才需要认真对比选型。4.2 模型规模膨胀的根源与削减技巧综合能源模型规模膨胀主要来自三方面时间步长细分15分钟一个时段、设备数量增加、0-1变量激增。一个包含10台设备、24小时、每台设备平均2个0-1变量的模型整数变量也就几百个Cplex秒解但如果做全年8760小时调度变量直接膨胀到百万级别求解时间呈指数增长。控制规模的技巧有几个。一是时间聚合用典型日代替全年逐时数据比如选夏季典型日、冬季典型日、过渡季典型日各跑24小时调度再按天数加权汇总能极大缩减模型规模。二是合并冗余约束购售电互斥本质上只需要一个0-1变量如果系统不允许同时购售电完全可以去掉互斥0-1变量只用“购电量×售电量0”的非线性约束或者干脆强制二者之一为零减少整数变量个数。三是删掉无效候选状态夜间冷负荷接近于零时电制冷机和吸收式制冷机的最大出力直接限掉剪掉大量无意义的组合空间。5. 常见问题与排查实录5.1 模型不可行怎么定位Cplex返回不可行时第一反应不要怀疑求解器先怀疑自己的约束。我的排查顺序是先检查负荷数据各时段是否齐全再检查能量平衡方向是否写反最容易出错的是储能SOC递推的正负号然后检查容量限值是否小于负荷峰值比如蓄热罐容量设小了热平衡永远凑不平最后检查互斥约束是否过强比如某时段要求既满足电平衡又要求购售电互斥结果没有可行解说明约束矛盾。Yalmip里可以用求不可行约束集合的功能通过“%#ok”注释对比约束逐个放松约束定位问题源。5.2 求解慢、长时间不收敛模型卡住最直观的原因是0-1变量组合空间太大。先用上一节的规模削减技巧压缩模型再把mipgap放宽到0.005看看能不能快速得到一个可行解。如果连可行解都找不到说明初始下界很差可以让求解器先生成一个热启动解先固定机组启停变量为经验值解一个纯LP问题再把这个解作为MIP的热启动初始解通常能大幅提升搜索效率。5.3 结果出现同时购电和售电在分时电价有峰谷差时同时购电和售电表面上看很奇怪但因为存在储能设备模型有时会给出“低谷买电充电、高峰放电同时售电”的套利策略这时同时购售电是合理的。真正不合理的是同一时段既大量购电又大量售电且没有储能参与这通常说明互斥约束写漏了或者目标函数里售电价大于购电价导致无限套利。遇到这种结果先把时段和能量去向查一遍再检查互斥约束是否完整。5.4 碳交易参数影响结果异常碳价升高后系统碳排放总量不一定单调下降。原因在于系统同时存在多个碳排来源燃气轮机虽然排碳但余热利用替代了燃气锅炉和电制冷机的耗能整体系统碳排放可能反而降低。所以碳价升高可能导致燃气轮机多发电反而增加了一部分排放。这不是模型错误而是联供系统的真实特征碳排放和电力市场化激励存在耦合分析结果时必须结合设备出力结构来解释不能只看总量曲线。做碳价灵敏度时把燃气轮机出力、电网购电量、燃气锅炉产热量三条曲线一起画出来碳价影响一目了然。5.5 常见问题速查表问题现象可能原因解决措施模型不可行负荷数据错误或约束方向写反逐条检查能量平衡方程检查数据单位求解极慢0-1变量过多、big-M取值过大压缩整数变量、收紧M值、放宽mipgap同时购售电互斥约束缺失或储能套利策略添加购售电互斥检查储能充放逻辑目标函数为负且离谱售电价高于购电价模型无限套利检查价格参数添加电量买卖约束储能首时段即放完缺少日循环约束加入SOC初始等于末尾的约束碳价升高但排放反升联供系统结构特性非模型错误结合设备出力曲线解释补充对照场景最后再分享一点个人经验这类研究做到最后真正有价值的往往不是那一张最优解表格而是对系统运行规律的理解。Cplex求解器只是工具它能在0.1秒内给出一个数学上的最优解但判断这个解是否符合实际、是否满足物理直觉、是否能在真实系统里落地还是得靠人。我做综合能源模型踩过最深的坑就是过于相信求解结果直到把某一天的调度曲线逐条核对了几个小时才发现是燃气轮机的热电比参数少了一个零。从此之后每跑完一组结果第一件事一定是画图、看图、问三个问题设备出力是否在合理区间储能是否有异常充放购售电行为是否与市场价格信号一致这三个问题过滤掉90%的模型错误。如果你正准备开这个方向的研究建议从一个小规模系统做起设备控制在3到5台时间尺度先做24小时把模型跑通跑顺再逐步扩展。建模本身没有太多玄学关键是物理逻辑清楚、数学表达准确、求解结果可解释。做到这三点这套框架无论是继续深入做全年优化、做不确定性鲁棒优化还是扩展到多园区协同都会很顺手。