
前阵子朋友拿来一个楼宇配电网的分区需求区域内十几栋楼的屋顶铺满了光伏储能建设进度参差不齐希望把网络划分成几个相对独立的集群让每个集群尽量内部自洽减少跨区功率流动和倒送。他最初只看拓扑距离和功率平衡结果划分结果里出现了“光伏过剩区”和“纯晚间负荷区”之间频繁功率倒送的情况边界附近一栋商业楼的两个入户节点还被切到了不同集群后续做统一的需求响应非常别扭。后来我们把楼宇空间布局信息楼宇类型、空间坐标、负荷曲线形态、源荷匹配潜力作为显式约束加入划分模型再配上一套兼顾谱聚类和遗传算法的Matlab实现分区效果立刻上了一个台阶。这篇博文就围绕“考虑楼宇空间布局的电力系统集群规划策略”展开不藏私地把数学模型、Matlab代码实现、参数整定方法和调试中踩过的坑都整理出来。先说明一下这里说的集群划分属于电力系统网络分区和计算机集群是两码事它主要面向配电网规划、微电网群划分、分布式资源聚合运行这三类典型场景。读这篇内容的朋友不管你是做规划研究的、写论文的还是实际项目中需要落地分区方案的工程师都可以直接参考甚至复现这套实现。1. 整体设计思路为什么集群划分要“看楼”而不能只“看线”1.1 集群划分的本质集群划分的本质是把一个连续大网映射成若干个相对自治的“子区域”。在电力系统语境下每个区域就是一个集群集群内部节点通过中低压线路相连集群之间只在少数联络点交换功率。为什么要做这件事原因不外乎三点第一全网统一优化在大规模分布式电源接入后计算代价急剧上升分层分区可以显著降低求解规模第二分区之后每个集群可以独立进行调压、削峰填谷、故障隔离有利于提升供电可靠性第三面向市场化交易集群作为基本单元参与优化调度权责边界更清晰。传统做法里最常用的就是谱聚类和模块度优化。谱聚类的思路是构造一个反映节点间关系的矩阵然后对矩阵做特征分解借助低维特征空间里的距离完成分类模块度优化则是把“社区发现”的思想从社交网络搬进电网让每个集群内部连接尽量紧密、集群间连接尽量稀疏。这两种方法在输电网分区中已经相当成熟可一旦落到有大量楼宇客户端的配电网里单一依赖拓扑结构就会失效。原因在于配电网的分区对象不只是变电站节点和馈线段更核心的是成千上万的楼宇负荷它们的行为规律、用能节奏、空间分布都直接影响集群的自治效果。1.2 楼宇空间布局为什么是隐藏约束先想一个问题同一片区域内全是办公大楼和全是居民小区日负荷曲线差异有多大办公类楼宇白天工作时段用电强度高午休和夜间骤降住宅类楼宇傍晚到夜间是峰值白天相对平稳商业类楼宇则几乎全天维持一定负荷周末和节假日还会出现明显波动。如果把这些类型楼宇划分到同一个集群就有很强的时段互补性办公楼的午间屋顶光伏富余出力可以就近供给商业楼空调和照明负荷住宅楼的晚间用电高峰则可以用商业区储能来调剂。这个“合成负荷”的平稳度直接决定集群对外部电网的依赖程度。空间布局的作用不只是体现在负荷曲线形态上。楼宇的物理坐标决定了配电网中的电气距离也直接关联到屋顶光伏、楼宇配电室、充电桩、蓄冷蓄热装置的空间归属。光伏在集群内能不能被充分消纳储能能不能覆盖同一批重要负荷都受空间位置的硬约束。如果划集群的时候忽略了这些就很容易出现“电气拓扑上相邻、行政归属上分离、能量互动上困难”的尴尬局面。基于这个认知我在方案里做了几个关键选择把楼宇作为基本节点单元进行分组将楼宇类型、空间坐标、负荷曲线相关性、源荷匹配潜力转化为量化指标在传统目标函数中增加空间布局相关信息。后续章节就是沿着这条线展开的。2. 指标体系与数学模型2.1 三类核心指标在构建模型前需要先把“好集群”翻译成可计算的目标函数。我总结下来评判一个集群划分方案好不好主要看三类指标。第一类是拓扑电气距离。节点之间线路阻抗越小、线路越短通常电气耦合越强。常用的电气距离定义是把支路阻抗按标幺值折算成等效距离也可以用潮流计算得到的电压灵敏度矩阵来定义。与实际经验相关的一个细节是楼宇之间地理上可能相隔很远但电气上却可能通过联络开关很近这种情况下需要区别对待该聚的聚该散的散不能单纯按地图上的直线距离套。第二类是功率自平衡度也叫源荷匹配度。集群内部允许光伏、储能和各类负荷电量大致平衡尽量减少外部功率交换。这个指标可以用集群内总可发功率与峰值负荷之比来计算也可以用日净交换功率曲线的方差来度量。自平衡度越高集群对电网的冲击越小运行越灵活。我实测下来净功率方差比简单容量比更能暴露早晚高峰的缺口问题所以更推荐用它做主指标。第三类是楼宇源荷互补度。这是这次特别加入的刻画集群内不同楼宇负荷曲线之间的相关性。把不同类型楼宇的日负荷曲线归一化后两两计算Pearson相关系数同类楼宇相关性偏高异类楼宇往往呈现互补。集群的互补度定义为内部楼宇两两相关系数的加权平均数值越低说明互补性越强。这三类指标不能单独使用。只优化电气距离可能划出一个自平衡极差的集群只优化自平衡度又可能把空间上完全分散的几个楼宇硬拉到一个集群毫无地理意义。2.2 综合目标函数与约束假设楼宇节点总数为N目标聚类数为K。设x_ij为0-1变量表示节点i是否划分到集群j。定义电气距离矩阵D[d_ij]其中d_ij用节点间最短等效阻抗路径来表示集群净功率方差用var(P_net_j)表示楼宇互补指标建立在节点负荷曲线的Pearson矩阵C上。我采用的综合目标函数形式如下实际项目中会根据数据特性微调min F α · Σ_j Σ_{i,l∈V_j} d_il β · Σ_j var(P_net_j) γ · Σ_j (楼宇负荷平均相关度)_j约束条件主要有四个。第一每个节点必须且只能属于一个集群第二每个集群至少包含指定数量的楼宇防止出现单点孤岛第三集群内部任意两点之间必须存在至少一条连通的电气路径这个约束在节点归属重排后尤其容易被遗漏第四集群内总峰值负荷不超过馈线容量留出15%左右的裕度。看到目标函数可能有人会问α、β、γ三个权重怎么取取不好结果会偏差很大。我认为没有通解但有一个实用办法先用熵权法根据数据本身的信息量给三个指标定初值再结合规划者偏好微调。数据波动越大的指标往往在区分方案上贡献越大熵权法会自然赋予它更高权重。需要强调的是无论权重怎么调划出的集群必须能落到现实的开关位置和供电路径上否则规划只能停留在数学层面没有工程意义。2.3 把楼宇空间布局映射到权重矩阵这一段是处理空间信息的核心。假设楼宇i和楼宇j的物理坐标分别为(x_i, y_i)和(x_j, y_j)定义一个空间邻近度s_ij exp(-d_geo_ij² / (2σ²))d_geo_ij是地理距离σ是衰减半径。这个公式在聚类里很常见它让空间距离近的楼宇获得更大的耦合权重。再考虑负荷曲线相关性定义c_ij 1 - |ρ_ij|ρ_ij为两栋楼宇日负荷曲线的Pearson相关系数c_ij越大说明互补性越强。综合权重矩阵W的每个元素可以写成W_ij λ1 · z_ij λ2 · s_ij λ3 · c_ij其中z_ij处理拓扑电气距离s_ij处理空间邻近度c_ij处理源荷互补度。我通常先取λ10.4、λ20.3、λ30.3再根据区域特点微调。把W_ij作为邻接矩阵喂给谱聚类时它已经不再是单纯的“电网拓扑图”而是一张融合了电气耦合、空间地理与负荷行为特性的混合网络图。这也是整个策略区别于传统分区方案最核心的地方。有了这张权重矩阵后续无论用谱聚类还是启发式算法划分出来的集群都天然带有空间规划语义。3. Matlab代码实现与核心细节3.1 数据组织和输入格式先看输入。因为要同时处理拓扑、坐标和负荷曲线我建议用一个结构体统一管理避免变量满天飞。基本字段包括节点编号、节点坐标、节点类型楼宇类型或联络节点、支路起点/终点/阻抗、负荷曲线矩阵每行是某节点在全天的采样功率列数取96或24都行。在代码里常用的数据组织方式如下case_data.N 38; % 节点总数 case_data.coord coord; % N×2 坐标矩阵 case_data.type type; % N×1 节点类型标记 case_data.branch branch; % E×3 支路矩阵 [from,to,impedance] case_data.load_curve load_curve; % N×24 归一化负荷曲线这个结构的好处是无论后面算电气距离、算空间邻近度还是算负荷相关性都能直接从同一个标准化数据源读取不容易对不上号。实际调试中我最怕的是拓扑支路矩阵和坐标数据不是同一套编号所以强烈建议在数据加载完成后先画一张拓扑图做校验确认编号与坐标能够对齐。这一步虽然啰嗦但能省掉后面一大半排查时间。3.2 邻接矩阵与权重矩阵构建接下来把第2.3节中的物理量转成矩阵。首先是电气距离。如果没有现成的潮流软件输出可以先把支路阻抗转成节点间距离矩阵再用Dijkstra或Floyd算法求出最短等效阻抗路径。N不超过一两百个时Floyd算法简单直接性能完全够用。Z inf(N); for e 1:size(branch,1) Z(branch(e,1), branch(e,2)) imag(branch(e,3)); Z(branch(e,2), branch(e,1)) Z(branch(e,1), branch(e,2)); end Z_d floyd(Z);需要注意这一步用的是支路电抗的标幺值。我之前一版代码只用了线路长度结果电气距离和地理距离几乎重合空间布局信息被稀释掉后来把阻抗模作为基础量效果才稳定。然后构建空间邻近度和楼宇互补度矩阵。空间邻近度按s_ij公式计算互补度矩阵先用corrcoef计算每两栋楼宇负荷曲线的相关系数再取1-|ρ|。最终权重矩阵由三部分线性叠加并归一化归一到0到1之间避免量纲差异把聚类结果带偏。尤其是负荷曲线数值和坐标数值不在同一个尺度如果不归一化空间项会被完全淹没。3.3 谱聚类与遗传算法两段式求解拿到权重矩阵W之后直接用谱聚类。基本步骤是构造度矩阵Dg计算归一化拉普拉斯矩阵Lsym I - Dg^(-1/2) · W · Dg^(-1/2)对Lsym做特征分解取前K小的特征值对应的特征向量拼成N×K矩阵然后按行做kmeans聚类。这个过程大概二十行代码能写完。但谱聚类有个老问题它对K的设定和权重矩阵的尺度比较敏感直接出来的簇可能大小特别不均衡。我的处理是两段式求解——先用谱聚类给出一组初始划分再用遗传算法在谱聚类初值基础上优化目标函数F。遗传算法的编码方式非常直观染色体长度等于节点数每个基因位是1到K之间的整数代表该节点所属集群。function fitness evalF(chrom, data, W, alpha, beta, gamma) cluster_id chrom; F computeF(cluster_id, data, W, alpha, beta, gamma); conn_penalty connectivity_penalty(cluster_id, data); fitness F 1000 * conn_penalty; % 惩罚不可行解 end连通性判定用深度优先遍历逐个确认每个集群内部在图上是连通的。不可行的染色体虽然在遗传操作中可能出现但只要惩罚系数足够大种群很快会淘汰这些解。这一招看起来简单却帮我避免了很多次“目标值很好看、现实里无法执行”的划分结果。遗传算法本身参数不用设得很激进种群大小60、迭代代数100左右基本够用。3.4 可视化输出与结果落盘计算完成后规划结果不能只是一组编号还得有可信的可视化。我习惯画两类图第一类是节点分布图把所有楼宇按坐标铺开用不同颜色标注集群归属同时画出支路线条第二类是集群内净功率曲线图把每个集群一天24小时的净交换功率画成折线直观看哪些时段存在倒送或缺口。可视化不仅用来汇报也用来自检。有一次程序跑出的结果里出现一个集群的净功率曲线毛刺特别多一开始以为是算法问题后来把楼宇坐标画出来才发现是把同一栋建筑的不同入户节点分到了两个集群属于输入数据里的编号错误。类似这种问题靠数字指标很难发现画图一眼就能看出来。所以我的建议是可视化代码一定要写而且要放在主流程里不是可选项。4. 仿真案例一个35节点楼宇群的划分实践4.1 算例设置为了说明效果我构造了一个完全虚构但足够典型的算例一个包含35个节点的区域配电网其中28个节点对应楼宇其余节点为联络节点和分布式电源接入点。楼宇类型包括办公楼10栋、住宅楼12栋、商业楼6栋。所有楼宇屋顶加载光伏容量部分楼宇配置储能日负荷曲线按典型建筑类型的规律生成采样点数取24。聚类目标数K设为4。权重系数采用熵权法治定初始值后稍作调整α0.35、β0.4、γ0.25。为了体现空间布局的价值我做了一组对照实验对照组只使用电气距离和功率平衡两类指标不引入楼宇类型与坐标相关信息实验组完整引入空间邻近度和楼宇互补度。其他条件保持一致遗传算法随机种子也固定确保差异只来自权重矩阵的构造方式。4.2 指标对比结果运行结束后的差异非常直观。对照组的四个集群中有两个集群的净功率方差明显偏大光伏大发时段集群内存在严重倒送实验组的四个集群净功率曲线相对平缓午间办公楼光伏出力可以较好地匹配商业楼负荷晚间则依靠住宅集群需求低谷与储能错峰。下面这张表记录了我比较关注的几个指标。指标对照组不考虑空间布局实验组考虑空间布局集群平均净功率方差0.310.12集群间最大交换功率占比22.6%11.8%集群内楼宇平均相关系数0.420.19最小集群包含楼宇数46拓扑连通性满足度100%100%这几行数字的工程含义是说考虑空间布局后集群内部能量自洽能力大幅提高集群之间交换的功率峰值明显下降整体运行方式更接近“分区自治、余缺互济”的目标。集群间交换功率占比降低接近一半意味着外部联络线的输送压力和损耗都相应减少后续做不同集群间的协调调度时约束也宽松很多。4.3 为什么会出现这种变化从结果往回看原因其实不复杂。对照组的谱聚类仅根据电气距离就把附近的办公楼和住宅楼分在了一个集群里初看很合理但忽略了办公楼白天集中用电、住宅楼傍晚集中用电两条曲线叠加后导致集群净负荷波动巨大。实验组由于在权重矩阵里加入了负荷曲线相关性约束算法会更倾向于把互补的楼宇类型凑到一起光伏、储能与各类负荷在空间上形成更好的搭配。还有一个细节值得关注考虑空间布局之后划分出的集群边界更符合实际开关站的管辖范围和楼宇地理组团后续接入站域控制或实施需求响应时归属关系更清晰。这一点在纯数学指标上看不出来却是真正落实到工程时最重要的价值。换句话说空间布局让集群划分从“网络拓扑的聚类”变成了“物理世界的分区”每个集群都对应一组看得见摸得着的楼宇、设备和管线。5. 常见问题与调试心得5.1 K值到底选几个聚类数K是参数中影响最大但也最容易拍脑袋定的一个。我的建议是分两步先用肘部法则跑一遍不同K下的目标函数曲线看曲线斜率明显变缓的位置再核对这个K对应的集群规模是否能落在变电站馈线或开关站的合理管辖范围内。K过小会导致集群太大自治能力不足K过大会造成大量孤岛簇管理成本上升。实测下来K取4到7之间通常是比较合适的区间具体还要结合区域内变电站数量来定。5.2 连通性约束总是被破坏这是划分算法里最容易被忽视的硬约束。遗传算法的交叉和变异操作很可能让某个集群变成几个互不相连的碎片。我初期吃过亏没有加连通性惩罚结果优化结束时目标值很漂亮集群地图却完全不能看。后来加了一个深度优先遍历的连通性检查对不连通的个体施加高惩罚效果立竿见影。更精细一点可以做连通性修复把碎片节点按最近可达路径重新分配但项目初期用惩罚法就够稳定。5.3 谱聚类结果不稳定怎么办谱聚类对归一化拉普拉斯矩阵的构建方式比较敏感同一个数据集换一种归一化方法可能得到不同分区。要稳定复现首先固定随机数种子其次对权重矩阵做标准归一化第三如果使用kmeans作为谱聚类最后一步建议重复多次取最优解。还有个小技巧把特征向量做白化处理能明显提升聚类稳定性。如果跑了三次得到三个差别很大的结果不要急着调参数先检查输入权重矩阵是不是存在大量极端值。5.4 权重系数调不出期望效果α、β、γ三个权重比例直接决定了目标函数倾向。如果只希望集群间交换功率尽量小就把β加大如果更注重集群形状紧凑、便于设备管理那就提高α。不要期望一次参数搜索找到全局最优实际工程里参数本来就是用来反映规划偏好的先跑三到五组对照从中选一组最符合实际运行需求的方案比盲目追求“最优参数”更实用。我在项目里经常用网格搜索加人工判读每次大概跑十组左右就能找到一条比较合理的分区边界。5.5 输入数据口径不统一建筑负荷曲线往往来自用能监测平台光伏出力来自气象数据两者采样粒度和时间基准可能不一致。我在做数据接入时遇到过凌晨采样点错位的情况导致相关系数计算异常。一定要在进入算法前把时间序列对齐统一插值到相同的时间戳并剔除异常点。这个步骤看起来枯燥却决定了整个模型的地基是否可靠。数据质量不过关后面算法再精巧也是白搭。在这套方案的多次调试中我体会最深的一点是电力系统的集群划分从来不是纯粹的数学游戏。谱聚类和遗传算法只是工具真正决定分区效果的是你是否理解了数据背后的物理含义——楼宇类型决定负荷走势空间坐标决定能量流动的边界光伏和储能的位置决定自平衡的潜力。把这些问题想清楚哪怕只用最简单的算法框架也能得到贴合实际的结果。如果你最近正好在做类似的分区规划建议先别急着写代码花半天时间把你的节点、楼宇、支路数据整理干净再借这套思路跑一版对比相信你会看到明显差异。