台风过境之后那几天,是我做配电网抢修恢复课题时最焦虑的一段时间。停电面积大、抢修队伍有限、应急发电车就那么几辆,各条馈线的失电负荷都在抢着要资源,调度员拍脑袋排序的结果往往是“修了不少,但重要负荷没先送电”。那时候我意识到,抢修恢复不能只靠经验,它本质上是一个多约束、多资源协同的优化决策问题,而粒子群算法(PSO)恰好是解决这类问题的成熟工具。这个项目就是围绕“弹性提升”目标,用粒子群算法求解多种应急资源参与配电网抢修恢复的最优调度方案,配套Matlab源码版本15275期。把这一整套思路和实现细节完整拆开讲,适合正在做配电网弹性提升、故障恢复课题的研究生,以及想用智能优化算法解决实际调度问题的工程师参考。
1. 为什么要把“抢修恢复”当成弹性提升问题来做
1.1 从“修得快”到“恢复曲线面积”的认知变化
传统的配电网故障抢修,考核指标就是“复电时间”。谁先修好、几点全复电,调度日报上写清楚就行。但这两年“弹性电网”的概念提得越来越多,大家发现单纯比“修得快”不够——一次强台风扫过去,配网可能有几十处故障点,抢修资源短期内不可能全部覆盖。这时候真正要关心的,不是最终的恢复时刻,而是整个恢复过程中失电负荷的累积损失,也就是故障发生到完全恢复这段时间里,系统到底“扛住了多少、恢复得有多快”。
这里有一个很直观的类比:一个人骨折住院,好的治疗方案不是在床上躺够三个月再出院,而是“尽早手术、尽早下地、尽早恢复功能”。配电网也一样,目标不是“最后全复电”,而是“重要用户在最短时间内恢复供电”,让失电功率-时间曲线下的面积尽量小。这个面积,在弹性研究里常常被翻译成“弹性恢复过程指标”。
所以这个项目的第一个核心设定,就是把目标函数从“最小化恢复时间”改造成“最大化加权恢复效益的累计值”。不同等级的负荷(医院、通信基站、居民区)权重不一样,恢复一个一级重要负荷和一个普通居民负荷,对目标函数的贡献完全不同。这样一来,粒子群算法优化的就不再是一个单纯的时间问题,而是一个带权重的时序调度问题。
1.2 抢修队伍、应急发电车、抢修物资三类资源的协同困境
“多种应急资源”这几个字,听起来简单,真正建模的时候才会发现有多难缠。参与抢修恢复的资源至少分成三类:抢修队伍、应急发电车(含移动储能)、抢修物资。它们之间不是独立的,而是相互牵制的。
抢修队伍负责修复断线、更换变压器等永久性故障,资源属性是“人去干活”,受到移动时间、任务顺序、人员技能类型三个约束。应急发电车负责在故障未修复前给关键负荷临时供电,资源属性是“移动电源”,受到接入点位置、容量上限、接线方式约束。抢修物资则是两者的后勤保障——队伍出去抢修,得有导线、金具、变压器配件;发电车接入,得有合适的电缆和接头。
难点在于,这三类资源的调度决策是耦合的。比如某节点既安排了抢修队伍去修,又安排了应急发电车去临时供电,那么发电车的接入时段就最好避开工频停电窗口;再比如物资都堆在一个仓库里,但两支队伍同时需要同一种型号的导线,分配就必须有先后。把这三类决策拆开单独优化,结果大概率是局部最优;放在一个模型里联合优化,维度又一下子膨胀。
这个项目采用的建模思路是:把三类资源的调度决策统一编码进一个粒子,用粒子群算法进行联合寻优。队伍怎么派、发电车往哪走、物资怎么分,都通过解码函数从粒子位置里还原出来。这样做的好处是全局性好,坏处就是编码设计和维数控制需要特别用心,后面我会详拆。
1.3 目标函数怎么设计才贴近“弹性提升”
先给出我在项目中实际使用的目标函数框架,它分为三个部分整合成一个综合适应度值:
| 目标项 | 表达式含义 | 权重倾向 |
|---|---|---|
| 重要负荷加权恢复量 | 各时段已恢复负荷功率 × 负荷权重 × 时段步长的累加 | 权重最大,体现弹性提升核心 |
| 资源损耗惩罚 | 队伍绕行距离、发电车燃油/电量消耗折算 | 中等权重,避免蛮干式调度 |
| 约束违反惩罚 | 违反容量、时间窗、物资库存约束的惩罚值 | 必要时加大,保证可行解 |
实际Matlab代码里,适应度函数核心行是这么写的:
matlab复制fit = sum(sum(W_load
