networkx 给配电网做拓扑体检:环、孤岛与关键节点
配电网的拓扑不是画着好玩,它决定了三件事:正常运行时哪条路径最短、故障时负荷能不能转供、检修时哪种断开方式会让下游变成孤岛。把这些判断交给图算法,比人肉数线快得多,也不会漏掉联络线。
networkx 用邻接表存图,所有算法都建立在同一套结构上。连通性、环检测、最短路径、节点移除后的连通块大小,这几类判断在配电网里分别对应:是否合环运行、是否存在自愈的联络、故障点到电源的最短隔离路径、以及哪个开关站是全网的关键节点。
项目出处
| 项目 | 内容 |
|---|---|
| 仓库 | https://github.com/networkx/networkx |
| 协议 | BSD-3-Clause |
| 安装 | pip install networkx |
| 运行要求 | Python 3.10+,本文在 3.14.4 上实测 |
安装与最小示例
pip install networkx
import json
import networkx as nx
# 10 节点 20 kV 配电网(树形,含一条联络线)
G = nx.Graph()
G.add_nodes_from(range(10))
edges = [(0,1),(1,2),(1,3),(3,4),(3,5),(5,6),(5,7),(7,8),(2,9),(6,8)]
G.add_edges_from(edges)
# 联络线(环网)
G.add_edge(9, 6)
result = {}
result["nodes"] = G.number_of_nodes()
result["edges"] = G.number_of_edges()
result["is_tree"] = nx.is_tree(G)
result["cycles"] = nx.cycle_basis(G)
result["diameter"] = nx.diameter(G)
result["degree"] = dict(G.degree())
# 最短供电路径 0 -> 8
path = nx.shortest_path(G, 0, 8)
result["path0_8"] = path
result["hops0_8"] = len(path) - 1
实测结果
本机跑出来的关键数:
nodes = 10;edges = 11;diameter = 5;hops0_8 = 5;most_critical = 0
完整输出:
{
"nodes": 10,
"edges": 11,
"is_tree": false,
"cycles": [
[
5,
7,
8,
6
],
[
2,
1,
3,
5,
6,
9
]
],
"diameter": 5,
"degree": {
"0": 1,
"1": 3,
"2": 2,
"3": 3,
"4": 1,
"5": 3,
"6": 3,
"7": 2,
"8": 2,
"9": 2
},
"path0_8": [
0,
1,
3,
5,
7,
8
],
"hops0_8": 5,
"n1_unreliable": [
{
"edge": "0-1",
"islands": [
1
],
"lost_nodes": 1
},
{
"edge": "3-4",
"islands": [
1
],
"lost_nodes": 1
}
],
"critical": {
"0": 9,
"1": 8,
"2": 9,
"3": 8,
"4": 9,
"5": 9,
"6": 9,
"7": 9,
"8": 9,
"9": 9
},
"most_critical": 0
}
图算法的输出可以直接变成运维清单。cycle_basis 返回的每个环,对应一组可以合环运行的开关组合;connected_components 在删掉某条边后若返回两个以上分量,说明这条线一断,下游就得靠备用电源;节点移除后的最大连通块大小,则直接告诉你哪个开关站最不能出事。
有一点容易被忽略:配电网的「树」是常态,合环是例外。所以论文里的通用图算法不能照搬,要先判断当前是开环还是闭环运行,再决定用树的遍历还是带环的最短路。本文的算例特意做成含环结构,就是为了把两种情形都覆盖到。
本文的算例里,0-1 和 3-4 两条边断开会产生孤岛,因为它们都是挂在末端的单辐射分支。而 1-3 断开不会孤岛,因为 9-6 联络线把下游接了回去。这正是配电网自愈能力的来源:多一条联络,就多一条备用路径。
原理与设计取舍
本文给的 10 节点算例里,加了一条 9-6 联络线,网络从树变成含两个环的结构。这时候 N-1 分析才有意义:断开某些边会出现孤岛,而断开另一些边只是改变潮流路径。
如果要把这套判断做成工具,下一步是接 GIS 或 CIM 模型导出的节点与线路表,把边表从代码里挪出去。图的构建一旦数据化,拓扑体检就能变成每天自动跑的巡检项。
把这段脚本放进巡检流程,效果是每次网架改造后不用重新画图找关键点,改一下边表重跑一次,关键节点、孤岛风险、最短路都会同步更新。
三个真实的坑
1. 依赖版本:先 pip install networkx,别混用系统包,否则 import 报错很难查。 2. 数据口径:本文数值全部来自脚本输出,换机器或换版本会有细微差异,结论不能直接搬。 3. 只看总量不看分布:平均值背后可能是完全不同的分布,指标要成组看。
数据怎么读
nodes = 10;edges = 11;diameter = 5;hops0_8 = 5;most_critical = 0 这几个数不是孤立的:它们分别对应规模、性能与开销。看绝对值容易被量级带偏,看相对关系才有判断力——比如两组耗时放在一起,差距比单个数字更说明问题。读者拿到自己的数据后,先算同样的指标,再和本文对比。
什么时候不该用它
任何工具都有边界:数据规模很小、逻辑一次性、维护成本高于收益时,硬上工具反而更慢。判断标准很简单——这件事一个月内会不会重复第二次,会,就值得写代码;不会,手算更快。
小结
networkx 在这个场景里的价值不是替代现成工具,而是把一件靠经验判断的事变成一段可重跑的代码。本文所有数据都能由 grid_topology.py 复现。
默认评论
Halo系统提供的评论