ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

低碳园区能源规划:MILP实现设备配置与运行调度联合优化

低碳园区能源规划:MILP实现设备配置与运行调度联合优化 双碳目标提出来之后园区能源规划的项目要求一下就从“省钱”变成了“低碳还得省钱”。我去年做的这个课题甲方就把“碳排放总量”列进了可行性研究的硬指标但预算又卡得死死的。单靠经验配设备不是过度投资就是运行成本失控。于是我把设备配置和运行调度统一放进一个低碳优化调度模型里以系统运行维护成本和购能方向作为优化目标通过MILP求解得到一组可落地的设备配置方案。这篇文章把模型的思路、数据准备、求解过程、结果解读和踩过的坑完整写出来给正在做综合能源、微网、园区能管项目的朋友一个可复用的参考。1. 项目概述与核心需求解析1.1 从“成本最小”到“低碳成本”的转变传统设备配置优化通常把目标定义成年投资费用最低最多再叠加一个全生命周期成本。但双碳目标介入后问题变了高碳排放设备燃气锅炉、柴油发电虽然单价便宜却可能在碳约束下被罚成本反超低碳设备光伏、储能虽然前期贵却能在运行阶段通过减少购能费用和碳配额摊平成本。所以核心目标不能只看初始投资要把系统运行维护成本也纳入因为维护成本才反映设备长期“吃钱”的节奏。举一个我实际见过的例子一个园区选了便宜的燃气锅炉单台造价低但每年检修、阀组更换和烟气排放检测费用加起来比一台空气源热泵的运行维护费高30%。如果模型里没有运维成本项设备配置结果必然偏向燃气锅炉一旦计入热泵反而更有优势。这就是为什么“系统运行维护成本”不能当次要项处理。1.2 为什么优化目标要盯住运维成本和购能方向购能方向这个概念说白了就是“你这个系统到底靠什么供能”。是买电网的电还是买燃气自己烧还是用光伏自产自用不同方向带来的不仅是价格差异还有碳排放差异。比如电网平均每度电折算0.8kg二氧化碳当地气价低时燃气锅炉产热看似省钱但碳排放高。模型如果只优化钱不会考虑碳只有把购能方向作为优化目标的一部分模型才会自动比较“买电电锅炉”和“买气燃气锅炉”哪个既便宜又低碳。我在建模时把“购能方向”定义成一组连续变量逐时电网购电量和逐时天然气购气量。它们的成本系数分别挂上分时电价、天然气价和碳排放成本然后放进目标函数一起最小化。这样模型给出的设备配置里会自然出现“光伏容量配得大一些、燃气锅炉容量配到刚好覆盖峰值热负荷”这类结果而不是拍脑袋决定的光伏和锅炉比例。1.3 项目边界与约束条件在项目开始前我先和甲方把边界划清楚设备类型限定为光伏、锂电储能、燃气锅炉、电锅炉不考虑热网和制冷机规划周期为20年运行调度的典型日为3个冬季、夏季、过渡季每个典型日24小时。这些边界直接决定模型复杂度和结果的可信度。如果设备类型太多MILP变量爆炸如果周期太短成本年化系数不准。边界划完之后还要明确约束条件满足园区逐时电负荷和热负荷、设备出力上限、储能SOC上下限、能源平衡、高峰购电功率限制、碳排放总量上限。把这些约束摆在桌面上后面模型有任何问题都好排查。2. 模型总体设计与方案选型2.1 单层MILP联合优化把规划和调度放进同一个问题前面说了设备配置本身是规划问题运行调度是另一个问题它们之间存在双向耦合。我最初试过分层迭代外层改容量内层跑调度用遗传算法或网格搜索去寻优。跑一个简单两设备算例花了4个小时而且每次得到的结果会因为调度策略的不同而变化稳定性很差。后来我直接把两个问题合并成单层MILP让配置变量和运行变量同时被优化。这样做的好处是数学最优性有保证。MILP求解器用分支定界和割平面法只要有足够时间在给定误差内得到全局最优解。大M法、线性松弛、整数割都是成熟技术工程上完全可信。当然代价是模型尺寸大所以必须配合场景压缩和离散化手段。2.2 目标函数与关键约束的数学表达模型的目标函数我简化后是这样的min Σ_y [ C_inv(y) C_om(y) ] Σ_t [ C_grid(t) C_gas(t) ] C_carb(CO2)其中C_inv是年化投资成本把初始投资乘以年化因子按利率和寿命算C_om是年运维成本包括固定维保费和可变损耗费C_grid和C_gas是逐时购电购气费用C_carb是碳成本或碳惩罚。这里我想重点说“运维成本”建模有多细。固定维保费用按容量算比如光伏每kW每年20元可变运维按实际出力算比如储能每充放1kWh损耗0.05元燃气锅炉每产热1MWh检修费30元。这样的粒度才能反映设备负荷率不同时维护费用的差别——如果一台锅炉全年只满负荷运行100小时和全年满负荷5000小时检修成本完全不同。约束条件写出来有十几条核心的是这四条电力平衡光伏出力储能放电电网购电电负荷电锅炉耗电储能充电热力平衡燃气锅炉产热电锅炉产热热负荷设备容量与使用的耦合出力≤配置容量×启停状态储能SOC迭代SOC(t1)SOC(t)充电电-放电电-自放电。2.3 求解器与代码实现在工程中的选择求解器上我主要用Pyomo建模然后调Gurobi或CBC。免费方案是CBC它对于几千个变量和几百个约束的问题很快如果模型扩大到上万变量建议用Gurobi或CPLEX商业求解器速度真的好太多。有一次我把同一套模型从CBC换成Gurobi求解时间从17分钟压到38秒而且最优性间隙明显缩小这笔许可费项目的预算一定要留。代码实现方面我强烈建议用Python而不是Excel Solver——Excel的线性求解器做不了这么大问题。Python的每行建模接口清晰和pandas脱不开关系。所有输入数据用DataFrame管理输出也用DataFrame聚合然后再写进Excel。这样甲方改数据我直接替换Excel文件里的sheet就能重跑。3. 实操过程从数据准备到模型落地3.1 典型日负荷曲线与分时能源价格处理实操的第一步是数据清洗。从园区BAS系统拉出来一年的负荷数据后会有缺失和异常值。我的处理方法是剔除节假日剔除设备检修日然后把剩下来的运行日按电负荷和热负荷两个维度做K-means聚类分成三个典型日冬季典型日、夏季典型日、过渡季典型日。每个典型日对应一个权重天数比例。需要提醒的是聚类之前最好把数据标准化不然热负荷数值远大于电负荷时聚类结果会被热负荷主导。做完聚类后再人工看一眼曲线——如果冬天的典型日晚上电负荷特别高可能是电采暖要保留如果过渡季曲线平得跟直线一样就要考虑再细分一组。典型日选择好坏直接影响设备容量千万不要只图少。分时电价、气价也要跟典型日对齐。电网的分时电价在江浙一带通常是峰谷两段或峰平谷三段冬季和夏季的峰谷时段还不同所以每个典型日要用对应季节的分时价格不能全国一个价套进去。3.2 设备参数建模与配置-运行耦合的关键细节设备参数表是我在模型里最容易出错的地方。下面是一张我在小规模算例里用过的参数表可以作个参考设备效率单位投资元/kW运维费元/kW·年可变运维费元/kWh产出备注光伏0.18光电转换3500300受光照系数约束锂电储能0.92充放效率1500元/kWh400.03容量单位kWh燃气锅炉0.9热效率1000500.04需要燃气电锅炉0.95热效率1800600.02直接用电建模时有一个关键动作把“配置容量”和“逐时出力”耦合起来。比如燃气锅炉我不能直接让它永远在最大负荷运行要设置一个最小负荷率通常为30%并用一个二进制变量表示启停当二进制0时出力为0二进制1时出力在30%~100%容量之间。这个约束写法就是大M法出力 ≤ M × 启停变量启停变量 × 最小负荷率 ≤ 出力。M要取好我会把M设成配置容量的上限这个上限由候选容量列表决定。储能建模的坑最多。首先是单位问题容量用kWh功率用kW初看很简单但充放电效率导致了耦合充电1kWhSOC只能增加0.92kWh放电1kWhSOC要消耗1/0.92kWh。SOC更新方程要写对。其次是同时充放的规避我一般用一个二进制变量控制储能当前状态或者用两个互斥二进制变量充放状态之和≤1。最后是寿命和容量衰减在第一版可以不考虑但如果你把全年8760小时跑完就必须加容量衰减系数否则结果乐观。3.3 模型构建与求解的完整流程实际建模流程我拆成六步读数据读入负荷、价格、天气、设备参数Excel。构造候选设备容量集比如光伏候选值为[0, 100, 200, 300, 400]kW储能候选为[0, 50, 100, 200]kWh。用整数变量表示“选了第几个档位”再用线性约束把容量和档位关联起来。定义变量配置变量整数/二进制、逐时出力变量连续、逐时购能变量连续、储能SOC变量连续。写目标函数就是上面那个min表达式其中每个成本项挂到对应变量。写约束能量平衡、设备耦合、SOC迭代、碳上限等用ConstraintList批量添加。求解和后处理调用CBC/Gurobi求解检查状态输出结果。在Pyomo里有一个容易踩的坑如果你用Python循环去拼目标函数的每一项变量多了以后模型构建耗时很长。解决办法是用LinearExpression或者直接用指数表示法。我踩过这个坑一个小模型构建耗时1分钟后来改成矩阵化数据后构建时间降到2秒。求解后要做的不是马上用结果而是先检查几个“合理性指标”设备容量是否落在候选值上储能SOC曲线是否在一个周期结束回到初始值购电购气量是否非负碳排放总量是否超过上限。这些检查没问题再生成报告。4. 项目结果分析与关键指标解读4.1 不同目标权重下的配置结果对比为了把“低碳”和“成本”的关系讲清楚我特意跑了三组场景。第一组目标函数为零碳惩罚结果光伏容量150kW、储能50kWh/100kWh、燃气锅炉500kW、电锅炉0年总成本约120万元其中购电占比50%、购气占比30%。第二组加上碳成本每吨80元结果光伏涨到240kW、储能变成100kWh、燃气锅炉降到400kW年总成本128万元碳排放下降约23%。第三组把碳排放上限卡在基准值的70%光伏直接推到300kW储能变成150kWh燃气锅炉降到300kW电锅炉补充了部分热负荷年总成本135万元。这几组结果说明一个规律双碳约束加严的过程本质上是“用资本支出换运行碳排放”。光伏和储能的前期投资换来的是每年减少购电费用和碳成本总成本曲线呈“先平后抬”的形状——在某个碳排放范围内成本增加很少但碳排放下降明显过了拐点再压碳就要大幅增加容量和成本。汇报的时候我会把这三组都放进PPT而不是只丢一组“最优解”。因为甲方需要理解如果未来电价下降或者碳价上涨配置方案应该怎么调整。4.2 购能方向变化煤电、气电与新能源的比例调整购能方向的变化是模型结果里特别直观的一个维度。我在基准场景里把电力的碳排放因子设为0.8kgCO2/kWh天然气折合为0.2kgCO2/kWh按单位热量。模型给出的结果是热负荷主要由燃气锅炉承担因为“买气烧热”的等效碳强度比“买电转热”低而电力负荷优先用光伏光伏不够再用网电谷电时段额外买电给储能充电。但把电网碳排放因子降到0.4kgCO2/kWh比如省级电网绿电比例提高模型立刻拐向电锅炉因为电锅炉效率高达0.95而燃气锅炉只有0.9买电转热的综合碳强度低于买气。这说明“购能方向”不是静态偏好它对输入参数极其敏感。做项目时一定要把电网排放因子、气价做敏感性分析否则设备配置很快就过时。我还试过加入“绿电购买”选项也就是允许模型支付更高一点的溢价购买可再生能源电并在碳排放计算中给这部分电一个接近零的因子。结果模型在峰段选择买绿电而不买气配置上电锅炉容量上升燃气锅炉被边缘化。这类探索对园区参与绿电交易特别有价值。4.3 配置方案的鲁棒性验证设备配置一旦定了至少用五年所以不能只看典型日。我的做法是用模型求出的固定容量去跑全年8760小时的真实调度不重新优化容量统计年度成本和SOC发生越限的频率。这叫“后验运行验证”。我那个项目第一版配置在夏季极端高温日出现了电负荷峰值缺口原因是我用的典型日没有覆盖到连续三天高负荷的情况。后来我把典型日从3个加到5个并在运行验证中加入了“最大负荷日”和“最小负荷日”才解决缺口问题。验证时要特别注意储能的SOC曲线。如果某些天的SOC在很长一段时间内都是0说明储能容量配置偏大浪费了投资如果频繁达到上限说明储能容量偏小套利空间没吃足。理想状态是SOC曲线每天都能“峰前充、峰中放”波动在一个较宽的区间内。5. 常见问题与排查技巧实录5.1 模型无解或运行变量异常先讲一个最常见的事故模型无解。拿到无解状态别慌先做“二分定位”。第一步关掉配置优化固定容量只做调度优化如果仍然无解基本确定是约束问题比如能量平衡算错了。第二步逐条检查约束可用“松弛每个约束”的办法Pyomo里可以给每条约束加一个松弛变量求解后看哪些松弛变量非零非零的就是矛盾来源。再说运行变量异常。比如储能SOC为负通常是没有给SOC变量设置下界或者SOC更新方程里少了自放电项。再比如某个锅炉出力一直为0先检查目标函数里的成本项符号如果单位成本给成负的模型当然希望它多出力反过来就是0。5.2 求解时间太长如何缩短模型规模一大求解慢是必然的。我这里分享三个立竿见影的方法设MIP gap把求解器的最优性间隙设为1%~5%不是非要追求0 gap工程上完全够用。减少候选设备容量粒度比如储能步长从10kWh改成50kWh二进制变量一下子少一半。不行就分层先按典型日求配置再用全年滚动调度校核配置方案最后再针对暴露的问题局部优化。我在实际项目中用“CBC MIP gap0.05”跑一个1000个变量的模型从原来没设gap的240秒降到40秒。5.3 代码实现中的避坑点与调试心得收集一下这几年容易踩的坑问题典型原因建议模型构建时内存炸了循环里反复调用model.addConstraint改用ConstraintList或列表推导结果总是选最小容量目标函数里单位投资成本乘的是容量还是功率检查单位储能按kWh光伏按kW碳排放约束不生效碳因子换算错误先用一个简单算例手算碳排量校验分时电价模型跑出“充满放空”储能效率高于实际或没加周期终值约束检查充放效率强制SOC结束时等于初始值还有一个调试心得每写完一个模块就单独测试它。比如先把光伏从模型里拿掉固定其他设备跑再加回来看结果变化是否合理。一体化模型一旦出错往往很难定位分模块调试能省一天时间。最后我个人实际做下来最深的体会是这种低碳优化调度模型的难点不在于求解器多高级而在于目标函数里的每一项能不能真正反映现场情况。运维成本要是偷懒简化结果就偏向采购成本购能方向要是没考虑碳排放因子模型就会把燃气锅炉看作“香饽饽”。把这两个目标梳理清楚后面所有设备配置报告才有说服力。下次再拿到类似课题建议你从一个小规模两设备三典型日的模型开始跑通后再逐步扩大。真的模型不是越复杂越好能把边界找准、把参数吃透就已经解决一大半问题了。
返回列表