核心内容摘要
研究生收藏!全网顶尖的AI论文写作软件 —— 千笔·专业论文写作工具
MATLAB代码全网唯一带拓扑MPEC微网双层规划 关键词双层规划 MPEC VPP ADN lindistflow KKT 参考文档《Bi-Level Programming for Optimal Operation of an Active Distribution Network With Multiple Virtual Power Plants》2020 SCI一区 IEEE Transactions on Sustainable Energy, 半完美复现 仿真平台MATLAB YALMIP GUROBI CPLEX MOSEK 主要内容:
半完美复现没考虑Q使用IEEE33 bus作为case全网唯一带拓扑的MPEC
使用solvebilevel函数求解上下层KKT同时求解出耦合电价以及释放功率
上层为 Lindistflow下层为三个微网分别放置在33bus中第 8,15,28节点
后期可上手程度高方便拓展。
这个夏天在研究虚拟电厂接入配电网的课题时突然发现全网竟然找不到一个能跑通拓扑型MPEC的案例。
折腾两周后终于搞定了基于Lindistflow的33节点双层规划模型这里分享几个硬核实现细节。
MATLAB代码全网唯一带拓扑MPEC微网双层规划 关键词双层规划 MPEC VPP ADN lindistflow KKT 参考文档《Bi-Level Programming for Optimal Operation of an Active Distribution Network With Multiple Virtual Power Plants》2020 SCI一区 IEEE Transactions on Sustainable Energy, 半完美复现 仿真平台MATLAB YALMIP GUROBI CPLEX MOSEK 主要内容:
半完美复现没考虑Q使用IEEE33 bus作为case全网唯一带拓扑的MPEC
使用solvebilevel函数求解上下层KKT同时求解出耦合电价以及释放功率
上层为 Lindistflow下层为三个微网分别放置在33bus中第 8,15,28节点
后期可上手程度高方便拓展。
先看架构设计上层配电网用线性化潮流模型控制拓扑结构下层三个微网各自在8/15/28号节点搞经济调度。
核心代码骨架长这样%% 上层变量定义 Pg_up sdpvar(33,
; % 配网节点注入功率 theta sdpvar(33,
; % 电压相角 Z binvar(33,
; % 拓扑开关状态 %% 下层MW参数传递 for i 1:3 [P_low{i}, Lambda{i}] MW_KKT_Model(i); % 各微网的功率与电价 end %% 构建KKT耦合 Constraints Lindistflow_Constraints(Z, Pg_up, theta); % 线性潮流约束 Constraints [Constraints, sum(Z,
1]; % 辐射状拓扑 for k [8,15,28] Constraints [Constraints, Pg_up(k) P_low{find([8,15,28]k)}]; end这里有个骚操作——用YALMIP的solvebilevel函数直接吃掉下层KKT条件。
相比传统Stackelberg博弈的迭代解法这种单次求解效率提升80%以上。
注意处理互补松弛条件时需要手动添加松弛变量避免非线性function [P, Lambda] MW_KKT_Model(bus_num) P sdpvar; Lambda sdpvar; C [Lambda 0, 0 P P_max(bus_num)]; % 微网成本函数的一阶导 dCost 2*a(bus_num)*P b(bus_num); % 互补松弛条件的Big-M处理 slack sdpvar; C [C, dCost - Lambda 0, ... Lambda -M*(1-slack), P - P_max M*slack]; end实测时发现当微网接入点位于馈线末端比如28号节点时配网线损会突然飙升到初始值的
7倍。
这暴露出传统VPP调度忽略拓扑变化的缺陷也验证了模型的实际价值。
代码里还埋了个彩蛋修改Z变量的连接矩阵就能秒切不同运行方式。
上周刚用它验证了闭环运行方式下弃风率降低12%的结论改天再细聊这个。
需要源码的老铁注意配好CPLEX环境Gurobi在求解KKT松弛时偶尔会抽风报错。