电力系统重构(Distribution Network Reconfiguration, DNR)是典型的多目标、非线性、混合整数组合优化问题 。核心是通过切换分段开关和联络开关的状态,改变网络拓扑,以实现最小网损、电压偏差最小、可靠性最高等目标。
**PSO(粒子群优化)**因其原理简单、收敛快、易实现,是该问题的经典解法。
一、问题建模(IEEE 33 节点标准)
1、决策变量(离散)
- 开关状态:xi∈{0,1}x_i \in \{0,1\}xi∈{0,1}(0=断开,1=闭合)
- IEEE 33 节点:
- 37 条支路(含 5 条联络开关)
- 32 个分段开关 + 5 个联络开关
- 每次重构需保证:闭合 32 个开关,断开 5 个开关
2、目标函数(单目标简化版)
minF=Ploss+λ∑i=1NPQmax(0,∣ΔVi∣−ε)\min F = P_{loss} + \lambda \sum_{i=1}^{N_{PQ}} \max(0, |\Delta V_i| - \varepsilon)minF=Ploss+λi=1∑NPQmax(0,∣ΔVi∣−ε)
- PlossP_{loss}Ploss:总有功损耗
- ΔVi\Delta V_iΔVi:电压偏差
- λ\lambdaλ:电压越限惩罚权重
3、约束条件
- 辐射状约束:无环网、无孤岛
- 连通性约束:所有负荷均有电源
- 电压约束 :0.95≤Vi≤1.050.95 \le V_i \le 1.050.95≤Vi≤1.05
- 容量约束 :Sij≤SijmaxS_{ij} \le S_{ij}^{\max}Sij≤Sijmax
二、IEEE 33 节点系统参数(数据准备)
matlab
%% ieee33_data.m
function [bus, branch] = ieee33_data()
% IEEE 33 Bus Radial Distribution System
% ===== 节点数据 =====
% [Bus No, Type, P_load(kW), Q_load(kVar)]
bus = [
1 3 0 0; % Slack
2 1 100 60;
3 1 90 40;
4 1 120 80;
5 1 60 30;
6 1 60 20;
7 1 200 100;
8 1 200 100;
9 1 60 20;
10 1 60 20;
11 1 45 30;
12 1 60 35;
13 1 60 35;
14 1 120 80;
15 1 60 10;
16 1 60 20;
17 1 60 20;
18 1 90 40;
19 1 90 40;
20 1 90 40;
21 1 90 40;
22 1 90 40;
23 1 90 50;
24 1 420 200;
25 1 420 200;
26 1 60 25;
27 1 60 25;
28 1 60 20;
29 1 120 70;
30 1 200 600;
31 1 150 70;
32 1 210 100;
33 1 60 40;
];
% ===== 支路数据 =====
% [From To R(ohm) X(ohm) 开关编号 开关类型(1:分段,0:联络)]
branch = [
1 2 0.0922 0.0470 1 1;
2 3 0.4930 0.2511 2 1;
3 4 0.3660 0.1864 3 1;
4 5 0.3811 0.1941 4 1;
5 6 0.2196 0.0711 5 1;
6 7 0.1872 0.0619 6 1;
7 8 0.7114 0.2351 7 1;
8 9 1.0300 0.3400 8 1;
9 10 1.0440 0.3450 9 1;
10 11 0.1966 0.0650 10 1;
11 12 0.3744 0.1238 11 1;
12 13 1.4680 0.4849 12 1;
13 14 0.5416 0.1789 13 1;
14 15 0.5910 0.1950 14 1;
15 16 0.7463 0.2466 15 1;
16 17 1.2890 0.4265 16 1;
17 18 0.7320 0.2418 17 1;
2 19 0.1640 0.1565 18 1;
19 20 1.5042 0.4970 19 1;
20 21 0.4095 0.1354 20 1;
21 22 0.7089 0.2340 21 1;
3 23 0.4512 0.1491 22 1;
23 24 0.8980 0.2966 23 1;
24 25 0.8960 0.2962 24 1;
6 26 0.2030 0.0670 25 1;
26 27 0.2842 0.0939 26 1;
27 28 1.0590 0.3496 27 1;
28 29 0.8042 0.2657 28 1;
29 30 0.5075 0.1677 29 1;
30 31 0.9744 0.3216 30 1;
31 32 0.3105 0.1026 31 1;
32 33 0.3410 0.1127 32 1;
% 联络开关
7 20 2.0000 2.0000 33 0;
8 14 2.0000 2.0000 34 0;
11 21 2.0000 2.0000 35 0;
17 32 0.5000 0.5000 36 0;
24 28 0.5000 0.5000 37 0;
];
end
三、PSO 核心算法
1、粒子编码(关键技巧)
由于开关状态是 0/1,不能直接用实数 PSO,需要:
- 位置 xi∈0,1x_i \in 0,1xi∈0,1
- 速度 viv_ivi 用 sigmoid 映射为开关概率
- 解码时:若 xi>0.5x_i > 0.5xi>0.5,则开关闭合
matlab
%% pso_reconfiguration.m
function best_config = pso_reconfiguration()
% PSO for Distribution Network Reconfiguration
%% 参数
[bus, branch] = ieee33_data();
nSwitches = size(branch,1); % 37 个开关
nParticles = 50;
maxIter = 100;
w_max = 0.9; w_min = 0.4;
c1 = 2; c2 = 2;
%% 初始化
pos = rand(nParticles, nSwitches); % 位置 [0,1]
vel = zeros(nParticles, nSwitches); % 速度
pbest_pos = pos;
pbest_fit = inf(nParticles,1);
gbest_fit = inf;
gbest_pos = zeros(1,nSwitches);
%% PSO 主循环
for iter = 1:maxIter
w = w_max - (w_max-w_min)*(iter/maxIter);
for i = 1:nParticles
% ---- 解码:开关状态 ----
switch_state = pos(i,:) > 0.5;
% ---- 可行性修复(保证 32 合 5 断)----
switch_state = repair_topology(switch_state);
% ---- 潮流计算 ----
[Ploss, V, converge] = power_flow(bus, branch, switch_state);
if ~converge
fitness = 1e6; % 不收敛罚重
else
% 目标函数
voltage_penalty = sum(max(0, 0.95-V(2:end))*100 + ...
max(0, V(2:end)-1.05)*100);
fitness = Ploss + 10*voltage_penalty;
end
% ---- 更新个体最优 ----
if fitness < pbest_fit(i)
pbest_fit(i) = fitness;
pbest_pos(i,:) = pos(i,:);
end
% ---- 更新全局最优 ----
if fitness < gbest_fit
gbest_fit = fitness;
gbest_pos = pos(i,:);
best_config = switch_state;
end
end
% ---- 更新速度与位置 ----
for i = 1:nParticles
r1 = rand(1,nSwitches);
r2 = rand(1,nSwitches);
vel(i,:) = w*vel(i,:) ...
+ c1*r1.*(pbest_pos(i,:)-pos(i,:)) ...
+ c2*r2.*(gbest_pos-pos(i,:));
% 速度限幅
vel(i,:) = max(min(vel(i,:), 4), -4);
% Sigmoid 更新位置
pos(i,:) = 1./(1+exp(-vel(i,:)));
end
fprintf('Iter %d: Best Loss = %.4f kW\n', iter, gbest_fit);
end
fprintf('\n最优网损: %.4f kW\n', gbest_fit);
disp('最优开关状态 (1=闭合, 0=断开):');
disp(best_config);
end
2、拓扑修复(保证辐射状)
matlab
%% repair_topology.m
function sw = repair_topology(sw)
% 保证:32 个分段开关闭合,5 个联络开关断开
% 若不满足,随机交换
nSeg = 32; % 分段开关数
nTie = 5; % 联络开关数
% 统计闭合开关数
nClosed = sum(sw);
if nClosed > nSeg
% 多合了,随机断开一些
extra = nClosed - nSeg;
idx = find(sw==1);
turn_off = randsample(idx, extra, false);
sw(turn_off) = 0;
elseif nClosed < nSeg
% 少合了,随机闭合一些
short = nSeg - nClosed;
idx = find(sw==0);
turn_on = randsample(idx, short, false);
sw(turn_on) = 1;
end
% 强制联络开关断开(可选,也可让其参与优化)
sw(33:37) = 0; % 联络开关固定断开
end
3、前推回代潮流(配电网专用)
matlab
%% power_flow.m
function [Ploss, V, converge] = power_flow(bus, branch, sw_state)
% 前推回代法(Backward/Forward Sweep)
% sw_state: 37×1 开关状态
V_base = 12.66; % kV
S_base = 10e3; % kVA
Z_base = V_base^2/S_base;
% 构建邻接关系
nBus = max(bus(:,1));
V = ones(nBus,1); % 初始电压标幺值
S = bus(:,3:4)/S_base; % 负荷标幺值
maxIter = 50;
tol = 1e-6;
converge = false;
for iter = 1:maxIter
V_old = V;
% ---- 回代:计算支路电流 ----
I = zeros(nBus,1);
for k = nBus:-1:2
from = branch(k-1,1);
to = branch(k-1,2);
if sw_state(k-1)==0, continue; end
% 负荷电流
I_load = conj(S(to,1)+1j*S(to,2)) / conj(V(to));
I(to) = I(to) + I_load;
% 支路电流
Z = (branch(k-1,3)+1j*branch(k-1,4))/Z_base;
I(from) = I(from) + I(to);
end
% ---- 前推:更新电压 ----
for k = 2:nBus
from = branch(k-1,1);
to = branch(k-1,2);
if sw_state(k-1)==0, continue; end
Z = (branch(k-1,3)+1j*branch(k-1,4))/Z_base;
V(to) = V(from) - I(to)*Z;
end
% 收敛判据
if max(abs(V-V_old)) < tol
converge = true;
break;
end
end
% ---- 计算网损 ----
Ploss = 0;
for k = 1:size(branch,1)
if sw_state(k)==0, continue; end
from = branch(k,1); to = branch(k,2);
Z = (branch(k,3)+1j*branch(k,4))/Z_base;
Ibr = (V(from)-V(to))/Z;
Ploss = Ploss + real(Ibr)^2 * real(Z) * S_base/1e3; % kW
end
end
四、主程序调用
matlab
%% main_reconfig.m
clear; clc; close all;
tic;
best_sw = pso_reconfiguration();
toc;
% 验证最优配置
[bus, branch] = ieee33_data();
[Ploss_opt, V_opt, ~] = power_flow(bus, branch, best_sw);
fprintf('\n===== 重构结果 =====\n');
fprintf('最小网损: %.4f kW\n', Ploss_opt);
fprintf('最低电压: %.4f p.u.\n', min(V_opt(2:end)));
fprintf('最高电压: %.4f p.u.\n', max(V_opt(2:end)));
五、典型结果(IEEE 33 节点)
| 方案 | 网损 (kW) | 最低电压 (p.u.) |
|---|---|---|
| 初始辐射网 | 202.68 | 0.913 |
| PSO 重构后 | 139.55 | 0.937 |
网损降低约 31%
电压水平显著改善
网络保持辐射状
参考代码 用PSO算法求解电力系统重构问题 www.youwenfan.com/contentcsw/82585.html
六、工程改进建议
1、多目标 PSO(MOPSO)
matlab
% 目标向量
F = [Ploss, VoltageDev, Reliability];
% 维护 Pareto 前沿
2、改进 PSO
- 自适应惯性权重
- 混沌初始化
- 精英学习策略
- 与 GA / DE 混合
3、约束处理
- 环路检测(DFS/BFS)
- 孤岛检测
- DG(分布式电源)接入