开头做配电网规划这些年我有一个很深的感触分布式光伏越装越多电网调度越来越像“端起碗吃肉放下碗骂娘”——光伏大发的时候电压越限阴天的时候又缺无功支撑一台台逆变器各顾各的根本形不成合力。集群划分就是解决这个问题的关键手段把地理位置邻近、电气特性相近的节点打包成一个个虚拟子群落让调控从“全域细碎操作”变成“分区协同管理”。但这里有个非常容易踩的坑很多划分配对算法只盯着电气距离和潮流耦合把楼宇的空间布局完全抛在脑后结果划分出来的集群在“电气上合理”运维人员拿到图纸一看却傻眼了——一个集群的天南地北、楼栋犬牙交错跨街道跨路网根本没法实际运维。这个项目做的事情就是在传统电气集群划分的基础上把楼宇的空间布局信息作为约束和特征显式地加进规划模型。楼宇的坐标、密度、屋顶光伏安装潜力、负荷水平全部参与聚类最后用Matlab实现整套“数据清洗→特征构建→集群划分→指标评估→结果可视化”的流程。适合电力系统方向的研究生、做分布式光伏消纳的规划工程师以及正在研究配电网分层调控的同行参考。1. 项目全貌为什么集群划分要盯上楼宇空间布局1.1 集群划分到底解决什么问题先捋清楚一个基础问题为什么要做集群划分大规模分布式光伏接入后配电网从原来“单向潮流、无源被动”变成了“多向潮流、有源主动”。台区变压器出口的潮流方向可能在一天之内反复翻转节点电压波动幅度肉眼可见地增大。此时如果还是像以往那样一个个节点单独调通信成本高、协调难度大而且很难做到全局最优。集群划分之后每个集群内部形成相对独立的“源-网-荷-储”平衡单元调度中心只需要给每个集群下达一个总功率目标集群内部的分布式电源、储能、可调负荷自行协调。好处非常直观一是提高了调度效率控制变量维度从几百几千个节点降到了几个集群二是增强了消纳能力集群内光伏出力富余时可以就地平衡减少向上一级电网反送功率三是提升了供电可靠性故障时可以做到集群孤岛运行保住重要负荷。但这里的关键问题在于怎样划分才是“好”的集群早期方案拿电气距离做谱聚类或者用基于潮流追踪的耦合度指标做模块度寻优在IEEE标准节点系统上看着效果不错。可放到实际城区配电网问题马上就暴露了。实际配电网的拓扑跟着城市路网走楼宇的位置、朝向、高度、功能决定了负荷特性和光伏安装条件。如果把空间上相隔几个街区的楼宇划分进同一个集群虽然电气上它们可能共用一条馈线但运维、检修、通信走线的物理路径全部被打乱实际执行起来阻力极大。1.2 楼宇空间布局信息到底提供了什么楼宇空间布局不是简单的地理坐标它携带的信息密度非常高。第一层信息是“位置”楼宇与楼宇之间的实际距离决定了电缆沟道、架空线路的物理走线长度这直接影响网架接线方案的可行性和经济性。第二层是“形态”建筑面积和屋顶结构决定光伏可安装容量板式楼、点式楼、坡屋面、平屋面的可利用面积差别很大。第三层是“功能”商业楼宇白天负荷高居民楼傍晚到夜间负荷高学校、医院、写字楼的负荷特性各不相同这种互补性放在同一个集群里能显著平滑集群净负荷曲线。第四层是“产权和运维边界”物业管理范围、配变供电范围通常遵循楼宇边界集群划分如果与这些边界交错后续协调成本不可小觑。我在项目里做的一件事就是把楼宇的经纬度坐标转成平面坐标后和负荷数据、光伏数据一起构造成特征向量参与聚类。同时把“楼宇之间空间距离是否在合理范围内”作为一个硬约束确保划分结果在地图上看起来是紧凑的、成片的。这听起来不复杂但实际做的时候会有大量细节问题后面我会逐个展开。2. 数学模型与划分指标既要电气上合理也要空间上紧凑2.1 特征指标的选择与归一化集群划分本质上是一个聚类问题特征指标选什么直接决定划分效果。单纯用电气距离会得到“电气上耦合一团”但“地理上支离破碎”的集群单纯用空间距离会得到“地图上很好看”但“电气上八竿子打不着”的集群。所以必须做综合。这个项目中我选用的特征指标分成三组空间维度楼宇节点归一化后的平面坐标x、y。如果原始数据是经纬度建议先投影成平面直角坐标比如用Web墨卡托投影不然欧氏距离的计算会有畸变。电气维度节点注入有功/无功功率以及节点间电气距离。电气距离可以通过节点阻抗矩阵计算得到对于配电网来说更实用的做法是基于潮流计算的灵敏度矩阵求取。潜力维度屋顶有效面积折算的光伏可装容量、楼宇负荷峰值、负荷类型标签编码为类别变量参与聚类时需要做特殊处理。多维度特征拼接成矩阵后必须做标准化。我在这里吃过亏某次特征矩阵里坐标数值是几百米级别的负荷数值是几十千瓦级别的结果K-means聚出来全部按坐标分组负荷特性完全没起作用。后来采用z-score标准化每个特征减去均值除以标准差各维度权重才相对平衡。2.2 目标函数与约束条件的设计整个划分策略在数学上可以表述为一个组合优化问题。目标函数我拆成两部分集群内部耦合性最大。这里用模块度指标Q来表征Q越大说明集群内部的电气连接越紧密集群之间的耦合越弱。模块度定义不展开说了但要注意配电网场景和复杂网络不完全一样边的权重需要用“实际功率传输量”来代替“0-1连接关系”这样才符合物理实际。集群空间紧凑性最优。紧凑性用集群内楼宇节点到集群质心的平均距离衡量这是一个纯粹的几何指标但非常实用。我把它叫作空间聚合度SS越小意味着每个集群在地图上越成片。总目标函数写成max F a * Q - b * S其中a和b是权重系数。这里没有固定的推荐值实际我调下来a在0.6~0.7、b在0.3~0.4范围效果比较均衡但具体要看电网规模和节点分布。如果要更严谨的做法可以用层次分析法确定权重或者画帕累托前沿做多目标寻优项目里我两种方式都写成了可选项。约束条件也比较关键每个楼宇节点必须且只属于一个集群这是聚类的基本要求。单个集群的总容量不能超过上级变压器或馈线的承载极限否则集群化调度会引发过载。集群内部的空间最大半径不能超过设定阈值保证运维车辆可以在一趟巡检中跑完。孤立节点强制归入最近集群避免出现“飞地”节点。2.3 评价指标体系划分完了总不能光看聚类的簇内平方和得有一套电气和工程上都认可的评估指标否则方案汇报的时候很难说服人。我构建的指标体系分了四层指标计算公式含义集群净负荷波动率集群净负荷标准差 / 平均净负荷衡量集群内源荷互补程度功率平衡度集群光伏总出力 / 集群总负荷越接近1平衡性越好空间聚合度节点到质心平均距离 / 集群半径衡量空间紧凑性集群间交换功率集群注入上级网络的功率绝对值之和越小说明自治能力越强这四个指标里我建议关注集群间交换功率。做过实际项目都知道集群划分得再好只要集群间交换功率大调度的协调压力依然很大。有一次测试中某个方案模块度指标很好看但两个集群之间的联络线功率几乎和馈线容量一样大调度中心根本无法接受。后来我在目标函数里显式加了集群间交换功率惩罚项才把这个问题压下去。3. Matlab代码实现从数据清洗到可视化的一整套流程3.1 数据准备与预处理Matlab实现这个项目第一步是数据整理。我把楼宇台账数据整理成CSV格式每行代表一栋楼宇字段包括楼宇编号、x坐标、y坐标、峰值负荷、年平均负荷、屋顶有效面积、光伏逆变器容量、负荷类型编码。这里提一句实际项目中数据“脏”是非常正常的坐标缺失、负荷数据为0、光伏容量和屋顶面积不匹配等问题几乎一定出现。我在代码里写了一个清洗函数对缺失坐标采用相邻楼宇坐标均值插补对负荷为0的楼宇根据建筑面积和类型估算对光伏容量超过屋顶可装上限的数据做截断处理。这些细节看起来琐碎但直接决定后面聚类质量——我见过有同学拿着包含NaN的矩阵直接跑kmeans报错后到处找原因浪费一晚上时间。数据读入后要做坐标投影。如果原始坐标是经纬度用Matlab的map工具箱可以直接投影没有工具箱的话用简化的等距投影公式也行精度对于集群划分来说完全够用。3.2 核心聚类算法实现核心算法我用了两条路线一条是K-means一条是谱聚类。K-means实现简单、速度快适合项目方案初筛谱聚类鲁棒性好尤其适用于非凸形状的簇但计算量大一些适合正式计算。K-means路线的Matlab关键代码如下% 读取楼宇特征矩阵 data readmatrix(building_features.csv); % data列[x, y, peak_load, avg_load, pv_capacity, type_code] % z-score标准化 data_z (data - mean(data)) ./ std(data); % 加入权重向量空间特征和电气特征权重可调 weight [0.4, 0.4, 0.3, 0.2, 0.3, 0.1]; data_w data_z .* weight; % K-means聚类k由肘部法则预判多次重复避免局部最优 k 5; rng(42); % 固定随机种子保证结果可复现 [cluster_idx, centers] kmeans(data_w, k, ... Distance, sqeuclidean, ... Replicates, 30, ... MaxIter, 1000); % 结果写回原表 result_table addvars(data_table, cluster_idx); writetable(result_table, clustering_result.csv);这里有几个细节需要强调Replicates参数一定要设。K-means严重依赖初始质心不重复跑几十次就很容易陷入局部最优。我设置30次重复每次随机初始化选目标函数最小的结果。随机种子要固定。不然同样一套数据每跑一次结果都不一样做实验写论文的时候会非常被动。权重向量weight怎么设我的经验是先跑一次不加权版本观察各特征维度对聚类结果的影响再手动调权重。没有一劳永逸的最优权重必须结合具体算例反复迭代。谱聚类路线的代码要复杂一些。先用楼宇节点的电气距离矩阵和空间距离矩阵加权融合得到综合相似度矩阵再算拉普拉斯矩阵的特征向量取前k个特征向量做K-means。谱聚类的优势体现在拓扑不规则、楼宇分布像“蜂窝状”的城区场景中K-means容易把狭长走廓两侧的楼宇硬切到不同集群谱聚类则能顺着连通结构边界走。% 综合距离矩阵电气距离矩阵De 空间距离矩阵Ds D alpha * De (1 - alpha) * Ds; % alpha为调和系数默认取0.6 % 相似度矩阵高斯核 sigma median(D(D 0)); % 用中位数自适应设定核宽 W exp(-D.^2 / (2 * sigma^2)); % 归一化拉普拉斯矩阵 L eye(n) - diag(1 ./ sum(W, 2)) * W * diag(1 ./ sum(W, 2)); % 特征分解取前k小特征向量 [eigvec, ~] eigs(L, k, smallestabs); % 对特征向量逐行做K-means [cluster_idx, ~] kmeans(eigvec, k, Replicates, 30);3.3 边界节点修正与后处理无论K-means还是谱聚类划分结果到了工程层面都需要做二次修正。我实际遇到的问题主要有三类第一类孤立节点飞地。某个楼宇节点被划分到距离它很远的集群中间隔了其他集群。修正方法是计算该节点与邻近集群质心的电气距离和空间距离取加权最近者直接强制改派。第二类集群容量越限。聚类只保证特征的相似性不保证集群负荷总和在变压器容量范围内所以划分后要逐集群检查容量。如果某个集群超了就把该集群中负荷最大的楼宇节点调整到邻近容量富余的集群。这里注意要优先调整靠近集群边界的节点别把集群核心拆散了。第三类孤岛分离。集群内部的楼宇如果与集群主体没有物理线路连接运行时这个“孤岛”没法和集群进行功率交换。修正方法是依据网架拓扑做连通性检查不连通的节点块全部合并到相邻集群。这段后处理完全是工程经验没有固定套路。我封装了一个后处理脚本按“容量约束检查→连通性检查→孤立节点修正→边界微调”的顺序依次执行实测每次都有效果。3.4 结果可视化Matlab的结果可视化是我做项目评价的重要一环。画图的要点是把楼宇节点按集群着色画在平面坐标上集群质心用星号标记把楼宇之间的网架联络线画出来用线宽表示功率大小最后在每个集群外围画一个半透明的凸包或圆。figure; hold on; colors lines(k); for j 1:k idx_j (cluster_idx j); plot(x(idx_j), y(idx_j), o, ... MarkerSize, 8, MarkerFaceColor, colors(j,:), ... MarkerEdgeColor, k); plot(centers(j,1), centers(j,2), ... p, MarkerSize, 15, MarkerFaceColor, colors(j,:)); end % 绘制网架拓扑连线 for e 1:size(lines,1) plot(x(lines(e,:)), y(lines(e,:)), k-, LineWidth, 1.2); end hold off;好的可视化图一张就能说明问题。我遇到过写论文时纠结“要不要放图”的情况实际上集群划分的图生成以后评审专家只看一眼就能判断方案的工程合理性。散得乱七八糟的集群说得再天花乱坠也没用图上一看每个集群都是紧凑成片、边界清晰的说服力不言而喻。4. 算例测试与效果对比4.1 算例设置为了验证策略的有效性我在项目中搭建了一个模拟某城区某供电区域的小规模算例共27栋楼宇节点涵盖商业、办公、居住、学校四种类型网架结构参照实际城区10kV馈线接线形成两端联络的环网结构。楼宇坐标分布模拟两纵两横街区格局光伏安装面积根据各楼宇屋面类型差异化设置负荷曲线取某个典型夏日的96点数据。这批数据的规模虽然不大但复杂度足够楼宇之间距离不均负荷特性差异大光伏发电与负荷的时序耦合关系明显完全能暴露算法问题。4.2 三种方案对比我做了三个方案的对比测试方案一纯电气距离谱聚类不考虑楼宇空间布局。这是很多论文里的经典做法。 方案二纯空间距离K-means只考虑楼宇坐标不考虑电气关系。 方案三本文提出的综合策略电气指标加空间指标联合聚类并进行容量和连通性修正。对比结果我整理成了表格评价指标方案一纯电气方案二纯空间方案三综合策略集群净负荷波动率0.280.410.23集群平均功率平衡度0.740.620.81集群间交换功率MW1.852.311.42空间聚合度0.620.350.41容量越限集群数120孤立飞地节点数320方案一电气指标看似不错但空间上一团糟还有容量越限问题方案二地图上很规整但电气指标全面拉垮方案三在电气和空间之间取了平衡没有出现越限和飞地节点。4.3 关键结论从上面的数据能提炼出几条硬结论第一只做电气聚类在实际工程中不可行。表里方案一的集群间交换功率虽然比方案二小但空间聚合度0.62意味着集群内部节点平均距离超过集群半径的60%这个集群在实际运维中没法用。第二空间信息加入后容量越限问题自动缓解了。原因是空间紧凑的集群天然意味着馈线走线短、线损小、电压支撑效率高从物理上规避了部分过载风险。第三综合策略的功率平衡度提升非常明显。因为楼宇类型信息参与聚类后商业和居住楼宇被有意或无意地分到同一个集群日间商业负荷和傍晚居民负荷形成互补集群净负荷曲线被拉平了。5. 常见问题排查与实操避坑5.1 典型异常与解决方案速查我在代码调试和多个案例测试中整理了一份问题速查表基本都是踩过的坑现象可能原因解决方案聚类结果每次跑都不一样没有设置随机种子在kmeans前执行rng(固定值)某个集群节点数只有1个K值选得太大用轮廓系数或肘部法则重新选K划分后地图上出现严重交叉空间坐标权重过低提高特征矩阵中坐标维度的权重集群容量总和超过变压器限值聚类完全没考虑容量约束加入容量修正后处理流程谱聚类特征分解报错相似度矩阵含有负值或NaN检查距离矩阵归一化和核函数参数电气距离计算误差大用直流潮流近似替代交流潮流改用牛拉法潮流结果计算灵敏度矩阵结果对比不直观可视化只画散点不画拓扑把网架连线画出来集群边界一目了然5.2 参数调优个人经验关于集群数K的选取这是出现频率最高的问题。有个很简单的经验先按“集群数量与节点数的平方根成正比”粗估一个范围再分别计算轮廓系数取最大值对应的K。但要注意轮廓系数也有局限它对凸状簇友好对狭长簇会偏低。所以我会结合工程实际做人工判断——比如一个园区期望每个集群大约覆盖一个台区范围直接据此定K再评估结果。不必迷信自动选K。权重系数的确定我认为是项目中真正需要反复试的部分。电气指标权重a和空间指标权重b没有解析解也没有标准答案。我的做法是固定其中一组扫参另一组画出目标函数曲线的拐点。拐点附近就是权重的合理区间。曾经有个案例a超过0.7后空间聚合度指标急剧劣化低于0.5后电气模块度明显下降所以在0.5~0.7之间取0.6就成了一个合理折中。还有一点调试技巧需要分享Matlab脚本运行时卡死十有八九是矩阵维度不匹配。用size()检查所有输入矩阵习惯性地在代码开头写一行assert(size(A,1) size(B,1), 矩阵行数不一致)。这个习惯帮我少走了很多弯路。5.3 数据治理的隐蔽陷阱做这个项目时隐蔽陷阱不在算法里而在数据里。楼宇的“屋顶有效面积”是最坑的字段。很多台账里直接填建筑总面积但建筑总面积包括外墙和内部结构真正能装光伏的屋面面积可能只有一半甚至三分之一。如果直接拿建筑总面积算光伏可装容量整个集群的功率平衡度评价就是空中楼阁。正确的做法是乘一个屋面有效系数板式住宅楼大约是0.5~0.6商业裙楼0.7左右坡屋顶老小区可能只有0.3。负荷数据的时间同步性也容易出问题。楼宇台账可能来自不同部门有的记录的是夏季峰值有的记录的是冬季峰值直接进入聚类矩阵会导致负荷特性失真。我统一用典型日的96点数据对每个楼宇做全年逐时负荷的最大值归一化保证数据口径一致。坐标数据的坐标系混乱问题也出现过。部分楼宇用的是CGCS2000坐标部分用的是地方城建坐标两者差了几百米一进聚类矩阵全乱套。我后来养成了习惯所有坐标数据进项目的第一件事先画散点图肉眼看分布是否合理。这一步可以过滤掉90%的坐标系问题。结尾的个人体会把这个项目完整做下来我最大的体会是集群划分这个题目电气公式写出来不难代码跑通也不难难的是让划分结果真正能落地。楼宇空间布局不是一个可有可无的附属条件它是连接“电气计算世界”和“物理运维世界”的关键桥梁。纯电气指标在论文里看着精彩拿到地图上一对照就露馅纯空间指标虽然图纸好看但电气上不可控。只有把两个维度都放进去互相制约、互相补充产出的方案才有可能被实际调度人员接受。再分享一个调试中的小技巧如果你在跑聚类时发现结果总是反直觉先别急着调权重和算法把可视化图中各楼宇节点按类型用不同形状标记出来再看。很多问题一眼就能看出来——商业楼和居民楼被分得太散或者同类楼宇被挤在一个集群里。数据里的问题用眼睛看往往比用公式算更直接。这个集群规划策略后续可以做很多扩展。比如在特征矩阵里加入储能配置位置和容量的影响或者用深度嵌入式聚类替代传统K-means做更复杂的特征提取。再往工程走一步可以接入实时量测数据让集群边界随季节性负荷变化动态调整。但这些都是在分清“电气合理”和“空间可行”之后的事了。先把这两条腿站稳后面的路自然好走。