基于精英变异算法的电动汽车充电优化程序
基于精英变异算法的电动汽车充电优化程序,完全从底层实现精英变异(Elite Mutation / Elite-Guided Mutation,本质是带精英保留的改进遗传算法),解决 EV 有序/无序充电的负荷均衡 + 电费最小问题。
一、问题建模
1. 优化目标
- 最小化总充电费用
- 最小化电网峰谷差(削峰填谷)
综合目标:
\(\min F=\alpha\cdot C_{\text{total}}+\beta\cdot\left(\max_t P_{\text{EV}}(t)-\min_t P_{\text{EV}}(t)\right)\)
其中 \(P_{\text{EV}}(t)\) 是所有 EV 在时段 (t) 的充电功率之和。
2. 约束
- 每辆车电量需求必须被满足
- 充电只能在车辆接入时段内进行
- 单时段 EV 总功率不超过变压器/配变允许上限
- 单辆车功率 0~(P_{\max})
二、精英变异算法核心思想
精英变异 ≠ 盲目随机变异
关键改进:
- 精英保留:每一代 Top-K 个体直接存活
- 精英引导变异:变异不是全随机,而是在“当前最优解附近做高斯/邻域扰动”
- 可行性修复:保证染色体永远合法
三、MATLAB 源码
无需 Optimization Toolbox
纯手写 GA + 精英变异
小规模/中等规模 EV 都能跑
1)主脚本:ev_charging_optimization.m
%% ev_charging_optimization.m
clear; clc; close all;
%% ========== 1. 基础参数 ==========
T = 96; % 24h,15min/段
dt = 0.25; % 小时
price = ev_price_profile(T); % 电价曲线(后面定义)
P_max_car = 7; % kW/车最大
P_trafo_lim = 50; % kW配变上限(可选)
% 车辆参数(N辆车)
N = 6;
EV = cell(N,1);
for i = 1:N
EV{i}.arrive = randi([4,20]); % 接入时段
EV{i}.depart = EV{i}.arrive + randi([10,60]); % 离开时段
EV{i}.depart = min(EV{i}.depart, T);
EV{i}.E_need = randi([8,20]); % kWh
EV{i}.Pmax = P_max_car;
end
%% ========== 2. GA参数 ==========
pop_size = 60;
max_gen = 120;
elite_frac = 0.1; % 精英比例
pc = 0.85; % 交叉概率
pm_base = 0.25; % 基础变异概率
alpha = 0.6; beta = 0.4; % 目标加权
global G_EV G_price G_dt G_Plim
G_EV = EV; G_price = price; G_dt = dt; G_Plim = P_trafo_lim;
%% ========== 3. 初始化种群 ==========
pop = cell(pop_size,1);
fitness = inf(pop_size,1);
for i = 1:pop_size
pop{i} = feasible_chromosome(EV, T);
fitness(i) = eval_objective(pop{i}, alpha, beta);
end
best_f_history = nan(max_gen,1);
best_chrom = [];
%% ========== 4. 进化迭代 ==========
for gen = 1:max_gen
% --- 排序 ---
[fitness, order] = sort(fitness);
pop = pop(order);
best_f_history(gen) = fitness(1);
best_chrom = pop{1};
% --- 精英 ---
n_elite = max(2, round(elite_frac*pop_size));
elite_pop = pop(1:n_elite);
new_pop = elite_pop; % 精英直接保留
% --- 繁殖 ---
while length(new_pop) < pop_size
% 选择父母(轮盘赌,越小越好 → 转成适应度)
inv_fit = 1./(fitness + 1e-6);
prob = inv_fit/sum(inv_fit);
p1 = pop{randsrc(1,1,prob)};
p2 = pop{randsrc(1,1,prob)};
% 交叉
if rand < pc
child = two_point_crossover(p1,p2,N);
else
child = p1;
end
% 精英引导变异
if rand < pm_base
child = elite_guided_mutation(child, best_chrom, EV, T);
end
% 可行性修复
child = repair_chromosome(child, EV, T);
new_pop{end+1} = child;
end
% 截断
pop = new_pop(1:pop_size);
for i = 1:pop_size
fitness(i) = eval_objective(pop{i}, alpha, beta);
end
if mod(gen,20)==0
fprintf('Gen %d | Best F = %.4f\n', gen, best_f_history(gen));
end
end
%% ========== 5. 结果 ==========
fprintf('\n=== 优化完成 ===\n');
fprintf('最优目标值 F = %.4f\n', best_f_history(end));
P_ev = chrom_to_power(best_chrom, EV, T);
time = (1:T)*dt;
figure;
subplot(2,1,1)
plot(time, price,'r','LineWidth',1.8); grid on
xlabel('t (h)'); ylabel('Price ($/kWh)');
title('电价曲线');
subplot(2,1,2)
bar(time, P_ev, 'FaceColor',[0.2 0.4 0.8]); grid on
xlabel('t (h)'); ylabel('P_{EV}(t) (kW)');
title('优化后 EV 充电负荷');
figure;
semilogy(1:max_gen, best_f_history,'k','LineWidth',2); grid on
xlabel('Generation'); ylabel('F');
title('收敛曲线');
2)电价曲线(分时电价示例)
function price = ev_price_profile(T)
% 简化分时电价:峰 0.18 / 平 0.12 / 谷 0.06 ($/kWh)
t = 1:T;
price = 0.12*ones(1,T);
price(t>=29 & t<=68) = 0.18; % 峰 07:00~17:00
price(t>=69) = 0.06; % 谷 17:15~24:00
end
3)染色体定义 + 可行随机初始化
染色体:每辆车一个开始充电时段 (s_i)(整数)
function chrom = feasible_chromosome(EV, T)
N = length(EV);
chrom = zeros(1,N);
for i = 1:N
E = EV{i}; Ki = ceil(E.E_need / (E.Pmax*0.25));
lo = E.arrive;
hi = min(E.depart, T) - Ki + 1;
if lo > hi, lo = hi; end
chrom(i) = randi([lo, hi]);
end
end
4)染色体 → EV 充电功率剖面
function P_ev = chrom_to_power(chrom, EV, T)
P_ev = zeros(1,T);
for i = 1:length(EV)
s = chrom(i);
E = EV{i}; Ki = ceil(E.E_need/(E.Pmax*0.25));
% 实际分配(最后一个时段修正能量)
remain = E.E_need;
for k = 0:Ki-1
t = s+k; if t>T, break; end
p = min(E.Pmax, remain/0.25);
P_ev(t) = P_ev(t) + p;
remain = remain - p*0.25;
end
end
end
5)目标函数(无工具箱,纯算术)
function F = eval_objective(chrom, alpha, beta)
global G_EV G_price G_dt G_Plim
P = chrom_to_power(chrom, G_EV, length(G_price));
cost = sum(P .* G_price) * G_dt;
peak_valley = max(P) - min(P);
F = alpha*cost + beta*peak_valley;
% 软约束:配变上限
if P > G_Plim
F = F + 1e4*sum(max(P-G_Plim,0));
end
end
6)两点交叉(最稳)
function child = two_point_crossover(p1,p2,N)
c = randperm(N,2); c1=min(c); c2=max(c);
child = zeros(1,N);
child(1:c1-1)=p1(1:c1-1);
child(c1:c2)=p2(c1:c2);
child(c2+1:end)=p1(c2+1:end);
end
7) 精英引导变异
不是纯随机跳,而是围绕当前最优解做邻域扰动
function child = elite_guided_mutation(child, best, EV, T)
sigma = 2; % 邻域半径(时段)
for i = 1:length(EV)
if rand<0.5 % 一半基因用精英引导
s_new = best(i) + round(sigma*randn);
else % 一半仍然随机探索
E=EV{i}; Ki=ceil(E.E_need/(E.Pmax*0.25));
lo=E.arrive; hi=min(E.depart,T)-Ki+1;
s_new = randi([lo,hi]);
end
% 硬边界
E = EV{i}; Ki = ceil(E.E_need/(E.Pmax*0.25));
lo = E.arrive; hi = min(E.depart,T)-Ki+1;
child(i) = max(lo, min(hi, s_new));
end
end
参考代码 精英变异遗传算法 www.youwenfan.com/contentcnv/79609.html
8)修复算子(防越界)
function chrom = repair_chromosome(chrom, EV, T)
for i=1:length(EV)
E=EV{i}; Ki=ceil(E.E_need/(E.Pmax*0.25));
lo=E.arrive; hi=min(E.depart,T)-Ki+1;
if lo>hi, lo=hi; end
chrom(i)=max(lo,min(hi,chrom(i)));
end
end
浙公网安备 33010602011771号