目录
[1. 项目背景:为什么要做变电站智能巡检与快速恢复](#1. 项目背景:为什么要做变电站智能巡检与快速恢复)
[2. 项目整体设计](#2. 项目整体设计)
[3. 变电站详细地图建模](#3. 变电站详细地图建模)
[4. 机器人站内路径规划算法](#4. 机器人站内路径规划算法)
[4.1 A* 故障应急核查路径](#4.1 A* 故障应急核查路径)
[4.2 Dijkstra 巡检点最短路径](#4.2 Dijkstra 巡检点最短路径)
[4.3 蚁群算法优化巡检顺序](#4.3 蚁群算法优化巡检顺序)
[4.4 DWA 简化局部避障](#4.4 DWA 简化局部避障)
[5. 县域班组抢修调度算法](#5. 县域班组抢修调度算法)
[6. 故障诊断模型](#6. 故障诊断模型)
[6.1 规则库诊断](#6.1 规则库诊断)
[6.2 贝叶斯诊断](#6.2 贝叶斯诊断)
[7. 变电站快速恢复策略生成](#7. 变电站快速恢复策略生成)
[8. 恢复策略评分模型](#8. 恢复策略评分模型)
[9. 五防校核与安全约束](#9. 五防校核与安全约束)
[10. 代码实现片段](#10. 代码实现片段)
[10.1 A* 邻居扩展与硬约束过滤](#10.1 A* 邻居扩展与硬约束过滤)
[10.2 路径点与线段碰撞校验](#10.2 路径点与线段碰撞校验)
[10.3 ACO 信息素更新](#10.3 ACO 信息素更新)
[10.4 县域抢修任务优先级](#10.4 县域抢修任务优先级)
[10.5 恢复策略评分](#10.5 恢复策略评分)
[11. 运行结果展示](#11. 运行结果展示)
[12. 项目不足与后续优化](#12. 项目不足与后续优化)
[13. 总结](#13. 总结)
摘要:本文整理一个完整的 Python 算法仿真项目:《县域变电站智能巡检与快速恢复策略算法仿真平台》。项目没有做 Web 前端,也没有接数据库,而是把重点放在算法层:单站变电站二维地图建模、机器人站内路径规划、县域多变电站抢修调度、故障诊断、站内快速恢复策略、操作步骤推演和五防校核。
1. 项目背景:为什么要做变电站智能巡检与快速恢复
县域电网中,110kV/35kV/10kV 变电站承担着区域供电枢纽的作用。医院、水厂、通信机房、政府应急中心、工业园区等关键负荷,往往都通过县域核心变电站或周边变电站获得电源支撑。一旦发生主变跳闸、母线故障、进线失电、断路器拒动、站用电异常、直流系统异常或保护装置告警,影响的不只是某一个设备点,而是站内供电能力、关键出线恢复和县域抢修资源调度。
这个项目首先要划清一个边界:它不是配电网馈线自愈重构项目,不讨论配电线路联络开关如何倒供。项目关注的是变电站级故障核查、站内恢复策略,以及县域多个变电站之间的抢修调度。
因此,项目被分成两个空间层级:
- 站内层:机器人在单个变电站内部执行巡检、故障核查和路径规划,地图范围为 01000 × 01000 的站内二维平面。
- 县域层:检修班组在县域道路网络上从运维中心、抢修驻点或物资库出发,前往多个故障变电站执行抢修任务。
这个区分很重要。机器人路径规划是站内避障问题,班组调度是县域多站点抢修路线问题,二者不能混在同一张地图里。
2. 项目整体设计
项目路径为 python_project/biandian/substation_algorithm_platform。当前版本以 main.py 作为一键运行入口,运行后在 output/ 目录下生成 PNG、JSON 和 CSV 文件。
| 模块 | 文件夹或文件 | 作用 |
|---|---|---|
| 数据模型 | src/models | 定义站内设备、巡检点、障碍物、县域变电站、道路、班组和故障任务 |
| 样例数据 | src/data_factory | 生成单站地图数据和县域多变电站调度数据 |
| 地图建模 | src/map_engine | 构建站内几何约束、禁行区、故障隔离区和安全边界 |
| 机器人路径规划 | src/robot | 实现 A*、Dijkstra、ACO、DWA 和路径碰撞校验 |
| 县域班组调度 | src/crew | 实现多班组、多变电站抢修调度 |
| 故障诊断 | src/fault | 实现规则库诊断和简化贝叶斯诊断 |
| 电气拓扑 | src/graph_engine | 使用 NetworkX 构建站内电气拓扑 |
| 快速恢复策略 | src/restoration | 生成候选恢复方案和操作步骤 |
| 五防校核 | src/safety | 检查操作安全约束 |
| 策略评分 | src/scoring | 对候选恢复策略进行综合评分 |
| 可视化 | src/visualization | 绘制站内地图、县域地图和算法图表 |
| 测试 | tests | 使用 pytest 验证路径、调度、诊断、恢复和五防规则 |
主程序的执行顺序也体现了这两个层级:先初始化单站详细地图,再初始化县域多变电站地图;机器人算法只作用于单站,班组调度只作用于县域道路网络。
3. 变电站详细地图建模
项目将"县域中心变电站"抽象为一个 01000 × 01000 的二维坐标系。所有区域、设备、巡检点、障碍物和故障标记都落在同一个坐标系统中。
矩形区域可以表示为:
圆形障碍物可以表示为:
地图中包含主控楼、二次设备室、110kV 配电装置区、主变区、35kV 配电装置区、10kV 配电装置区、站用电系统区、直流屏与蓄电池室、机器人充电区、巡检通道、班组道路、安全围栏、禁行区、故障隔离区、物资库和站入口。
设备侧则包含 2 条 110kV 进线、2 台 50MVA 主变、2 段 10kV 母线、母联断路器、12 回 10kV 出线、站用变、直流屏、蓄电池室、保护屏柜、机器人充电桩和 30 个巡检点。

4. 机器人站内路径规划算法
机器人只在单个变电站内部活动,面向日常巡检和故障应急核查。当前项目实现了 A*、Dijkstra、ACO 和一个简化 DWA 避障模块。
4.1 A* 故障应急核查路径
A* 用于机器人从充电区或当前位置前往故障核查点。算法的基本形式为:
其中:
各项含义如下:
:基础距离代价;
:转弯惩罚;
:靠近障碍物的惩罚;
:靠近高压区域的惩罚;
:靠近故障隔离区的惩罚。
需要特别强调的是,硬约束区域不是简单"加大惩罚",而是直接不可通行。项目中硬约束包括障碍物膨胀区、禁行区、故障隔离区、建筑实体区和安全围栏外部。
路径合法性可写成:
其中 ΩforbiddenΩforbidden 表示所有禁行区、故障隔离区、建筑实体和障碍物膨胀区的集合。项目还对 8 邻域移动做了 corner cutting 限制,防止机器人从障碍物角点之间"挤过去"。

当前运行结果中,A* 输出为:
| 指标 | 结果 |
|---|---|
| 是否成功 | True |
| 路径是否合法 | True |
| 路径长度 | 477.73 m |
| 预计耗时 | 10.62 min |
| 是否穿越禁行区 | False |
| 是否穿越故障隔离区 | False |
| 是否穿越障碍膨胀区 | False |
| 最小障碍距离 | 20.9444 m |
4.2 Dijkstra 巡检点最短路径
Dijkstra 用于计算巡检点之间的最短通行距离,并为后续蚁群算法提供距离矩阵。其松弛更新公式为:
项目中将巡检点构造成图节点,边权综合欧氏距离和障碍物接近惩罚。当前输出中,IP_01 到 IP_18 的最短路径长度约为 945.11 m。
4.3 蚁群算法优化巡检顺序
当机器人需要访问多个巡检点时,问题变成访问顺序优化。项目使用 ACO 对前 14 个巡检点进行顺序优化。
蚂蚁k从节点i转移到节点j的概率为:
其中启发式因子为:
信息素更新为:
当前运行结果中,ACO 迭代 60 次,最优巡检顺序为:
[0, 1, 2, 4, 3, 5, 9, 11, 10, 8, 6, 7, 12, 13]
最优距离为 1890.08 m。

4.4 DWA 简化局部避障
项目中的 DWA 不是完整机器人动力学模型,而是一个局部避障仿真模块。当路径点落入动态障碍物影响范围时,模块会生成绕行点。
安全距离约束可以表示为:
当前运行结果中,DWA 避障次数为 2,避障前路径长度为 477.73 m,避障后路径长度约为 672.80 m。

5. 县域班组抢修调度算法
这是项目中最容易混淆的部分:班组调度不是站内路径规划,而是县域多个变电站之间的抢修路线规划。
项目将县域抽象为道路网络图:

其中:
- Vc:县域节点,包括变电站、县运维中心、物资库、抢修驻点和应急集结点;
- Ec:道路连接;
- w(e):道路通行距离或通行时间。
县域地图采用 0100 km × 0100 km 坐标空间,包含县域中心变、城东变、城西变、城南变、城北变、工业园变、开发区变、医院专用变等站点。
任务优先级公式为:
其中,restore_value 表示恢复贡献值,severity 表示故障严重度,station_importance 表示变电站重要程度,key_load_weight 表示关键负荷相关权重,skill_match 表示班组技能匹配度,分母则综合行驶时间、抢修时间和复核时间。

从 output/json/county_crew_dispatch_result.json 读取的真实调度结果如下:
| 班组 | 出发点 | 抢修变电站顺序 | 总行驶距离/km | 总耗时/min | 恢复贡献值 |
|---|---|---|---|---|---|
| 县域变电抢修一班 | 县运维中心 | 医院专用变 → 开发区变 → 城东变 | 61.81 | 224.39 | 212.0 |
| 东部变电抢修班 | 东部抢修驻点 | 县域中心变 → 工业园变 | 78.87 | 238.15 | 178.0 |
| 西部综合抢修班 | 西部抢修驻点 | 城西变 → 城北变 | 68.34 | 189.68 | 108.0 |
县域总恢复率为 1.0,说明当前样例任务都被成功分配。
6. 故障诊断模型
项目实现了两类诊断方法:规则库诊断和简化贝叶斯诊断。输入证据包括保护动作、断路器状态、SOE 信息、遥测信息、机器人红外核查结果和班组反馈。
6.1 规则库诊断
规则库更接近运行人员的经验判断,适合解释性较强的场景。
| 规则条件 | 推断结果 |
|---|---|
| 主变差动保护动作 + 高低压侧断路器跳闸 | 主变内部故障概率高 |
| 瓦斯保护动作 + 油温异常 + 机器人红外异常 | 主变本体故障 |
| 母线差动保护动作 + 多回出线跳闸 | 母线故障概率高 |
| 进线电压消失 + 本站设备无异常 | 上级进线失电 |
| 断路器跳闸命令发出但位置未变化 | 断路器拒动 |
| 直流母线电压异常 + 保护装置告警 | 直流系统异常 |
6.2 贝叶斯诊断
贝叶斯诊断用于在多证据条件下计算故障后验概率:
其中,Fi表示第 i类故障,E表示保护动作、断路器状态、SOE、遥测和机器人核查结果等证据。当前样例事件为 #1 主变故障,贝叶斯输出中 MAIN_TRANSFORMER_FAULT 的概率为 0.9954。

7. 变电站快速恢复策略生成
快速恢复策略仍然属于站内层,它恢复的是变电站站内供电能力和关键出线供电能力,不是配电网馈线重构。
站内电气拓扑表示为:

其中,Vs包括电源、进线、主变、母线、断路器、隔离开关、出线、站用变和直流屏;Es表示设备之间的电气连接关系。
对于故障、隔离和检修设备:
策略生成过程包括:
- 识别故障设备;
- 隔离故障区域;
- 构建可用电气拓扑;
- 搜索可恢复供电路径;
- 优先恢复医院、水厂、通信、政府、应急中心等关键负荷;
- 生成候选操作方案;
- 执行五防校核;
- 对方案评分;
- 输出推荐方案。
当前主变故障场景生成了 3 个候选恢复策略,其中推荐策略为"保守转供医院水厂通信等一级负荷"。
8. 恢复策略评分模型
项目使用一个归一化评分函数对候选恢复策略排序:
其中:
- Rkey:关键负荷恢复率;
- Rfeeder:恢复出线数量比例;
- Rcapacity:站内可用容量比例;
- Rrisk:操作风险;
- Rcomplexity:操作复杂度;
- Trestore:预计恢复时间。
从 output/json/restoration_strategy_result.json 读取的策略对比结果如下:
| 策略名称 | 故障类型 | 恢复时间/min | 关键负荷恢复率 | 操作次数 | 风险等级 | 评分 |
|---|---|---|---|---|---|---|
| 保守转供医院水厂通信等一级负荷 | MAIN_TRANSFORMER_FAULT | 28 | 0.7934 | 3 | LOW | 0.015239 |
| 隔离#1主变并由#2主变优先转带关键负荷 | MAIN_TRANSFORMER_FAULT | 38 | 0.9091 | 4 | MEDIUM | 0.012534 |
| 容量边界转供并限电恢复普通负荷 | MAIN_TRANSFORMER_FAULT | 45 | 1.0000 | 4 | MEDIUM | 0.012163 |
可以看到,第三个策略虽然关键负荷恢复率最高,但恢复时间和风险也更高,因此综合评分没有超过保守转供策略。
9. 五防校核与安全约束
恢复策略生成后,项目会生成操作步骤,并进行五防校核。当前推荐策略生成 3 个操作步骤:
| 步骤 | 操作类型 | 目标设备 | 操作描述 | 校核结果 |
|---|---|---|---|---|
| 1 | OPEN_DISCONNECTOR | TR_1 | 隔离#1主变 | 通过 |
| 2 | CONTROL | CB_BUS_TIE | 合母联前核对同期和负荷 | 通过 |
| 3 | ENERGIZE | TR_1 | 仅恢复一级关键出线 | 通过 |
主要五防规则如下:
| 校核规则 | 风险说明 | 程序处理方式 |
|---|---|---|
| 防止带负荷拉合隔离开关 | 可能引发电弧事故 | 操作前检查负荷状态 |
| 防止带接地刀闸送电 | 可能造成接地短路 | 送电前检查接地刀闸集合 |
| 防止误入带电间隔 | 可能造成人身风险 | 检查间隔带电状态 |
| 防止误分误合断路器 | 可能造成误停电或扩大事故 | 核对目标断路器合法性 |
| 防止未隔离故障设备就恢复送电 | 可能扩大事故范围 | 恢复前检查故障隔离状态 |
| 防止站用电和保护电源未恢复时执行关键操作 | 可能导致保护和控制失效 | 关键操作前检查站用电状态 |
当前整体五防校核结果为通过,风险等级为 LOW。
10. 代码实现片段
下面选取 5 段当前项目中的真实代码,展示关键算法实现。
10.1 A* 邻居扩展与硬约束过滤
代码来自 src/robot/astar_planner.py。A* 在扩展邻居时直接调用 _move_valid,非法节点不会进入开放表。
python
while open_heap:
_, current = heapq.heappop(open_heap)
if current in visited:
continue
visited.add(current)
if current == goal_node or distance(self._coord(current), self._coord(goal_node)) <= self.grid_step:
goal_node = current
found = True
break
for dx, dy in neighbors:
nxt = (current[0] + dx, current[1] + dy)
if not self._move_valid(current, nxt, dx, dy, checker):
continue
move_cost = math.hypot(dx, dy) * self.grid_step
prev_dir = direction.get(current)
turn = self.turn_penalty if prev_dir and prev_dir != (dx, dy) else 0.0
penalty = self._proximity_penalty(nxt, obstacles, high_voltage_devices, constraints)
tentative = g_score[current] + move_cost + turn + penalty
10.2 路径点与线段碰撞校验
代码来自 src/robot/path_constraint_checker.py。校验器不只检查路径点,还检查相邻点形成的线段是否穿越禁行区、故障隔离区和障碍物膨胀区。
python
for i in range(len(path) - 1):
line = LineString([path[i], path[i + 1]])
if not self.constraints.boundary.covers(line):
violations.append(f"Segment outside station safety boundary: {path[i]} -> {path[i + 1]}")
for poly in self.constraints.forbidden_zones + self.constraints.forbidden_high_voltage_zones + self.constraints.building_zones:
if line.intersects(poly):
crossed_forbidden = True
violations.append(f"Segment crosses forbidden zone: {path[i]} -> {path[i + 1]}")
for poly in self.constraints.fault_zones:
if line.intersects(poly):
crossed_fault = True
violations.append(f"Segment crosses fault isolation zone: {path[i]} -> {path[i + 1]}")
for poly in self.constraints.obstacle_buffers:
if line.intersects(poly):
crossed_obstacle = True
violations.append(f"Segment crosses inflated obstacle buffer: {path[i]} -> {path[i + 1]}")
10.3 ACO 信息素更新
代码来自 src/robot/aco_planner.py。每轮迭代后,信息素先挥发,再根据蚂蚁路径质量进行增强。
python
pheromone *= (1 - self.evaporation)
for tour, tour_len in all_tours:
delta = self.q / max(tour_len, 1e-6)
for i in range(len(tour) - 1):
a, b = tour[i], tour[i + 1]
pheromone[a, b] += delta
pheromone[b, a] += delta
convergence.append(best_len)
10.4 县域抢修任务优先级
代码来自 src/crew/county_dispatch_service.py。优先级同时考虑恢复价值、故障严重度、站点重要度、关键负荷权重、技能匹配和到站成本。
python
def _priority(self, task: CountyFaultTask, station: CountySubstation, skill_factor: float, travel_time: float) -> float:
key_load_weight = 1.35 if task.key_load_related else 1.0
denominator = max(travel_time + task.repair_time + task.review_time, 1e-6)
return (
task.restore_value
* task.severity
* station.importance_level
* key_load_weight
* skill_factor
/ denominator
)
10.5 恢复策略评分
代码来自 src/scoring/restoration_score.py。评分函数对恢复率、容量、风险、复杂度和时间进行综合折算。
python
class RestorationScorer:
def score(self, strategy: dict) -> dict:
key_rate = min(max(strategy.get("key_load_restore_rate", 0.0), 0.0), 1.0)
feeder_ratio = min(max(strategy.get("restored_feeder_ratio", 0.0), 0.0), 1.0)
capacity_ratio = min(max(strategy.get("station_available_capacity_ratio", 0.0), 0.0), 1.0)
risk = min(max(strategy.get("operation_risk", 0.0), 0.0), 1.0)
complexity = min(max(strategy.get("operation_complexity", 0.0), 0.0), 1.0)
estimated_time = max(strategy.get("estimated_restoration_time", 1.0), 1.0)
numerator = 0.4 * key_rate + 0.2 * feeder_ratio + 0.2 * capacity_ratio - 0.1 * risk - 0.1 * complexity
score = numerator / estimated_time
11. 运行结果展示
运行 python main.py 后,项目会生成地图、图表、JSON 和 CSV。主要输出如下:
| 输出类型 | 文件路径 | 说明 |
|---|---|---|
| 变电站地图 | output/maps/station_layout_with_devices.png | 展示站内区域、设备、巡检点和障碍物 |
| 机器人路径 | output/maps/station_layout_with_robot_path.png | 展示故障核查路径和局部避障效果 |
| 县域调度地图 | output/maps/county_dispatch_map.png | 展示多个变电站、驻地、道路和班组跨站路线 |
| ACO 收敛曲线 | output/charts/aco_convergence.png | 展示巡检顺序优化过程 |
| 县域班组甘特图 | output/charts/county_crew_gantt.png | 展示各班组抢修时间安排 |
| 故障诊断概率 | output/charts/diagnosis_probability.png | 展示各故障类型后验概率 |
| 恢复策略对比 | output/charts/restoration_compare.png | 展示策略评分、恢复时间和关键负荷恢复率 |
| 故障诊断结果 | output/json/fault_diagnosis_result.json | 输出规则库和贝叶斯诊断结果 |
| 恢复策略结果 | output/json/restoration_strategy_result.json | 输出候选恢复方案和推荐方案 |
| 县域调度结果 | output/json/county_crew_dispatch_result.json | 输出班组路线、到站时间、完工时间和恢复贡献 |
| 操作步骤 | output/csv/operation_steps.csv | 输出恢复操作序列 |
当前一次运行中的关键摘要如下:







机器人站内路径:success=True,path_valid=True,长度=477.73 m DWA 避障次数:2 县域总恢复率:1.0 贝叶斯诊断最可能故障:MAIN_TRANSFORMER_FAULT,概率=0.9954 推荐恢复策略:保守转供医院水厂通信等一级负荷 推荐策略评分:0.015239 五防校核结果:通过
12. 项目不足与后续优化
当前版本已经形成完整算法闭环,但仍有不少可以继续深入的方向。
第一,站内地图仍是二维仿真地图,后续可以接入真实站内 CAD 图、GIS 底图或激光建图结果,让设备位置和通道边界更贴近现场。
第二,DWA 当前是简化局部避障模型,后续可以加入机器人速度、角速度、制动距离、运动学约束和动态窗口采样,从而更接近真实机器人控制。
第三,故障诊断目前基于规则和简化贝叶斯。后续如果有历史保护动作、SOE、遥测和检修记录,可以训练概率图模型或机器学习模型,提高多故障并发场景下的诊断能力。
第四,县域调度当前采用启发式贪心分配和最短路径计算。对于更大规模的多站点、多班组、多物资约束场景,可以尝试遗传算法、禁忌搜索、模拟退火或 OR-Tools。
第五,恢复策略评分权重目前由工程经验设定。后续可以通过专家打分、历史抢修数据和运行风险指标动态调整权重。
第六,当前项目是算法引擎,后续可以封装为 FastAPI 或 Spring Boot 服务,再接入 Vue3 前端大屏,实现地图交互、策略审批和操作票流转。
13. 总结
这个项目实现了从变电站地图建模到路径规划、从故障诊断到快速恢复策略、从站内机器人核查到县域班组抢修调度的一整套算法仿真流程。
它的主要价值有三点:
- 明确区分了站内机器人巡检和县域班组抢修两个空间层级;
- 将图论搜索、启发式优化、贝叶斯诊断、安全规则校核和恢复策略评分组合到一个可运行项目中;
- 输出 PNG、JSON 和 CSV,便于后续封装成后端服务或可视化系统。





对于比赛项目、毕业设计、课程设计或电力系统算法展示来说,这个项目的重点不在于界面,而在于算法链路完整、数据结构清晰、结果可复现。
项目运行方式
安装依赖:
bash
pip install -r requirements.txt
运行主程序:
bash
python main.py
运行测试:
bash
pytest
需要代码的,请联系作者。制作不易,请点个关注和收藏!!!



