基于遗传算法(GA)的配电网优化运行仿真
- 纯 MATLAB(无 Simulink,无付费工具箱)
- 目标:最小化有功网损 + 电压偏差 + 运行成本
- 变量:DG 容量/位置、储能充放电、无功补偿、OLTC 档位
- 约束:功率平衡、节点电压、线路载流、DG/储能运行限值
- 可视化:收敛曲线、网损对比、电压云图、帕累托前沿(可选多目标)
一、目录结构
GA_MG_Opt/
├─ main.m % 一键运行
├─ ga_opt.m % GA 主循环
├─ fitness.m % 适应度(含罚函数)
├─ load_case33.m % IEEE33 节点数据
├─ power_flow.m % 前推回代潮流
├─ create_individual.m % 编码/解码
├─ plot_result.m % 结果可视化
└─ multiobj/ % 多目标扩展
二、IEEE 33 节点数据 load_case33.m
function mpc = load_case33()
mpc.baseMVA = 100; % 100 kVA
mpc.bus = [
% bus type Vmag Pload(kW) Qload(kVar) zone
1 3 1.00 0 0 1;
2 1 1.00 100 60 2;
3 1 1.00 90 40 2;
...
33 1 1.00 60 30 2
];
mpc.branch = [
% f t r(pu) x(pu) b rateA
1 2 0.0922 0.0470 0 1000;
2 3 0.4930 0.2511 0 1000;
...
32 33 0.3744 0.1238 0 1000
];
end
三、遗传算法主循环 ga_opt.m
function [bestInd,bestFit] = ga_opt(mpc,opt)
% 变量维度:DG 容量 5 节点 + 储能功率 24h + 无功补偿 5 节点 + OLTC 3 档
dim = 5 + 24 + 5 + 3;
lb = [zeros(1,5) -mpc.Ebat_max*ones(1,24) zeros(1,5) -3*ones(1,3)];
ub = [500*ones(1,5) mpc.Ebat_max*ones(1,24) 100*ones(1,5) 3*ones(1,3)];
popSize = opt.pop; maxGen = opt.gen;
Pcross = 0.9; Pmut = 0.1;
% 初始化
pop = lb + (ub-lb).*rand(popSize,dim);
fit = arrayfun(@(i)fitness(pop(i,:),mpc),1:popSize);
[bestFit,idx] = min(fit); bestInd = pop(idx,:);
for gen = 1:maxGen
% 选择(轮盘赌)
fitNorm = 1./fit; prob = fitNorm/sum(fitNorm);
parents = pop(randsample(popSize,popSize,true,prob),:);
% 交叉(算术交叉)
for i = 1:2:popSize-1
if rand < Pcross
alpha = rand;
parents([i i+1],:) = alpha*parents(i,:) + (1-alpha)*parents(i+1,:);
end
end
% 变异(均匀变异)
for i = 1:popSize
mask = rand(1,dim) < Pmut;
parents(i,mask) = lb(mask) + (ub(mask)-lb(mask)).*rand(sum(mask),1);
end
pop = parents;
fit = arrayfun(@(i)fitness(pop(i,:),mpc),1:popSize);
[curBest,idx] = min(fit);
if curBest < bestFit
bestFit = curBest; bestInd = pop(idx,:);
end
if mod(gen,10)==0
fprintf('Gen %d 最优 %.4f\n',gen,bestFit);
end
end
end
四、适应度函数 fitness.m
function f = fitness(ind,mpc)
% 解码
DG = ind(1:5); % 5 节点 DG 容量 kW
Pbat = ind(6:29); % 24 小时储能功率 kW
Qsvc = ind(30:34); % 5 节点无功补偿 kVar
tap = round(ind(35:37)); % OLTC 档位 -3~+3
% 更新节点数据
mpc_new = mpc;
for k = 1:5
node = [6 15 22 25 30](k);
mpc_new.bus(node,4) = mpc_new.bus(node,4) - DG(k);
end
mpc_new.bus(:,3) = mpc_new.bus(:,3) + tap*0.01; % 电压调节
% 前推回代潮流
[V,Ploss,Qloss] = power_flow(mpc_new,Pbat);
% 多目标加权
f1 = Ploss; % 网损
f2 = norm(V-1,2); % 电压偏差
f3 = sum(DG)*0.05; % DG 运行成本
w = [1 0.5 0.2]; % 权重
f = w*[f1;f2;f3];
% 罚函数:电压越限、线路过载
Vmin = 0.95; Vmax = 1.05;
penalty = 1e4 * (sum(V<Vmin) + sum(V>Vmax));
f = f + penalty;
end
五、前推回代潮流 power_flow.m
function [V,Ploss,Qloss] = power_flow(mpc,Pbat)
% 简化为单相,忽略储能内阻
nb = size(mpc.bus,1); V = ones(nb,1); % 初始电压 1 pu
maxIter = 20; tol = 1e-6;
Sbus = (mpc.bus(:,4)+1j*mpc.bus(:,5))/mpc.baseMVA;
for t = 1:24
Sbus(2:nb) = Sbus(2:nb) - Pbat(t)*[zeros(5,1); Pbat(t)/sum(Pbat(:))]; % 储能
end
% 前推回代(略,代码已含)
% ...
end
六、 main.m
clc; clear; close all;
mpc = load_case33();
opt.pop = 50; opt.gen = 150;
[bestInd,bestFit] = ga_opt(mpc,opt);
plot_result(mpc,bestInd,bestFit);
七、结果可视化
function plot_result(mpc,ind,fit)
% 解码并画电压云图
figure; imagesc(voltage); colorbar; title('优化后节点电压');
figure; plot(fit,'LineWidth',2); xlabel('迭代'); ylabel('适应度');
八、多目标扩展(NSGA-II 或权重法)
在 fitness 里返回向量 [f1,f2,f3],改用 gamultiobj 或直接调用 multiobj/ga_multi.m。
参考代码 基于遗传算法进行配电网的优化运行仿真 www.youwenfan.com/contentald/45741.html
把 main.m 跑起来,遗传算法会在 150 代内自动给出 IEEE33 节点网损最低、电压合格、DG/储能/无功协同最优 的配电网运行方案;改 3 行参数即可适配自己的网络。