基于精英变异算法的电动汽车充电优化程序

基于精英变异算法的电动汽车充电优化程序,完全从底层实现精英变异(Elite Mutation / Elite-Guided Mutation,本质是带精英保留的改进遗传算法),解决 EV 有序/无序充电的负荷均衡 + 电费最小问题。


一、问题建模

1. 优化目标

  1. 最小化总充电费用
  2. 最小化电网峰谷差(削峰填谷)

综合目标:

\(\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})

二、精英变异算法核心思想

精英变异 ≠ 盲目随机变异
关键改进:

  1. 精英保留:每一代 Top-K 个体直接存活
  2. 精英引导变异:变异不是全随机,而是在“当前最优解附近做高斯/邻域扰动”
  3. 可行性修复:保证染色体永远合法

三、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
posted @ 2026-06-02 20:52  修BUG狂人  阅读(12)  评论(0)    收藏  举报