一、遗传算法简介

1 引言

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_ide

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_算法_02

2 遗传算法理论

2.1 遗传算法的生物学基础

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_算法_03

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_算法_04

2.2 遗传算法的理论基础

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_算法_05

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_matlab_06

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_机器学习_07

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_ide_08

2.3 遗传算法的基本概念

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_matlab_09

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_ide_10

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_算法_11

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_遗传算法_12

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_ide_13

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_matlab_14

2.4 标准的遗传算法

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_机器学习_15

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_遗传算法_16

2.5 遗传算法的特点

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_算法_17

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_遗传算法_18

2.6 遗传算法的改进方向

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_机器学习_19

3 遗传算法流程

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_遗传算法_20

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_ide_21

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_算法_22

4 关键参数说明

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_机器学习_23

二、部分源代码

%%------------------------------------------------------
%利用遗传算法对电动汽车有序充电进行优化;优化目标包括充电费用最低,充电时间达到要求(电动汽车充到足够的电)
%考虑电动汽车充电对电网负荷的影响,使负荷峰谷差最小。
%--------------------------------------------------------
clc
clear
warning off
%实时电价数据导入,数据来源PJM
RP=[3.10000000000000,3.05000000000000,3,2.80000000000000,2.60000000000000,2.55000000000000,2.50000000000000,2.60000000000000,2.70000000000000,2.80000000000000,2.90000000000000,3.20000000000000,3.50000000000000,3.60000000000000,3.70000000000000,3.67500000000000,3.65000000000000,3.70000000000000,3.75000000000000,3.82500000000000,3.90000000000000,3.92500000000000,3.95000000000000,4.02500000000000,4.10000000000000,4.15000000000000,4.20000000000000,4.20500000000000,4.21000000000000,4.28000000000000,4.35000000000000,4.42500000000000,4.50000000000000,4.60000000000000,4.70000000000000,4.62000000000000,4.54000000000000,4.39500000000000,4.25000000000000,4.22500000000000,4.20000000000000,4.05000000000000,3.90000000000000,3.60000000000000,3.30000000000000,3.20000000000000,3.10000000000000,3.10000000000000];
Price=[RP(35:48),RP(1:14)];% 设定车辆每天17:00之后才回家充电;每天7点之后就离家不充电
Num=100;%电动车数量
PEV=4;
global PEV
% load SOC_start
SOC_start=normrnd(0.3,0.05,1,Num);
global SOC_start
SOC_end=0.90*ones(1,Num);
global SOC_end
C=35;
global C
number=Num;%种群中个体数量
%% 遗传算法参数设定
NP=300;% 产生初始种群的总数
NG=80 ;% 迭代的 总次数
Pc=0.8;
Pm=0.4;% 变异率
%% 产生初始种群
for i=1:NP
data(i).Initial=Initial(number);
data(i).generation=data(i).Initial;
end
%% 计算初始种群适应度
for i=1:NP
data(i).Fitness=Fitness(data(i).generation,PEV,Price,SOC_start,SOC_end,C);
end
intinial_Fitness_1=max([data(:).Fitness]);
%% 进行遗传,交叉,变异
maxium_Fitness=[];
temp_Fitness=intinial_Fitness_1;
for k=1:NG
sum_Fitness=sum([data(1:NP).Fitness]); %所有个体适应值之和
Px = [data(1:NP).Fitness]/sum_Fitness; %所有个体适应值的平均值
PPx = 0;
PPx(1) = Px(1);
for i=2:NP %用于轮盘赌策略的概率累加
PPx(i) = PPx(i-1) + Px(i);
end
for i=1:NP
sita = rand();
for n=1:NP
if sita <= PPx(n)
SelFather = n; %根据轮盘赌策略确定的父亲
break;
end
end
Selmother = floor(rand()*(NP-1))+1; %随机选择母亲
posCut = floor(rand()*(number-2)) + 1; %随机确定交叉点
r1 = rand();
%% 交叉
if r1<=Pc %Pc为交叉率
data1(i).generation(:,1:posCut) = data(SelFather).generation(:,1:posCut);
data1(i).generation(:,(posCut+1):number) = data(Selmother).generation(:,(posCut+1):number);
r2 = rand();
%% 变异
if r2 <= Pm % Pm变异率
posMut = round(rand()*(number-1) + 1);
for j=1:size(data1,2)
data1(j).generation(:,posMut)=generate( data1(j).generation(:,posMut));
end
end

else
data1(i).generation =data(SelFather).generation(:,:);
end
end
%% 选择
for i=1:NP
data(i).Fitness= Fitness(data(i).generation,PEV,Price,SOC_start,SOC_end,C); %子代适应值
end
for i=1:NP
data1(i).Fitness= Fitness(data1(i).generation,PEV,Price,SOC_start,SOC_end,C); %子代适应值
end
[value1,index1]=sort([data(1:NP).Fitness],'descend');
[value2,index2]=sort([data1(1:NP).Fitness],'descend');
j=1;
for i=index1(1:NP/2)
temp_1(j).p=data(i).generation;
j=j+1;
end
j=1;
for i=index2(1:NP/2)
temp_2(j).p=data1(i).generation;
j=j+1;
end
for i=1:NP/2
data(i).generation =temp_1(i).p;
end
for i=1:NP/2
data(NP/2+i).generation =temp_2(i).p;
end
for i=1:NP
data(i).Fitness= Fitness(data(i).generation,PEV,Price,SOC_start,SOC_end,C); %子代适应值
end
temp_Fitness=max([data(1:NP).Fitness]);
maxium_Fitness=[maxium_Fitness;temp_Fitness];

end
Fitness_initial= -inf;
for i=1:NP
if data(i).Fitness> Fitness_initial
INDEX=i; %取个体中的最好值作为最终结果
Fitness_initial=data(i).Fitness;
end
end
%% 遗传算法结果可视化
figure(1)
plot(-maxium_Fitness)% 画出每一代最优个体的适应度
xlabel('遗传代数')
ylabel('组合目标函数值')
title('进化过程')
FITNESS_NORMAL=-maxium_Fitness;
save FITNESS_NORMAL
figure(2)
EV_load=sum(data(INDEX).generation');
EV=[EV_load(15:end),zeros(1,20),EV_load(1:14)];
plot(EV*PEV)
set(gca, 'XLim',[1 48]); % X轴的数据显示范围
set(gca, 'XTick',[8,16,24,32,40,48] ); % X轴的记号点
set(gca, 'XTicklabel',{'4','8','12','16','20','24'}); % X轴的记号
xlabel('时间/h')
ylabel('负荷功率/kW')
figure(3)
Residential_load=[1962.55433333333,1617.09200000000,1397.80300000000,1240.56566666667,1139.44666666667,1087.19533333333,1047.75966666667,1039.21600000000,1025.50600000000,1055.46700000000,1082.60533333333,1130.10900000000,1361.02566666667,1719.95200000000,2047.19933333333,2384.35633333333,2527.08400000000,2849.10700000000,3038.91600000000,3026.13366666667,2888.03833333333,2787.28300000000,2730.16333333333,2762.67133333333,2965.20133333333,3403.65066666667,3292.44533333333,3011.74400000000,2804.51133333333,2717.41300000000,2834.95466666667,3040.08966666667,3160.87966666667,3381.25666666667,3864.43433333333,4218.04066666667,4372.06066666667,4467.65866666667,4694.08000000000,4610.18166666667,4374.74966666667,4266.39233333333,4200.47800000000,4027.01666666667,3845.33500000000,3510.83266666667,3183.25400000000,2515.23000000000]*0.1;
plot(Residential_load,'r-');hold on% 当地负荷曲线
plot(EV+Residential_load,'k-')% 叠加电动汽车后的当地负荷曲线
EV_BY=EV;
function Fitness_result=Fitness(X,PEV,Price,SOC_start,SOC_end,C)
%x矩阵是48*N SOC_start是一个服从正态分布的1*N SOC_start是一个的1*N的1矩阵
L=[1962.55433333333,1617.09200000000,1397.80300000000,1240.56566666667,1139.44666666667,1087.19533333333,1047.75966666667,1039.21600000000,1025.50600000000,1055.46700000000,1082.60533333333,1130.10900000000,1361.02566666667,1719.95200000000,2047.19933333333,2384.35633333333,2527.08400000000,2849.10700000000,3038.91600000000,3026.13366666667,2888.03833333333,2787.28300000000,2730.16333333333,2762.67133333333,2965.20133333333,3403.65066666667,3292.44533333333,3011.74400000000,2804.51133333333,2717.41300000000,2834.95466666667,3040.08966666667,3160.87966666667,3381.25666666667,3864.43433333333,4218.04066666667,4372.06066666667,4467.65866666667,4694.08000000000,4610.18166666667,4374.74966666667,4266.39233333333,4200.47800000000,4027.01666666667,3845.33500000000,3510.83266666667,3183.25400000000,2515.23000000000]*0.1;
F1=sum(PEV.*Price*X)./1000;
EV_load=sum(X');
x=[EV_load(15:end),zeros(1,20),EV_load(1:14)];
F2=(max(L+x.*PEV)-min(L+x.*PEV))/100;
if sum(find((((SOC_end-SOC_start).*C)/(0.5*PEV)-sum(X))>0))+sum(find(((1.1-SOC_start).*C)/(0.5*PEV)-sum(X)<0))
K1=1000000;
else
K1=0;
end
Fitness_result=-(0.6*F1+0.4*F2+K1);
end

三、运行结果

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_算法_24

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_遗传算法_25

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_ide_26

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_算法_27

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_算法_28

【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】_matlab_29

四、matlab版本及参考文献

1 matlab版本

2014a

2 参考文献

《智能优化算法及其MATLAB实例(第2版)》包子阳 余继周 杨杉著 电子工业出版社