1. 主程序文件
matlab
% 33节点配电网网络重构 - 遗传算法优化
clear; clc; close all;
%% 参数设置
pop_size = 50; % 种群大小
max_gen = 100; % 最大迭代次数
pc = 0.8; % 交叉概率
pm = 0.1; % 变异概率
elite_rate = 0.1; % 精英保留比例
%% 加载33节点系统数据
network_data = load_33_node_system();
%% 初始化种群
population = initialize_population(pop_size, network_data);
%% 遗传算法主循环
best_fitness = zeros(max_gen, 1);
avg_fitness = zeros(max_gen, 1);
best_individual = [];
fprintf('开始33节点配电网网络重构优化...\n');
for gen = 1:max_gen
% 计算适应度
fitness = calculate_fitness(population, network_data);
% 记录最优解
[best_fit, best_idx] = min(fitness);
best_fitness(gen) = best_fit;
avg_fitness(gen) = mean(fitness);
if gen == 1 || best_fit < best_fitness(max(1, gen-1))
best_individual = population(best_idx, :);
end
% 选择操作
new_population = selection(population, fitness, elite_rate);
% 交叉操作
new_population = crossover(new_population, pc, network_data);
% 变异操作
new_population = mutation(new_population, pm, network_data);
population = new_population;
% 显示进度
if mod(gen, 10) == 0
fprintf('代数 %d: 最优损耗 = %.4f kW, 平均损耗 = %.4f kW\n', ...
gen, best_fit, avg_fitness(gen));
end
end
%% 结果显示
fprintf('\n=== 优化结果 ===\n');
fprintf('最优网络损耗: %.4f kW\n', best_fitness(end));
fprintf('重构方案开关状态:\n');
% 显示最优开关状态
display_switch_status(best_individual, network_data);
% 绘制收敛曲线
plot_convergence(best_fitness, avg_fitness);
% 验证网络连通性
is_radial = check_radial_constraint(best_individual, network_data);
fprintf('网络辐射状约束: %s\n', string(is_radial));
%% 潮流计算验证最终结果
final_loss = power_flow_analysis(best_individual, network_data);
fprintf('最终潮流计算损耗: %.4f kW\n', final_loss);
2. 33节点系统数据加载
matlab
function network_data = load_33_node_system()
% 33节点配电网系统参数
network_data.num_nodes = 33;
network_data.num_branches = 32;
network_data.base_V = 12.66; % kV
network_data.base_S = 10; % MVA
% 节点负荷数据 (kW + jkVar)
network_data.loads = [
0, 0; % 节点1 (平衡节点)
100, 60; % 节点2
90, 40; % 节点3
120, 80; % 节点4
60, 30; % 节点5
60, 20; % 节点6
200, 100; % 节点7
200, 100; % 节点8
60, 20; % 节点9
60, 20; % 节点10
45, 30; % 节点11
60, 35; % 节点12
60, 35; % 节点13
120, 80; % 节点14
60, 10; % 节点15
60, 20; % 节点16
60, 20; % 节点17
90, 40; % 节点18
90, 40; % 节点19
90, 40; % 节点20
90, 40; % 节点21
90, 40; % 节点22
90, 50; % 节点23
420, 200; % 节点24
420, 200; % 节点25
60, 25; % 节点26
60, 25; % 节点27
60, 20; % 节点28
120, 70; % 节点29
200, 600; % 节点30
150, 70; % 节点31
210, 100; % 节点32
60, 40 % 节点33
] / 1000; % 转换为MW
% 支路数据 [起始节点, 终止节点, 电阻(ohm), 电抗(ohm)]
network_data.branches = [
1, 2, 0.0922, 0.0470;
2, 3, 0.4930, 0.2511;
3, 4, 0.3660, 0.1864;
4, 5, 0.3811, 0.1941;
5, 6, 0.8190, 0.7070;
6, 7, 0.1872, 0.6188;
7, 8, 0.7114, 0.2351;
8, 9, 1.0300, 0.7400;
9, 10, 1.0440, 0.7400;
10, 11, 0.1966, 0.0650;
11, 12, 0.3744, 0.1238;
12, 13, 1.4680, 1.1550;
13, 14, 0.5416, 0.7129;
14, 15, 0.5910, 0.5260;
15, 16, 0.7463, 0.5450;
16, 17, 1.2890, 1.7210;
17, 18, 0.7320, 0.5740;
2, 19, 0.1640, 0.1565;
19, 20, 1.5042, 1.3554;
20, 21, 0.4095, 0.4784;
21, 22, 0.7089, 0.9373;
3, 23, 0.4512, 0.3083;
23, 24, 0.8980, 0.7091;
24, 25, 0.8960, 0.7011;
6, 26, 0.2030, 0.1034;
26, 27, 0.2842, 0.1447;
27, 28, 1.0590, 0.9337;
28, 29, 0.8042, 0.7006;
29, 30, 0.5075, 0.2585;
30, 31, 0.9744, 0.9630;
31, 32, 0.3105, 0.3619;
32, 33, 0.3410, 0.5362
];
% 联络开关位置 (可操作的开关)
network_data.tie_switches = [9, 15, 21, 27, 32]; % 支路编号
% 分段开关位置
network_data.section_switches = setdiff(1:network_data.num_branches, ...
network_data.tie_switches);
end
3. 种群初始化
matlab
function population = initialize_population(pop_size, network_data)
% 初始化种群,确保辐射状结构
population = zeros(pop_size, length(network_data.tie_switches));
for i = 1:pop_size
% 随机生成可行的开关组合
valid = false;
while ~valid
% 随机选择要闭合的联络开关数量 (通常为1-3个)
num_close = randi([1, 3]);
close_switches = randperm(length(network_data.tie_switches), num_close);
% 生成染色体
individual = zeros(1, length(network_data.tie_switches));
individual(close_switches) = 1;
% 检查辐射状约束
if check_radial_constraint(individual, network_data)
population(i, :) = individual;
valid = true;
end
end
end
end
4. 适应度计算
matlab
function fitness = calculate_fitness(population, network_data)
% 计算种群中每个个体的适应度(网络损耗)
pop_size = size(population, 1);
fitness = zeros(pop_size, 1);
for i = 1:pop_size
% 进行潮流计算得到网络损耗
power_loss = power_flow_analysis(population(i, :), network_data);
% 适应度为网络损耗的倒数(最小化问题)
fitness(i) = power_loss;
% 如果违反约束,施加惩罚
if ~check_radial_constraint(population(i, :), network_data)
fitness(i) = fitness(i) + 1000; % 惩罚项
end
end
end
5. 潮流计算
matlab
function total_loss = power_flow_analysis(individual, network_data)
% 前推回代法进行潮流计算
try
% 构建当前开关状态下的网络拓扑
[branch_status, ~] = build_network_topology(individual, network_data);
% 初始化电压
V = ones(network_data.num_nodes, 1) * network_data.base_V;
delta_V = inf;
tolerance = 1e-6;
max_iter = 100;
iter = 0;
while delta_V > tolerance && iter < max_iter
V_old = V;
% 回代计算电流
I = calculate_currents(V, network_data.loads, branch_status, ...
network_data.branches);
% 前推计算电压
V = update_voltages(I, branch_status, network_data.branches, ...
network_data.base_V);
delta_V = max(abs(V - V_old));
iter = iter + 1;
end
% 计算总损耗
total_loss = calculate_power_loss(I, branch_status, network_data.branches);
catch
% 如果潮流计算不收敛,返回大值作为惩罚
total_loss = 10000;
end
end
function I = calculate_currents(V, loads, branch_status, branches)
% 计算各支路电流
num_nodes = length(V);
I = zeros(size(branches, 1), 1);
% 从末端节点向前计算电流
for i = size(branches, 1):-1:1
if branch_status(i) == 0 % 开关断开
continue;
end
from_node = branches(i, 1);
to_node = branches(i, 2);
% 负荷电流
S_load = loads(to_node, 1) + 1j * loads(to_node, 2);
I_load = conj(S_load / V(to_node));
% 下游支路电流之和
downstream_current = 0;
for j = i+1:size(branches, 1)
if branches(j, 1) == to_node && branch_status(j) == 1
downstream_current = downstream_current + I(j);
end
end
I(i) = I_load + downstream_current;
end
end
function V = update_voltages(I, branch_status, branches, base_V)
% 更新节点电压
num_nodes = max(branches(:, 2));
V = ones(num_nodes, 1) * base_V;
for i = 1:size(branches, 1)
if branch_status(i) == 0 % 开关断开
continue;
end
from_node = branches(i, 1);
to_node = branches(i, 2);
R = branches(i, 3);
X = branches(i, 4);
% 电压降
voltage_drop = I(i) * (R + 1j * X);
V(to_node) = V(from_node) - voltage_drop;
end
end
function total_loss = calculate_power_loss(I, branch_status, branches)
% 计算总网损
total_loss = 0;
for i = 1:size(branches, 1)
if branch_status(i) == 1 % 只计算闭合支路
R = branches(i, 3);
total_loss = total_loss + abs(I(i))^2 * R;
end
end
total_loss = real(total_loss) * 1000; % 转换为kW
end
6. 遗传操作函数
matlab
function new_population = selection(population, fitness, elite_rate)
% 锦标赛选择
pop_size = size(population, 1);
elite_size = round(pop_size * elite_rate);
new_population = zeros(size(population));
% 精英保留
[~, elite_idx] = mink(fitness, elite_size);
new_population(1:elite_size, :) = population(elite_idx, :);
% 锦标赛选择剩余个体
tournament_size = 3;
for i = elite_size+1:pop_size
contestants = randperm(pop_size, tournament_size);
[~, best_idx] = min(fitness(contestants));
new_population(i, :) = population(contestants(best_idx), :);
end
end
function new_population = crossover(new_population, pc, network_data)
% 单点交叉
pop_size = size(new_population, 1);
for i = 1:2:pop_size-1
if rand < pc
% 选择交叉点
cross_point = randi([1, size(new_population, 2)-1]);
% 执行交叉
temp1 = new_population(i, :);
temp2 = new_population(i+1, :);
new_population(i, :) = [temp1(1:cross_point), temp2(cross_point+1:end)];
new_population(i+1, :) = [temp2(1:cross_point), temp1(cross_point+1:end)];
% 检查约束,如果不满足则恢复
if ~check_radial_constraint(new_population(i, :), network_data)
new_population(i, :) = temp1;
end
if ~check_radial_constraint(new_population(i+1, :), network_data)
new_population(i+1, :) = temp2;
end
end
end
end
function new_population = mutation(new_population, pm, network_data)
% 位变异
pop_size = size(new_population, 1);
chrom_length = size(new_population, 2);
for i = 1:pop_size
if rand < pm
original = new_population(i, :);
valid = false;
attempts = 0;
while ~valid && attempts < 10
% 随机选择变异位
mut_point = randi(chrom_length);
new_population(i, mut_point) = 1 - new_population(i, mut_point);
% 检查约束
if check_radial_constraint(new_population(i, :), network_data)
valid = true;
else
new_population(i, :) = original;
attempts = attempts + 1;
end
end
end
end
end
7. 约束检查函数
matlab
function is_radial = check_radial_constraint(individual, network_data)
% 检查网络是否为辐射状结构
[branch_status, active_branches] = build_network_topology(individual, network_data);
% 构建连通性矩阵
num_nodes = network_data.num_nodes;
adjacency = zeros(num_nodes);
for i = 1:length(branch_status)
if branch_status(i) == 1
from = network_data.branches(i, 1);
to = network_data.branches(i, 2);
adjacency(from, to) = 1;
adjacency(to, from) = 1;
end
end
% 使用BFS检查连通性和辐射状
visited = false(1, num_nodes);
queue = 1; % 从根节点开始
visited(1) = true;
parent = zeros(1, num_nodes);
while ~isempty(queue)
current = queue(1);
queue(1) = [];
neighbors = find(adjacency(current, :));
for neighbor = neighbors
if ~visited(neighbor)
visited(neighbor) = true;
parent(neighbor) = current;
queue(end+1) = neighbor;
elseif neighbor ~= parent(current)
% 发现环
is_radial = false;
return;
end
end
end
% 检查是否所有节点都连通
if all(visited)
is_radial = true;
else
is_radial = false;
end
end
function [branch_status, active_branches] = build_network_topology(individual, network_data)
% 根据染色体构建网络拓扑
branch_status = ones(network_data.num_branches, 1); % 默认所有支路闭合
% 设置联络开关状态
for i = 1:length(network_data.tie_switches)
switch_idx = network_data.tie_switches(i);
branch_status(switch_idx) = individual(i);
end
active_branches = find(branch_status == 1);
end
8. 结果显示函数
matlab
function display_switch_status(individual, network_data)
% 显示开关状态
fprintf('联络开关状态:\n');
for i = 1:length(network_data.tie_switches)
switch_idx = network_data.tie_switches(i);
status = individual(i);
fprintf('开关 %d (支路%d-%d): %s\n', i, ...
network_data.branches(switch_idx, 1), ...
network_data.branches(switch_idx, 2), ...
iif(status == 1, '闭合', '断开'));
end
fprintf('\n活动的支路:\n');
[branch_status, active_branches] = build_network_topology(individual, network_data);
for i = 1:length(active_branches)
branch_idx = active_branches(i);
fprintf('支路 %d: 节点%d - 节点%d\n', branch_idx, ...
network_data.branches(branch_idx, 1), ...
network_data.branches(branch_idx, 2));
end
end
function plot_convergence(best_fitness, avg_fitness)
% 绘制收敛曲线
figure;
plot(1:length(best_fitness), best_fitness, 'b-', 'LineWidth', 2);
hold on;
plot(1:length(avg_fitness), avg_fitness, 'r--', 'LineWidth', 2);
xlabel('迭代次数');
ylabel('网络损耗 (kW)');
title('遗传算法收敛曲线');
legend('最优解', '平均解');
grid on;
end
function result = iif(condition, true_val, false_val)
% 内联if函数
if condition
result = true_val;
else
result = false_val;
end
end
参考代码 微电网遗传算法优化 www.3dddown.com/csa/60783.html
说明
- 运行主程序:直接运行主程序文件即可开始优化过程
- 参数调整:可以根据需要调整种群大小、迭代次数等参数
- 结果解读:程序会输出最优的开关配置方案和相应的网络损耗
特点
- 编码方案:采用二进制编码表示开关状态
- 约束处理:确保网络始终保持辐射状结构
- 潮流计算:使用前推回代法进行精确的潮流分析
- 收敛性:包含精英保留策略,保证算法收敛性