
做过分区规划的人应该都有个体会把一张几十栋楼的园区电网图摊开电气接线是一张图楼宇空间分布又是一张图两张图常常对不上。集群划分要是只盯着电气距离划出来的分区可能看起来导线路径很顺但实际运维时要绕着走廊和道路跑半天。这个问题的核心就是如何在考虑楼宇空间布局的前提下做电力系统集群规划策略再用Matlab把它落地成可复现的代码流程。这篇记录面向两类人一是刚接触配电网和园区微电网规划的初学者想搞明白集群划分到底在分什么、为什么不能忽略楼宇位置二是已经写过聚类代码的工程师想补充空间连通性处理和评估指标设计。无论你手里是一个校园、一片产业园还是一个小型城市馈线网络思路基本通用。1. 为什么集群划分要“先看空间再看接线”1.1 集群划分在电力规划里到底解决什么问题我以前第一次接触集群划分时也疑惑过电网里的节点和线路都已经清清楚楚画在系统图上了为什么还要专门做一次“分群”后来被安排去做一片园区的分布式电源接入规划才彻底明白是怎么回事。一个区域电网如果节点数量少比如十几台变压器、几十条馈线那直接做全网优化也算得动。但真实园区动辄上百个负荷点加上分布式光伏、储能、充电桩之后变量数量翻好几倍。你在全网维度去做无功优化、经济调度或者可靠性校核计算量很容易失控而且很多方案看起来全局最优落到实际运行时却因为跨区域协调困难而根本执行不了。集群划分的价值就是把大系统切成若干个相对独立的“子网络”。每个集群内部电气联系紧密、负荷特性相近、空间上连续集群与集群之间只保留少量联络线。之后做规划就分两步先在集群内部做精细化设计和优化再在集群之间做协调和校验。这样既降低了计算规模也让调度、运维、故障隔离都有了清晰的物理边界。在现在的配电网环境中集群划分还被赋予了新的作用。比如分布式光伏渗透率高了以后配电网想削峰填谷必须知道哪些楼宇可以作为一个需求响应聚合体谁跟谁互补某个区域发生故障时要判断哪些负荷可以由哪几个临近集群做黑启动恢复。这些任务都离不开一个事先划好的、考虑过空间布局的集群方案。1.2 楼宇空间布局为什么不能忽略很多第一次做聚类的人会把“电气距离”当成唯一标准把节点阻抗矩阵算出来哪个节点跟哪个节点电气上近就分到一组。这个思路对单纯理论拓扑没问题但放到有楼宇的园区里就会出现很别扭的情况。我见过一个模拟园区项目里的例子A楼和B楼在同一条馈线的一头一尾电气距离确实近聚类结果把它俩分到同一个集群。但实地看现场A楼在主干道北侧B楼在主干道南侧中间隔了一条双向四车道而且两侧的电缆通道完全不通。真正管理南侧片区的箱变和运维班组在B楼那一侧北侧则需要绕行到两公里外的一个路口才能过来。也就是说电气上的近邻实际运维时并不近。楼宇空间布局提供的信息不止是坐标位置。楼宇的朝向和高度会影响光伏装机潜力楼宇功能决定了负荷是白天高还是晚上高楼宇间距决定了电缆通道和光缆走廊怎么走甚至楼宇之间的地下空间是否连通都会影响故障检修时的可达性。如果你完全忽略这些划出来的集群可能在地图上交错得乱七八糟边界互相咬合后续无论是做拓扑图配色还是安排巡检路线都没法用。所以合理的集群划分策略应该把楼宇空间布局作为一个显式的约束和权重引入模型集群内部不仅要电气紧密、负荷互补还要在地理空间上形成一个连通的、尽量紧凑的区域。这样每个集群才有可能对应到一个实际可管理的片区。1.3 哪些场景最需要这套策略如果你做的项目只是简单的一条架空线线路规划那不需要搞集群划分这么重。但下面这几类场景空间布局几乎必须进模型。第一类是园区和校园微电网。这种场景的特点是楼宇密集、产权边界明确、通信和计量点很多通常要按片区成立子微网每个子微网有独立的能量管理单元。如果划分时不看楼宇空间布局两个隔着运动场和道路的楼被塞进一个子微网线路穿越区域就很麻烦。第二类是配电网规划中的分布式光伏和储能选址定容。储能容量、光伏容量在规划阶段是按集群配置的一个集群往往对应一台配变或者一个箱变的供电范围。这个范围在地理上必须是连续的否则实际接线时会出现跨路段供电线损和电压降都会恶化。第三类是需求响应聚合与虚拟电厂运营。聚合商要给用户划分响应单元每个响应单元最好在空间上邻近因为通信延时、现场检修、人工核查的成本跟距离强相关。同时要保证群内负荷曲线有一定互补性这就需要负荷相似度矩阵参与聚类。第四类是故障自愈与黑启动分区。配电网发生故障后系统会按预置的集群边界进行孤岛划分和负荷转供。边界如果不符合道路和走廊的物理约束隔离操作和恢复操作都很难执行。这些场景的共同点是集群结果最终要落回到物理世界中去运行而不是只停留在论文公式里。所以我在做方法时宁可稍微牺牲一点电气聚类纯度也要保证空间连通和空间紧凑。2. 把楼宇空间布局“翻译”成矩阵和约束2.1 输入数据的准备坐标、负荷曲线、拓扑缺一不可要把楼宇空间布局送进Matlab首先得把数据整理成规范的表。我通常用一个CSV文件每一行代表一个楼宇或一个负荷节点列结构大致如下字段示例说明楼宇IDB01全园区唯一X坐标125.6本地平面坐标系单位mY坐标85.3本地平面坐标系单位m建筑面积12000单位m²层数6用于估算负荷和光伏潜力功能类型办公/商业/住宅影响负荷曲线形态典型日负荷1156.296点曲线或24点曲线典型日负荷2143.8每一列对应一个时刻所属馈线F01电气拓扑所属馈线是否含光伏1决定集群内容量属性坐标数据一定要统一到同一个平面投影。如果拿到的原始数据是经纬度需要先转换成平面坐标否则后面计算距离时量纲会出问题。负荷曲线尽量采用夏季和冬季两个典型日的96点数据因为集群划分本来就是要应对季节性的负荷形态差异只拿峰值功率做聚类会丢掉重要的时序信息。拓扑信息很多新手会忽略。电气距离矩阵需要知道节点阻抗或者至少知道馈线路径和线型如果没有完整阻抗参数也要拿到“哪些箱变之间通过什么线径的电缆连接”这样的信息这样能用线路长度和单位阻抗折算出一个近似电气距离。如果实在拿不到至少要把馈线归属关系整理出来作为约束的候选边。2.2 三种相似度矩阵各自刻画什么集群划分的本质是聚类聚类的核心是相似度矩阵。我这里会构建三个维度上的相似度再把它们加权合并。第一个是空间距离矩阵。最朴素的做法是欧氏距离[ D_{geo}(i,j)\sqrt{(x_i-x_j)^2(y_i-y_j)^2} ]欧氏距离适合楼宇之间没有明显障碍、大体可以直线到达的场景。但如果园区里有河流、围墙、车行主干道这类无法直接跨越的障碍欧氏距离会给出虚假的近邻关系。这时候我更喜欢用图最短路径距离先用楼宇坐标构建一个空间邻接图再用图上的最短路径距离作为空间距离。邻接图可以用Delaunay三角剖分生成也可以用K近邻生成还可以手工删掉跨障碍的边。这样得到的距离更贴近真实可达性也为后面的连通性检查打了基础。第二个是电气距离矩阵。在潮流计算和短路计算里节点之间的戴维南等值阻抗可以反映电气联系强弱。具体算公式是[ D_{elec}(i,j)Z_{ii}Z_{jj}-2Z_{ij} ]其中Z是节点阻抗矩阵。物理意义可以理解为在i点注入单位电流、在j点抽出单位电流时两个节点之间的等效电压差。这个值越小说明两节点电气上越紧密。如果系统节点比较多先构造节点导纳矩阵Y再求逆得到Z。要注意如果楼宇节点和系统节点不是一一对应需要先建立映射矩阵把楼宇映射到最近的电气节点上。第三个是负荷曲线相似度。两个楼宇的负荷曲线如果形态接近那么在集群内部同时达到峰值的可能性就高这不是好事。我更希望集群内部的楼宇在时间上互补比如办公楼白天高、住宅晚上高两者放在一个集群里整体负荷曲线更平缓对上级变压器的压力更小。负荷曲线距离我一般不用皮尔逊相关系数因为它只看形态不看幅值。我会先把每条负荷曲线归一化到[0,1]区间然后计算欧氏距离。这样做既保留了峰谷时段信息又兼顾了用电量级差异。如果某个集群里都是写字楼虽然曲线形态相似但不同建筑面积差异很大归一化后距离仍然能反映相对负载规律。最后用高斯核函数把距离转成相似度[ S \exp\left(-\frac{D^2}{2\sigma^2}\right) ]\sigma的取值很敏感太小会让相似度矩阵变得接近单位阵聚类退化成按最近邻分太大则所有节点相似度都接近1聚类失去区分度。我一般取所有节点两两距离的中位数作为\sigma的初值再根据结果微调。2.3 综合相似度与空间连通性约束三个相似度矩阵算完后合并成一个综合相似度矩阵[ S \lambda_1 S_{geo} \lambda_2 S_{elec} \lambda_3 S_{load} ]权重之和为1代表决策偏好。如果更看重运维可达性\lambda_1取大一点如果更看重电气耦合紧密\lambda_2取大一点如果更看重需求响应互补\lambda_3取大一点。没有绝对正确的权重关键是要做灵敏度分析把权重扫描后各指标的变化展示给决策方看。综合相似度矩阵进聚类算法之前还要做一层处理把空间不可达节点之间的相似度直接置零。我通常构造一个空间邻接图得到可达性矩阵然后用可达性矩阵去点乘综合相似度矩阵。这一步是“空间布局约束”最直接的体现效果是强制聚类算法只能优先考虑物理可达的楼宇组合。空间连通性约束更严格的定义是同一个集群内的楼宇在空间邻接图上必须构成一个连通子图不能出现集群由两块互不相邻的区域组成的情况。这个约束在聚类目标函数里显式建模是NP难的工程上我更推荐用后处理方式实现先用综合相似度跑谱聚类或k-means再检查每个集群的空间连通分量把分裂出来的小块按照相似度最大原则并到邻近集群中。还有一条约束是楼宇不可分割。现实中一栋楼通常只有一个供电入口聚类时应该让整栋楼只属于一个集群。这个约束在数据准备阶段就保证了只需要确保ID是唯一粒度不要在中间把一栋楼拆成几个节点。3. Matlab实现谱聚类骨架与连通性修正3.1 为什么偏好谱聚类而不是普通k-means聚类方法有很多k-means最常用但它在电力系统集群划分里有个明显短板它假设簇是凸球形的对不规则的图结构适应能力很差。园区里的楼宇分布往往是沿着道路排布形成狭长的条状或L形区域k-means在这种数据上很容易把一栋孤立楼划错。谱聚类的基本思想是先把相似度矩阵看成一张带权图聚类的目标变成“如何切图让切掉的边权重最小、保留的边权重最大”。这个目标跟电力系统分区天然契合我们划分集群本质上是希望群内连接紧密、群间联系松散。谱聚类的计算流程是构造相似度矩阵W计算拉普拉斯矩阵L取L的最小k个特征向量组成特征向量矩阵再对特征向量矩阵按行做k-means。这一步虽然多绕了一圈但好处是能处理任意形状的簇也支持我自己定义的综合相似度矩阵不需要额外改算法。3.2 主流程代码从楼宇坐标到集群标签下面这段Matlab代码是我自己项目里的骨架数据量在几百个楼宇节点以下都能跑得很顺畅。我把它按段落解释一下。% 读取数据前两列为x、y坐标第3列开始为96点典型日负荷 raw readmatrix(buildings_96.csv); xy raw(:, 1:2); loadCurve raw(:, 3:end); n size(xy, 1); k 4; % 集群数量可按容量需求调整 lam [0.5, 0.3, 0.2]; % 空间/电气/负荷 权重 % ---------- 空间距离Delaunay邻接图 图最短路径 ---------- tri delaunay(xy(:,1), xy(:,2)); edges [tri(:,1), tri(:,2); tri(:,2), tri(:,3); tri(:,1), tri(:,3)]; edges unique(sort(edges, 2), rows); G graph(edges(:,1), edges(:,2)); dGeo distances(G); dGeo(isinf(dGeo)) max(dGeo(~isinf(dGeo))); sigmaGeo median(dGeo(triu(true(n), 1))); S_geo exp(-dGeo.^2 / (2 * sigmaGeo^2)); % ---------- 电气距离假设已求得节点阻抗矩阵 ---------- % Z为n阶方阵由节点导纳矩阵求逆得到 Z inv(full(Y)); dElec diag(Z) * ones(1, n) ones(n, 1) * diag(Z) - 2 * Z; sigmaElec median(dElec(triu(true(n), 1))); S_elec exp(-dElec.^2 / (2 * sigmaElec^2)); % ---------- 负荷曲线相似度归一化后取欧氏距离 ---------- loadNorm loadCurve ./ max(loadCurve, [], 2); dLoad zeros(n); for i 1:n for j 1:n dLoad(i,j) norm(loadNorm(i,:) - loadNorm(j,:)); end end sigmaLoad median(dLoad(triu(true(n), 1))); S_load exp(-dLoad.^2 / (2 * sigmaLoad^2)); % ---------- 综合相似度 空间可达性过滤 ---------- S lam(1) * S_geo lam(2) * S_elec lam(3) * S_load; adjacencyMatrix adjacency(G); % 空间邻接矩阵 S S .* (adjacencyMatrix | adjacencyMatrix); % 不可达元素置零 % ---------- 谱聚类 ---------- Dm diag(sum(S, 2)); L eye(n) - Dm^(-0.5) * S * Dm^(-0.5); opts.disp 0; [V, ~] eigs(L, k, smallestreal, opts); Vnorm V ./ vecnorm(V, 2, 2); label kmeans(Vnorm, k, Replicates, 30);这段代码里有几个细节值得注意。一是Delaunay三角剖分生成的边要排序后再去重否则同一个无向边可能被重复计算两次。二是distances在图不连通时会返回Inf必须把Inf替换成有限大值否则后面相似度计算会出现全零行导致聚类出现空簇。三是对空间可达性过滤的时候我用的是邻接矩阵的对称化结果确保无向边能双向保留。eigs比eig更省内存但要求矩阵是稀疏的谱聚类里拉普拉斯矩阵往往很稠密因为相似度矩阵是全矩阵。如果节点数超过一两千建议先把相似度矩阵中小于阈值的元素截断为0再用sparse封装。3.3 连通性检查与后处理修正谱聚类跑出来的结果不一定满足空间连通性。比如有三个楼宇组成一个集群但其中两个在空间图上通过第三个楼宇才连接如果第三个楼宇被划到别的集群那两个楼宇就成了断裂块。所以聚类之后必须做一个连通性检查和后处理。我的做法是按集群遍历把每个集群里的楼宇提取出来构建子图然后看子图的连通分量数量。如果连通分量大于1就说明集群被分裂成了几个空间块。接下来把较小的块单独拿出来计算它和每个相邻集群的平均综合相似度选择相似度最高的集群并入。为了减少连锁反应块从小到大依次处理。% 检查并修正连通性 for c 1:k idx find(label c); if isempty(idx) continue; end subG subgraph(G, idx); comps conncomp(subG); compSizes accumarray(comps, 1); compIdx arrayfun((x) idx(comps x), unique(comps), UniformOutput, false); while any(compSizes 1 compSizes numel(idx)) % 存在断裂块 % 找最小的非主块 breakComp []; minSize inf; for t 1:numel(compIdx) if numel(compIdx{t}) minSize minSize numel(compIdx{t}); breakComp compIdx{t}; end end % 计算该块与其它集群的平均相似度 candidates label ~ c; avgS zeros(1, k); for cc 1:k if cc c || ~any(candidates label cc) continue; end idxCc find(label cc); tmpS S(breakComp, idxCc); avgS(cc) mean(tmpS(:)); end [~, target] max(avgS); label(breakComp) target; % 重新检查集群c idx find(label c); if isempty(idx), break; end subG subgraph(G, idx); comps conncomp(subG); compSizes accumarray(comps, 1); compIdx arrayfun((x) idx(comps x), unique(comps), UniformOutput, false); end end这段后处理代码不是最快的但是逻辑清楚。真实项目里我还会加一个约束如果断裂块的大小占整个集群的比例超过一半就不该把它当“小块”处理而要考虑是不是初始k设置得不对或者相似度权重配比有问题。后处理只是修边不能替代参数调优。4. 结果要不要交账评估指标与横向对比4.1 电力系统视角的评估指标聚类结果不能只说“看起来挺合理”需要量化指标。聚类社区发现里常用的几个指标在电力系统集群划分中也适用只是解释方式略有不同。轮廓系数是经典的聚类评价指标计算每个样本的簇内平均距离和最近其他簇平均距离的差值范围在-1到1之间。越接近1说明簇内紧凑、簇间分离明显。但要注意轮廓系数计算时用的是你自己定义的相似度矩阵如果权重偏向了空间信息轮廓系数高只代表空间紧凑不代表电气结构好。所以只看这个单一指标不够。模块度Q是社区发现里的核心指标用来衡量社区内部连接的紧密程度[ Q \frac{1}{2m}\sum_{ij}\left[S_{ij} - \frac{k_i k_j}{2m}\right]\delta(C_i, C_j) ]其中m是图中所有边的权重之和k_i是节点i的加权度\delta(C_i,C_j)只有在两个节点属于同一集群时取1。Q值接近1说明社区结构明显一般0.3以上就算有比较好的模块结构。电力系统中使用模块度时相似度矩阵往往是我们人为构造的所以Q值更多反映“在当前权重下群内聚合是否明显”不能绝对化。电力系统规划更关心的还有功率平衡度。计算每个集群的总峰值负荷和该集群期望容量比一比。期望容量可以根据上级变压器容量或者规划目标设定。偏差越小说明每个集群对上级设备的压力越均匀。空间紧凑度是针对楼宇空间布局场景专门加的指标。我习惯用每个楼宇到其集群质心的平均欧氏距离来衡量。这个值越小说明集群在空间上越聚拢运维巡检越方便。如果只做电气聚类这个指标通常很难看。跨集群联络线数也是一个实用指标。把原始馈线拓扑图上横跨不同集群的边数数出来越少代表集群之间解耦越好但完全为0也不是好事因为集群之间需要一定联络容量来做故障转供。具体多少合适要看可靠性需求。4.2 模拟园区里的对比实验为了说明空间布局权重和连通性后处理的作用我在一个模拟园区数据上跑过三组对比。数据是虚构的但量级和趋势有代表性。园区共24栋楼节点数不多便于人工核对。方案轮廓系数模块度Q空间紧凑度(m)功率平衡度偏差(%)跨群联络线数A 只按电气距离0.520.582868.514B 电气空间权重0.600.572017.611C 电气空间连通性后处理0.620.561788.19从这组结果可以看到加入空间权重后空间紧凑度从286m降到201m跨群联络线从14条降到11条轮廓系数反而还上升了因为相似度矩阵更贴合真实数据分布。加上连通性后处理之后空间紧凑度进一步降到178m跨群联络线降到9条代价是模块度Q略微下降功率平衡度偏差从7.6%升到8.1%。这里的权衡很典型空间约束越强电气结构上的纯度会略微下降但物理可实现性大幅提高。做工程时我宁可要一个空间可达、边界清晰、检修方便的集群也不要一个模块度算出来漂亮但实际没法巡线的分区。4.3 可视化让规划结果能直接上汇报规划结果最后要给别人看Matlab可视化做得好能省掉很多解释的工夫。我一般画两张图。第一张是空间布局图散点着色凸包。每个集群用一种颜色楼宇按集群着色配线画上跨集群的联络线。画凸包时要注意convhull对少于3个点的集群会报错先判断一下点数。figure; hold on; colors lines(k); for c 1:k idx find(label c); plot(xy(idx, 1), xy(idx, 2), o, Color, colors(c, :), ... MarkerFaceColor, colors(c, :), MarkerSize, 8); if numel(idx) 3 ch convhull(xy(idx, 1), xy(idx, 2)); patch(xy(idx(ch), 1), xy(idx(ch), 2), colors(c, :), ... FaceAlpha, 0.1, EdgeColor, colors(c, :)); end end axis equal; grid on; xlabel(X / m); ylabel(Y / m); title(楼宇集群划分空间布局);第二张是每个集群的96点负荷曲线叠加图。把同一个集群内所有楼宇的负荷曲线逐时刻求和画成一条总负荷曲线。这张图能直观看出划分之后群内负荷是否互补、峰值是否错开。如果两条曲线高峰时刻完全重叠说明该集群内部负荷同质化严重可以考虑调整权重。5. 工程落地时最容易掉进去的坑5.1 数据与参数带来的坑第一个想到的坑就是量纲问题。坐标是米负荷是千瓦有的相似度矩阵里还可能有阻抗值这些数直接加权相加坐标数值大了就把负荷和电气信息淹没掉了。所以每一类相似度在合并前都要先经过高斯核函数转换让数值范围落在0到1之间再赋权重。这是最基础但也最容易犯的错。第二个坑是\sigma参数。高斯核函数里的\sigma如果取太大所有相似度都接近1聚类结果基本由初始随机种子决定取太小相似度矩阵只有对角线附近有值聚类退化成纯最近邻分块。我建议先用所有非对角元素距离的中位数作为\sigma再以0.5倍到2倍的范围做敏感性扫描观察集群结果是否剧烈变化。第三个坑是权重\lambda的调参。很多项目组喜欢直接给一组“看起来合理”的权重然后就算一次结果这非常危险。权重不同集群结构可能完全不同。我通常把\lambda_1从0.1扫描到0.9每次重新聚类并记录空间紧凑度、功率平衡度和跨群联络线数最后把所有曲线画在一张图上让决策者自己看哪里是性能拐点。这比拍脑袋定权重靠谱得多。第四个坑是集群数量k的选取。k-means或者谱聚类都需要先给定k但电力系统里更合理的做法是根据变压器容量和负荷总量反推。比如一片园区总峰值负荷8MW单台配变容量2MVA考虑负载率不超过80%那至少需要5个集群。这种情况下k不是统计指标能定的而是由设备容量决定的。5.2 连通性处理不当的坑空间连通性后处理看起来简单实际操作中处处是坑。首先是邻接图怎么建。直接用Delaunay三角剖分会在整个外轮廓上生成很多跨越长空的边其中一些边可能会跨过一条主干道或者河流但实际工程中这些跨障碍位置根本不能走电缆。正确的做法是在生成邻接图之后结合场地障碍图层手工剔除不合理的边如果项目有道路矢量数据尽量用路网距离而不是欧氏距离。没有路网数据时我常用规则格网离散化场地把道路和建筑外墙作为不可通行区域走A*搜索得到两栋楼之间的实际可达距离。其次是孤立楼宇的归属处理。后处理时如果某个楼宇和它的同集群成员在空间图上完全不连通简单将其并入“平均相似度最大”的集群可能仍然有问题。比如某个楼宇的供电回路从电气上归属于另一个集群的箱变即使空间上跟第三个集群更近也应该跟随供电回路归属。电气接线约束和空间约束同时存在时最好先满足电气接线约束空间约束作为第二优先级。我自己的处理方式是优先检查电气所属馈线再用空间相似度在“同馈线候选集群”里选择。第三是边界节点。一个园区里总有一两个位置边角料比如独立的地下室配电间、跨区域的门卫室空间上很难归到任何集群。强行并入会影响整体指标这时候不如把它设为边界节点不参与集群归属只作为两个集群之间的联络点。这个做法看起来不够“整齐”但实际运维中非常常见。5.3 算法实现细节的坑Matlab实现层面的坑也不少。谱聚类中的eigs和eig选择几百节点时矩阵不大用eig(A)全分解问题不大节点数到几千时相似度矩阵全稠密会占大量内存必须先把相似度截断为稀疏矩阵再用eigs只计算最小的k个特征值。如果不做稀疏化运行时间会从秒级直接跳到分钟级。distances返回Inf的问题前面提过这里再强调一次。空间邻接图如果是断开的两个连通分量之间的最短路径是Inf如果不处理后面乘到相似度矩阵里会出现整行全零。全零行在谱聚类里会拉偏特征向量最终导致某个集群为空。解决方法是把Inf替换成一个远大于正常距离的有限值并让高斯核在这样的值上输出接近0的相似度。特征向量的符号有时候会整行翻转这是数值计算的正常现象不影响后面kmeans稳定性但如果你把特征向量直接可视化颜色可能会随机跳动。要做汇报图的话固定随机种子或者固定特征向量符号比较稳妥。最后要说的是结果重复性。谱聚类里的eigs和后面的kmeans都带随机性不同次运行可能得到稍微不同的标签。工程上我建议固定rng的种子或者在最后输出前做一个投票融合多次聚类取出现频率最高的结果。这个方法简单但能让方案在生产环境中稳定复现。我自己实际跑这个流程时最后一步不是立刻写报告而是把集群结果叠加到楼宇平面图上再实地走一圈看边界线能不能让运维人员顺着道路和走廊实际走通。这个土办法往往能暴露出算法看不出来的问题。另外如果后续要做分布式光伏和储能规划可以在每个集群内部先做容量配置再回到整体联络线做校核形成两级规划闭环。这套流程在公开数据集和合规的模拟场景里都能复现改起来也顺手。