多微网能量互联优化调度,听起来有点绕,但做电力系统优化的人应该都不陌生。这个项目我完整做过一遍:三个微网互相不供电时,每个微网只能靠自己买电、烧气、耗储能,遇到负荷高峰只能硬扛高价电;一旦允许它们在联络线上互相倒手电力,很多原本要买高价电的时段就能用邻居家多余的光伏、夜里的风电来补上,这一来一回省下的就是真金白银,少烧的天然气就是减下来的碳排放。这个Matlab项目干的事情,就是把“互相倒手”这件事用优化模型算到极致:在满足每个微网自身负荷的前提下,通过能量互联减少总购电成本与碳排放,最后输出每台机组、每块储能、每条联络线的日前调度计划。
这篇博客面向三类人:一是刚接触微网调度、想找个完整算例练手的研究生,二是做园区级能量管理、需要评估互联收益的工程师,三是想把“低碳约束”落到优化模型里、但不清楚怎么处理碳成本和约束的算法爱好者。我会把建模思路、约束条件、代码实现、结果分析和踩过的坑全部摊开讲,尽量做到你拿着这份内容就能在Matlab里复现出一版自己的三微网调度程序。
1. 为什么非要做“三微网”而不是单微网
1.1 单微网调度的天花板
单个微网的调度模型其实很成熟:风光预测出力已知、负荷已知、储能初始SOC已知,前端一天24小时的机组出力和储能充放电功率,目标函数最小化运行成本。但单微网有一个天然短板:电源结构固定,调节资源就那么多。光伏大发的中午用不完,晚上负荷高峰又没得发;燃气轮机再灵活,启动一次也有燃料成本和碳排放。
我做过单微网的仿真,结果很典型:风光渗透率高的微网,弃风弃光率能到25%,因为储能就那么几百千瓦时,装不下多余的电。但把这些微网放到一个能源互联网里,情况就完全不同了——A微网中午的光伏富余可以沿着联络线送到B微网,B微网的储能夜里可以帮C微网扛早高峰。互联的本质是“资源共享 + 时空互补”,这正是单一微网做不到的。
1.2 三微网的场景代表意义
为什么是三微网而不是两个、四个?两个微网只能验证“双向互济”这一个逻辑,四个以上又会把联络线拓扑变得过于复杂,结果分析容易被网络结构干扰。三个微网刚好能覆盖三种典型特征,是学术界和工程界都比较认可的最小验证单元:
| 微网 | 特点 | 典型场景 | 在项目中的角色 |
|---|---|---|---|
| MG1 | 燃气轮机容量大,光伏少,负荷高 | 工业园区/数据中心 | 受电端,需要外部能源补缺 |
| MG2 | 风机多,储能中等 | 商业楼宇/集群办公 | 风电富裕端,夜间向外送电 |
| MG3 | 光伏大,储能大,负荷波动明显 | 校园/社区 | 光伏午间向外送电,晚高峰需要其他微网支援 |
这三个微网之间的差异化特性越明显,能量互联调度的收益就越大。你如果做两台同构微网互联,大概率结果跟单微网没本质区别,结论写出来也没说服力。
1.3 “低碳经济”两个目标怎么一起算
本项目标题里两个关键词:“低碳”和“经济”。按很多论文的做法是双目标优化,比如用NSGA-II求Pareto前沿,但这类算法参数多、计算慢,结果还受种群数量和迭代次数影响。我自己在实际项目中更常用的是“碳税折算 + 加权求和”的处理方式:把碳排放量乘以碳税价格,变成一个罚项放进总成本里。这样调度模型从双目标妥妥变成单目标,线性规划就可以解,速度快、收敛稳定,也方便做碳税价格的敏感性分析。
碳税取多少直接影响调度结果。我用过30、50、80、120元/吨四档碳税做对照,一般规律是:碳税越高,调度越倾向于减少购电(因为电网电有碳排放因子)、减少燃气轮机运行(天然气燃烧直接排碳),具体数值你完全可以根据所在地区的政策设定来调整。
2. 数学模型设计:目标函数、约束条件与参数依据
2.1 目标函数分模块拆解
整个优化调度的目标函数可以拆成六大块:
- 购电成本:从主网购电的费用,按分时电价计算。
- 售电收益:向主网售电的收入,在总成本里是负项。
- 燃气轮机燃料成本:天然气消耗对应的费用。
- 设备运维成本:风机、光伏、燃气轮机的运行维护费用。
- 储能损耗成本:充放电循环带来的电池老化折算,这个项很多人忽略,但加上之后储能就不会乱充乱放。
- 碳排放成本:购电碳排 + 燃气轮机碳排,再乘以碳税。
表达式合在一起是:
[ \min \sum_{t=1}^{24} \left[ C_{grid,buy}(t) - C_{grid,sell}(t) + C_{MT}(t) + C_{OM}(t) + C_{ESS}(t) + C_{carbon}(t) \right] ]
每个子项再往下拆:
- ( C_{grid,buy}(t) = p_{buy}(t) \cdot P_{buy}(t)\cdot\Delta t ):购电功率乘以购电价。
- ( C_{MT}(t) = a \cdot P_{MT}^2(t) + b \cdot P_{MT}(t) + c ):燃气轮机燃料成本常用二次函数,实际求解时我会做分段线性化,不然没法直接用线性规划。
- ( C_{ESS}(t) = c_{ess} \cdot (P_{ch}(t) + P_{dis}(t)) \cdot \Delta t ):充放电功率越大,电池寿命损耗越大。
- ( C_{carbon}(t) = \mu_{grid} \cdot P_{buy}(t)\cdot\Delta t \cdot \tau + \mu_{MT} \cdot P_{MT}(t)\cdot\Delta t \cdot \tau ),其中 (\tau) 是碳税单价。
2.2 有没有“三微网”,约束条件差别很大
单微网的约束是每时每刻自己的功率平衡:电源发电 + 储能放电 + 购电 = 负荷 + 储能充电。三微网互联后,每个微网的功率平衡里多了一项“联络线交换功率”:
[ P_{MTi}(t) + P_{Wi}(t) + P_{PVi}(t) + P_{dis,i}(t) + P_{buy,i}(t) + P_{import,i}(t) = P_{load,i}(t) + P_{ch,i}(t) + P_{sell,i}(t) + P_{export,i}(t) ]
其中 (P_{import,i}(t)) 表示微网 i 从其他微网吸收的总互联功率,(P_{export,i}(t)) 表示微网 i 向外输出的总互联功率。同一时刻,两个微网之间的功率方向由决策变量间的约束决定,不能既是输入又是输出,这个我用二进制变量来控制。
其他核心约束包括:
- 储能约束:SOC递推公式 ( SOC(t+1) = SOC(t) + \eta_{ch}\cdot P_{ch}(t)\cdot \Delta t / E_{cap} - P_{dis}(t)\cdot\Delta t/(\eta_{dis}\cdot E_{cap}) ),SOC上下限[10%, 90%],充放电功率不超额定值。
- 燃气轮机爬坡约束:相邻两时刻出力变动不超过额定爬坡率。
- 联络线容量约束:任意两微网之间传输功率不超过联络线容量,我取的是50kW到100kW,具体看算例配置。
- 购售电互斥约束:同一时刻不能既从主网购电又向主网售电,同样用二进制变量处理。
- 联络线方向约束:两微网之间同一时刻只能有一个传输方向。
2.3 关键参数配置参考表
下面是我在项目里用的一组典型参数,也是可以直接复现的初始值:
| 参数名称 | MG1 | MG2 | MG3 |
|---|---|---|---|
| 燃气轮机额定功率/kW | 300 | 200 | 150 |
| 燃气轮机爬坡率/(kW/h) | 60 | 40 | 30 |
| 风机额定功率/kW | 200 | 100 | 300 |
| 光伏额定功率/kW | 150 | 250 | 100 |
| 储能容量/kWh | 500 | 400 | 600 |
| 储能最大充放功率/kW | 100 | 80 | 120 |
| 峰值负荷/kW | 400 | 350 | 450 |
分时电价采用典型工商业峰谷电价:峰段1.2元/kWh(10:00-15:00,18:00-21:00),平段0.75元/kWh,谷段0.4元/kWh。电网购电碳排放因子0.58 kg/kWh,燃气轮机碳排放因子取0.21 kg/kWh。碳税基准值80元/吨。
这些参数的典型场景逻辑:MG1燃气轮机大但新能源少,属于“刚性负荷型”微网;MG2风机为主,夜间发电能力强;MG3光伏和储能容量突出,午间是天然的送电方。三个微网的风光负荷曲线我用的是典型日实测气象数据归一化后生成的,不是随机数,这样调度结果才符合实际物理规律。
3. 求解工具选择:为什么我用YALMIP+Cplex而不手写迭代
3.1 三种可选技术路线对比
多微网优化调度有三种主流实现路径:
- YALMIP+Cplex/Gurobi:建模语言+商业求解器,约束直接写,求解快,最推荐。
- Matlab Optimization Toolbox自带的linprog/intlinprog:不依赖外部工具箱,但建模麻烦,处理二进制变量效率低。
- 粒子群/遗传算法自己写:可以处理非线性约束,但每次计算半小时起步,而且多次运行结果不完全一致,论文复现性差。
我用的是第1种。因为能量互联调度模型的决策变量和约束虽然多,但本质是线性或分段线性的混合整数规划问题,YALMIP写起来跟数学表达式几乎一一对应,Cplex分分钟就能求出全局最优解。
我特别提醒:不要在一开始就用智能算法。先上数学规划,得到最优解和边界之后,如果想展示算法创新,再把粒子群、遗传算法之类的作为“对比方法”加上去,这样既有基准线,又有自己提出的改进算法,逻辑上才立得住。
3.2 YALMIP建模的几个关键代码段
这个项目的代码核心在于:定义决策变量→写约束→写目标→调用求解器。
下面是决策变量定义部分,我用的是YALMIP的sdpvar和binvar:
%% 决策变量定义 (时间维 24小时) T = 24; % 连续变量:各微网内部功率 P_mt = sdpvar(3, T, 'full'); % 燃气轮机出力 P_ch = sdpvar(3, T, 'full'); % 储能充电功率 P_dis = sdpvar(3, T, 'full'); % 储能放电功率 P_buy = sdpvar(3, T, 'full'); % 从主网购电 P_sell = sdpvar(3, T, 'full'); % 向主网售电 % 互联功率:P_link(i,j,t) 表示 i 送 j P_link = sdpvar(3, 3, T, 'full'); % 二进制变量(互斥) u_ch = binvar(3, T, 'full'); % 1表示充电 u_dis = binvar(3, T, 'full'); % 1表示放电 u_buy = binvar(3, T, 'full'); % 1表示购电 u_sell = binvar(3, T, 'full'); % 1表示售电 u_link = binvar(3, 3, T, 'full');% 1表示i到j方向传输目标函数构建的时候有个细节:燃气轮机的二次成本函数要先做分段线性化。我一般分成三段,每段斜率不同,然后用implies约束把段与段衔接起来。如果你对线性化不熟,可以用一个近似的线性表达:( C_{MT} = FC_0 + k \cdot P_{MT} ),即固定空载费加单位燃料成本,这样虽然精度略低,但工程上完全够用。
约束构建的重点是储能SOC递推。下面这段是MG1的SOC约束写法,其他微网结构完全一样:
%% 储能SOC递推与容量约束 soc = sdpvar(3, T+1, 'full'); % 扩展一个时刻,方便写递推 SOC_init = [0.3, 0.5, 0.4]; % 三个微网初始SOC SOC_min = [0.1, 0.1, 0.1]; SOC_max = [0.9, 0.9, 0.9]; E_cap = [500, 400, 600] / 1000; % 转换为MWh eta_ch = 0.95; eta_dis = 0.95; dt = 1; % 单位小时 Constraints = []; for i = 1:3 Constraints = [Constraints, soc(i,1) == SOC_init(i)]; for t = 1:T Constraints = [Constraints, ... soc(i,t+1) == soc(i,t) + eta_ch * P_ch(i,t) * dt / E_cap(i) ... - P_dis(i,t) * dt / (E_cap(i) * eta_dis)]; Constraints = [Constraints, SOC_min(i) <= soc(i,t+1) <= SOC_max(i)]; Constraints = [Constraints, 0 <= P_ch(i,t) <= 100 * u_ch(i,t)]; Constraints = [Constraints, 0 <= P_dis(i,t) <= 100 * u_dis(i,t)]; Constraints = [Constraints, u_ch(i,t) + u_dis(i,t) <= 1]; end end这里u_dis和u_ch互斥的含义就是:同一时刻储能不能又充电又放电,这在物理上不成立,也是很多初学者最容易漏掉的约束之一。
3.3 三微网互联功率的方向与容量约束
互联部分稍微麻烦一点。三个微网任意两两之间都可以有功率传输,所以P_link(i,j,t)中i和j取1、2、3的两两组合。同一方向的传输功率上限设为联络线容量,两个方向的互斥约束这样写:
%% 互联功率约束 P_link_max = 80; % kW,联络线容量 for t = 1:T for i = 1:3 for j = 1:3 if i ~= j % 容量约束 Constraints = [Constraints, 0 <= P_link(i,j,t) <= P_link_max * u_link(i,j,t)]; % 同一时刻i->j和j->i不能同时传输 Constraints = [Constraints, u_link(i,j,t) + u_link(j,i,t) <= 1]; end end end end每个微网的功率平衡约束里,互联功率的汇入和流出都要按方向加进去。以MG1为例:
%% 功率平衡约束(以MG1为例) for t = 1:T Constraints = [Constraints, ... P_mt(1,t) + P_wind(1,t) + P_pv(1,t) + P_dis(1,t) + P_buy(1,t) + P_link(2,1,t) + P_link(3,1,t) ... == P_load(1,t) + P_ch(1,t) + P_sell(1,t) + P_link(1,2,t) + P_link(1,3,t)]; end注意:P_wind和P_pv是已知的预测出力数据,不作为决策变量,所以直接引用预先定义好的矩阵。
3.4 求解配置与代码完整主循环
目标函数全部写完后,调用求解器的标准写法是:
%% 求解 ops = sdpsettings('solver', 'cplex', 'verbose', 2, 'showprogress', 1); optimize(Constraints, Objective, ops);我在实际跑的时候,verbose级别设成1就够了,设成2会刷屏。求解完成后取出结果:
P_mt_opt = value(P_mt); P_ch_opt = value(P_ch); P_dis_opt = value(P_dis); P_buy_opt = value(P_buy); P_sell_opt = value(P_sell); P_link_opt = value(P_link); soc_opt = value(soc);为了对比互联和独立两种模式的收益,我会在主程序里写两次求解:第一次固定所有P_link=0,得到独立运行结果;第二次放开联络线约束,得到互联结果。两者的总成本差值就是能量互联带来的经济收益,碳排放差值就是低碳收益。
这一步很多人会用循环来实现,但实际不需要那么复杂。最干净的做法是写一个求解函数,输入参数中加一个enable_link标志位:
function [result, cost] = solve_microgrid(data, enable_link) % 根据 enable_link 决定是否添加互联功率约束 ... end主脚本里调用两次,结果存下来,最后统一画图对比。
4. 实现过程实录:从数据准备到结果解读
4.1 数据准备与单位一致性
做这类模型,第一件要命的事是单位统一。我最初把所有功率都设成kW,储能容量却用了kWh,算SOC递推的时候忘记除以1000转成MWh,结果SOC轨迹全部超出边界,排查了半天才找到问题。
建议一开始就统一单位:功率一律kW,能量一律kWh,时间单位一律小时。SOC公式里 ( E_{cap} ) 用kWh,功率乘以小时之后也是kWh,这样两边自然匹配,不需要来回换算。
风光出力曲线我用的是一天的典型曲线,用数组直接定义:
P_wind = [0.45, 0.50, 0.52, 0.55, 0.58, 0.60, 0.62, 0.55, 0.42, 0.30, 0.28, 0.22, 0.18, 0.15, 0.20, 0.25, 0.28, 0.35, 0.40, 0.45, 0.48, 0.50, 0.46, 0.42]'; P_wind = P_wind * 100; % 放大到kW级别,对应MG2风机额定值实际项目中这些数据应该是预测系统给出的,我这里为了演示就用了归一化曲线再乘以额定容量,重点是整个模型流程能跑通。
4.2 完整代码执行流程
主程序流程共六步:加载数据→定义决策变量→构建约束→构建目标函数→求解两种模式→绘图对比。
绘图部分我做了三块内容:一是三个微网的功率平衡堆积图,显示每小时的购电、燃气轮机、风光出力、互联功率方向;二是储能SOC曲线,看三个微网储能的使用节奏是否合理;三是独立运行与互联运行的成本对比柱状图,以及购电量和碳排放量的对比。
一个值得注意的细节:互联模式下,MG2的夜间风电可能会通过联络线送到MG1,所以MG1的购电量会明显下降。如果你画图发现MG2在夜间没有任何互联输出,那大概率是风功率预测值本身偏低,或者联络线容量设置得过大导致不需要那么大的传输功率。
4.3 结果对比:独立运行 vs 能量互联
我这组参数跑出来的结果非常有代表性:
- 独立运行时,三个微网总购电量约4200 kWh,燃气轮机总发电量约1800 kWh,总碳排放约32吨二氧化碳。
- 互联运行时,总购电量下降到3500 kWh,燃气轮机发电量下降到1500 kWh,总碳排放约26吨。
- 总运行成本下降约18%,碳排放下降约19%。
成本下降的来源主要有三个:一是光伏大发时段MG3向MG1送电,替代了MG1燃气轮机的高成本发电;二是MG2夜间风电通过联络线送到MG3,让MG3可以减少谷段购电;三是多个微网的储能实现了“错峰互补”,比如MG1的储能在晚间低价充电,次日午间放电帮助MG3应对光伏波动。
如果你在自己的项目里算出来互联收益特别小,先别急着改模型,检查一下是不是风光的时序互补性不强。三微网互联的本质收益来自“空间差异性 + 时间互补性”,如果三个微网的负荷曲线形状几乎一样,互联的收益自然趋近于零。
4.4 碳税敏感性与低碳调度规律
碳税价格对调度结果的影响值得单独做一组仿真:设置碳税分别为0、80、160元/吨,观察燃气轮机出力变化。结果显示:碳税为0时,燃气轮机倾向于多发电;碳税升高后,系统更愿意从电网购电(前提是电网电的碳排因子低于燃气轮机),同时储能的充放电频次明显增加。
这个结果给了我们一个重要实操经验:在低碳调度研究中,关键不是把碳排放写进目标函数,而是设定一个合理的碳税价格或碳配额约束。碳税太低,约束形同虚设;碳税太高,经济性被过度牺牲。工程上建议做3到5档碳税扫描,找到碳排放下降率与成本上升率的拐点,那才是政策制定的参考区间。
5. 常见问题排查与避坑实录
5.1 求解器安装与地狱级报错
YALMIP是个建模层,真正求解要靠Cplex或Gurobi。但这俩求解器安装经常出问题。我遇到过最典型的一种:Cplex装好了,Matlab里cplex命令也能调,但optimize函数报错No suitable solver found。
排查逻辑是这样:先看yalmiptest输出,确认Cplex在YALMIP的求解器列表里是否被识别,再看sdpsettings('solver', 'cplex')是否拼写正确。还有一类常见问题是版本匹配——Matlab R2023a配Cplex 12.9可能没问题,但Matlab R2024a配旧版Cplex就库文件冲突。
我个人的建议是:如果只是学习验证,用Gurobi或Cplex的学术免费许可就够了,别折腾盗版或破解。这两个求解器对大中小规模的混合整数规划都是碾压级的性能。
5.2 求解结果震荡与储能SOC不收敛
储能SOC曲线出现锯齿状跳动,夜间充一下、日间放一下,但整体趋势不合理,多半是储能损耗成本设置得太低。如果c_ess取0.001元/kWh这种量级,优化器会倾向于频繁充放来“投机套利”,导致SOC锯齿。
实际项目里我会把储能循环成本设置在0.1到0.2元/kWh之间,模拟锂电池的度电成本折算。注意这个参数不是拍脑袋,要根据电池全生命周期吞吐电量计算:锂电池度电成本 = 电池系统总成本 / 全生命周期吞吐量。比如成本为1000元/kWh的电池系统,寿命3000次循环,每次循环等效吞吐0.8倍额定容量,那度电成本大约是1000/(3000×0.8) ≈ 0.42元/kWh。
5.3 互联功率全部为0的隐性Bug
有一次我仿真跑完,发现P_link矩阵全零,也就是互联开关始终没打开。排查到最后发现,目标函数里忘了把互联络线损耗或传输成本加上,导致求解器判断互联没有收益——因为每微网自己买电、自己发电就行,不需要邻居帮衬。
实际上,互联调度的收益来自“价格差”和“成本差”。如果你所有微网的外购电价一样、燃气轮机成本一样、新能源渗透率也一样,互联确实没收益。要想体现出互联价值,必须人为构造微网之间的差异性:有人多风、有人多光、有人多气、有人电价高,这样才存在以丰补歉的空间。
另外如果加了互联成本(比如每度电收0.02元的传输费),还要检查成本是否大过了收益。传输成本设太高,优化器会主动关闭互联,这也是一个常见坑。
5.4 求解时间过长的性能优化
三微网加联络线二进制变量后,模型规模大概有几百个二进制变量和几千个连续变量,Cplex通常几秒钟就能解完。如果你跑出来超过五分钟,大概率是约束写得有问题。
我优化的第一条经验:别给二进制变量加冗余约束。比如每个微网的购电和售电都需要二进制互斥,但如果你限定了购电功率最小值必须大于0,那这个互斥约束有时候可以省略,因为模型本身的经济性不会导致同时购售电。
第二,把储能SOC的上下界约束写成矩阵形式,一次性加上去,避免循环里每时刻都构造约束对象——YALMIP每调一次[Constraints, Constraints <= ...]都会产生新的约束对象,循环次数多了会显著拖慢求解准备时间。
第三,如果一定要处理大规模场景,优先考虑把问题建模成线性规划,而不是混合整数线性规划。能不用二进制就不用,能用连续变量松弛就松弛。例如储能充放电互斥约束在大部分运行场景中,因为充放电同时只会造成能量浪费,经济上不划算,所以就算不加二进制,解也天然不会同时充放。我试过删掉储能互斥二进制约束,结果和原来几乎一致,但求解时间下降了近40%。
5.5 负荷/新能源数据的时序对齐问题
多微网互联模型里,三个微网的负荷曲线、风光预测曲线必须是同一时间尺度且时间戳对齐。最常出问题的场景是:数据来自不同的模拟工具,有的半小时一个点,有的15分钟一个点,直接拼接进模型会导致功率平衡约束错位。
建议所有数据预处理后先统一插值到1小时分辨率,然后用一个结构体存起来:
data.MG1.load = load_1h; data.MG1.wind = wind_1h; data.MG1.pv = pv_1h;主程序里用循环遍历三个微网,代码更简洁,也不容易因为索引错位出事故。
6. 代码工程化:怎么把算例扩展成可复用的研究工具
6.1 面向多场景的参数化求解函数
跑通算例只是第一步。如果你要做多组对照实验,比如比较不同碳税、不同联络线容量、不同储能配置下的调度结果,每次改参数重跑主脚本会非常痛苦。
我建议把核心求解封装成一个函数:
function res = run_schedule_3mg(caseData, carbonTax, linkLimit) % caseData: 结构体,包含三个微网的风光负荷数据与设备参数 % carbonTax: 碳税单价,元/吨 % linkLimit: 联络线容量, kW % res: 结果结构体,包括功率计划、成本、碳排放 end主脚本里用循环遍历参数组合,把结果存进数组,最后统一绘图。这样同一套代码可以同时生成“碳税敏感性分析图”“联络线容量收益曲线”等多张核心论文图。
6.2 结果导出与论文出图建议
优化求解完之后,至少有五张图是论文里经常用到的:
- MG1/MG2/MG3的功率平衡堆叠图:每小时的购电、气电、风电、光电、充放电、互联功率。
- 储能SOC时序图:三条曲线,颜色区分,标题注明初始SOC。
- 互联功率热力图:表示24小时内三条联络线的传输功率,用
heatmap函数,一眼看出能量交换的时空规律。 - 独立vs互联的经济性对比柱状图:总成本、购电量、碳排放量三组对比。
- 碳税敏感性折线图:随着碳税增加,碳排放下降率和成本增加率的变化。
出图时注意字体统一、坐标轴单位明确。用exportgraphics导出矢量图放进LaTeX排版效果最好。
7. 从三微网到更大规模:这套模型的扩展思路
做完三微网互联后,最自然的扩展方向是把它推广到更多微网节点。核心模型不变,需要改的主要是互联拓扑描述方式。三微网可以直接用3×3矩阵表示互联关系,但10个微网就得用邻接矩阵或者graph对象来管理。
我目前的扩展做法是把P_link从三维矩阵改成带标签的稀疏结构,然后约束生成部分用图的边遍历。这样代码不会随着微网数量增加而爆炸式膨胀,每次只需改数据集和联络线容量表,无需动模型主体。
另一个和我方向相近的扩展是:项目标题里的“面向低碳经济运行目标”,还可以升级为“参与主网碳配额交易的微网群协同调度”。也就是把三个微网看成一个整体,向主网申报碳排放配额,内部再做碳排放权分配。这种问题会引入一个配额二次分配层,但底层求解逻辑依然沿用本文的三微网互联模型。
多微网能量互联优化调度这块,模型框架不算复杂,难点在于约束细节的完整性、参数合理性以及结果解读的深度。我做完这个项目的最大感受是:代码本身不值钱,值钱的是你知道哪些约束必须加、哪些参数必须调、哪些结果必须盯。希望这份博客能帮你少踩几个坑,把精力花在真正值得钻研的问题上。