基于遗传算法(GA)的配电网优化运行仿真

基于遗传算法(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/contentcng/45741.html
main.m 跑起来,遗传算法会在 150 代内自动给出 IEEE33 节点网损最低、电压合格、DG/储能/无功协同最优 的配电网运行方案;改 3 行参数即可适配自己的网络。

posted @ 2025-09-10 10:36  yu8yu7  阅读(15)  评论(0)    收藏  举报