开头
做过园区综合能源系统优化项目的朋友应该都有体会:单独做能量管理调度已经够头疼了,风光出力不确定性、储能SOC约束、燃气轮机爬坡限制,一个个往上摞约束,模型越写越臃肿。而这两年又加进来两本"新账"——绿证交易和碳配额履约,整个优化问题的复杂度直接翻倍。
我今年在复现一套面向绿证-碳交易机制的综合能源系统鲁棒优化模型时,把两阶段鲁棒优化和C&CG算法完整跑通了一遍,这里把建模思路、Python代码实现、调试踩坑和案例测试结果整理出来。这套代码和思路适合正在做综合能源系统调度优化、电力市场交易策略、碳资产管理相关课题的研究生和工程师,尤其适合那些已经会跑确定性优化,但还没把"不确定性"和"多市场机制耦合"同时纳入模型的朋友。
整套方法的核心价值就一句话:在风光出力预测有偏差的情况下,仍然能给出一个不管实际来风来光怎么变,都能保证系统安全运行且收益不垮台的日前调度方案。
1. 综合能源系统为什么必须同时算清"绿证账"和"碳账"
1.1 多能互补系统中的两种"隐形成本"
综合能源系统的典型构成是风电、光伏、燃气轮机、储能、电热负荷,再加上从上级电网购电的关口。传统优化模型通常只盯着运行经济性,也就是购电成本、燃气成本、运维成本和弃风弃光惩罚这几项。但一旦把绿证交易和碳交易引入,情况就变了——发电侧和用能侧的行为会产生额外的政策合规成本或收益,这些量在小规模系统中看似不大,放到一个实际园区年运算里,差距可能达到几十万元级别。
一个基础事实是:燃气轮机每发一度电,会带来约0.4-0.6 kg的碳排放;而风电和光伏每发一度电,在多数地区可以对应产生一个绿证(不同地区的绿证核发规则略有差异,这里按1MWh对应1个绿证处理),同时这部分可再生能源电量又在物理上替代了火电,降低了整个系统的碳排放水平。也就是说,可再生能源和燃气轮机在同一个功率平衡方程里交汇,但在绿证和碳排放的"账本"上却走向完全相反的方向。
系统运行决策只要动了燃气轮机的出力,或者调整了储能的充放策略,就会同时影响绿证持有量和碳配额盈亏,这两者又将反过来作用于目标函数中的收益项。 这就是为什么要在一个模型里同时算清两本账,而不是先做能量调度再用事后审计的方式单独核算绿证和碳排放量。
1.2 如果不把绿证和碳交易写进优化目标会发生什么
我见过不少第一版模型——包括我自己早期写的版本——都默认可再生能源发电量越大越好,然后在目标函数里加一个售电收益项就完事。这种简化在纯技术层面的调度里问题不大,但一旦涉及配额履约就会出问题:
- 绿证方面:各省有可再生能源消纳责任权重,企业/园区作为售电主体或自备电厂,需要通过自建可再生能源项目发电、购买绿证等方式完成配额。如果不把绿证约束写入模型,优化器可能会让燃气轮机多发、可再生能源少发(因为忽略绿证收益后,火电的单位收益看起来更高),最终导致消纳责任权重不达标,面临考核惩罚。
- 碳配额方面:如果免费配额固定,但优化器为了追求低成本而让燃气轮机满发,碳排放量会超出配额,超出部分需要到碳市场购买配额,这笔成本不在目标函数里,最终结算时利润被侵蚀掉。
所以正确的做法是:把绿证收益写进目标函数(卖绿证的收入),把绿证消纳配额写成约束;把碳交易成本/收益写进目标函数(超排买配额或减排卖配额),把碳排放上限或配额分配写成约束。 两本账和能量调度方程耦合求解,才能得到真正可落地、经得住结算复核的调度方案。
1.3 政策机制建模中的两个关键量化口径
具体建模时有两个口径必须先定清楚:
-
绿证配额约束:系统承担的消纳责任权重通常表示为可再生能源消纳量占全社会用电量的比例。在模型里,可以用一个简化但合理的表达——设园区年度消纳责任权重为α,则系统内可再生能源发电量加上外购绿证量,需要不小于系统总用电负荷的α比例。由于我们做的是日前调度,这里按当日的负荷和发电量折算即可,实际工程中需要按核算周期结算,但在优化模型中通常做比例折算。
-
碳配额约束:常见的免费配额分配方法有历史法(基于历史排放强度)和基准线法(基于行业先进值)。对综合能源系统来说,比较合理的方式是按发电量和排放基准线进行分配,即配额量=基准线排放强度×上网电量。当实际碳排放量小于配额量时,富余配额可以在碳市场出售获得收益;反之需要购买配额。
在Python建模时,这两组约束都会被写成线性约束,这为后续使用Gurobi这类线性规划求解器奠定了很好的基础。如果模型规模进一步扩大,还可以考虑用列与约束生成算法进行分解求解,这也是两阶段鲁棒优化的标准解法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 鲁棒优化建模:从确定性模型到两阶段盒式不确定集
2.1 为什么这里必须用鲁棒优化而不是随机规划或场景法
风光出力的不确定性是综合能源系统优化绕不开的难点。处理不确定性的主流思路有三种:随机规划、鲁棒优化、分布鲁棒优化。三者的核心差异在于对不确定信息的假设强度不同。
随机规划需要知道风光出力的概率分布,然后用蒙特卡洛采样生成大量场景,模型规模会随着场景数膨胀,求解时间成倍增加,而且概率分布估计本身就有误差——如果你的历史数据不足以支撑高置信度的分布拟合,随机规划的结果很容易"过拟合"到错误的分布上。
鲁棒优化则完全放弃概率分布假设,只要求不确定性变量落在一个"不确定集合"里,优化目标是保证在最坏情况下系统仍然可行且成本可控。这种思路对数据要求低、计算效率高,而且天然符合工程上"留有余量"的安全惯例。
我在这个项目里选的是两阶段盒式鲁棒优化,原因有三:
- 综合能源系统的日前调度天然是两阶段的:日前阶段在风光出力未知时做决策(机组启停、储能充放电计划),日内阶段等风光出力实际值出来后做调整(调整燃气轮机出力、购电功率、储能修正)。
- 盒式不确定集(即每个不确定参数独立地在预测值附近波动)表达直观,参数少,规避了椭圆不确定集或预算不确定集需要额外参数标定的麻烦。
- 从求解角度,盒式不确定集配合C&CG算法,子问题可以用线性对偶求解,避免了双线性项带来的非凸求解困难。
2.2 数学模型:目标函数、约束、不确定集的定义
先给一个标准的确定性模型骨架,再引入鲁棒化改造。
系统结构假设:
- 风电WT、光伏PV、燃气轮机GT、储能ESS、上级电网购电/售电。
- 调度周期 T=24h,步长1h。
- 决策变量包括:GT出力、储能充放电功率、购售电功率、弃风弃光量、碳交易量、绿证交易量。
确定性目标函数(最大化收益):
[
\max \left( \sum_t \pi_t^{buy} P_t^{buy} + \pi^{GT} P_t^{GT} + \pi^{green} G_t^{sell} - C^{GT} P_t^{GT} - C^{OM} P_t^{ren} - \pi^{grid} P_t^{buy} - C^{carbon} E_t^{buy} - \lambda \cdot \text{penalty} \right)
]
其中:
- (\pi_t^{buy}) 是售电电价(向用户售电),(P_t^{buy}) 是售电功率,这里园区作为一个售电主体。
- (\pi^{GT}) 是燃气轮机售电/自用电的边际收益(如果燃气轮机发电自用,则为避免的购电成本)。
- (\pi^{green}) 是绿证价格,(G_t^{sell}) 是绿证出售量(对应可再生能源发电量中超出配额的部分)。
- (C^{GT}) 是燃气成本折算的单位发电成本。
- (C^{OM}) 是可再生能源运维成本。
- (\pi^{grid}) 是向上级电网购电的分时电价,(P_t^{buy}) 是购电功率。
- (C^{carbon}) 是碳价,(E_t^{buy}) 是碳配额购买量(如果实际排放 > 配额,则为正,表示支出;如果 < 配额,则为负,表示收益
