1 简介
为了保证小区电动汽车充电时变压器不过载,提出基于遗传算法的小区电动汽车有序充电控制方法.在综合考虑用户充电需求的基础上,以不改变变压器供电容量和"削峰填谷"为目标,采用蒙特卡洛法模拟负荷并采用遗传算法求解电动汽车的最优充电时间,以实现小区内电动汽车的有序充电.分析结果表明,相比无序充电,所提方法能够在不改变变压器供电容量下,满足用户充电需求,并有效地实现"削峰填谷".
遗传算法是模仿自然界中生物进化机制的一种寻优算法。与其他寻优算法相比,具有很好的收敛性、计算时间快等优点。遗传算法的步骤如下:
( 1) 设置初始参数,产生初始种群,计算每个个体的适应度;
( 2) 选择适应度较好的个体进行下一步运算;
( 3) 当随机变量小于遗传算法的交叉概率时,个体将进行交叉运算,生成新的种群;
( 4) 当随机变量小于遗传算法的变异概率时,个体将进行变异;
( 5) 对于产生的新种群进行判断,剔除无效个体,保留适应度较好的个体。迭代次数增加一次并返回( 2) 。
蒙特卡洛法是一种统计模拟方法,主要通过建立模型和设置条件进行大量的随机抽取求出结果。本文利用蒙特卡洛法模拟电动汽车的无序充电过程。蒙特卡洛法的步骤如下:
( 1) 设置电动汽车数量,建立 1. 1 节中的负荷模型;
( 2) 生成每辆电动汽车的用户返程时间、日行驶里程等数据;
( 3) 计算出每辆电动汽车的充电时间段和充电负荷;
( 4) 生成无序充电负荷曲线。
2 部分代码
%%------------------------------------------------------
%利用遗传算法对电动汽车有序充电进行优化;优化目标包括充电费用最低,充电时间达到要求(电动汽车充到足够的电)
%考虑电动汽车充电对电网负荷的影响,使负荷峰谷差最小。
%--------------------------------------------------------
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.95*ones(1,Num);
global SOC_end
C=35;
global C
number=Num;%种群中个体数量
%% 遗传算法参数设定
NP=300;% 产生初始种群的总数
NG=80 ;% 迭代的 总次数
Pc=0.8;
Pm=0.4;% 变异率
COUNTER=10;
%% 产生初始种群
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为交叉率
%% COUNTER为精英数量
for temp_count=1:COUNTER
posCut = floor(rand()*(number-2)) + 1;
TEMP(temp_count).generation(:,1:posCut) = data(SelFather).generation(:,1:posCut);
TEMP(temp_count).generation(:,(posCut+1):number) = data(Selmother).generation(:,(posCut+1):number);
end
TEMP(COUNTER+1).generation=data(SelFather).generation;
TEMP(COUNTER+2).generation=data(Selmother).generation;
for temp_count=1:COUNTER
TEMP(temp_count).Fitness=Fitness(TEMP(temp_count).generation,PEV,Price,SOC_start,SOC_end,C);
end
[TEMP_Fitness,Location]=max([TEMP(:).Fitness]);
data1(i).generation=TEMP(Location).generation;
%%
% 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_JY=-maxium_Fitness;
save FITNESS_JY
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_JY=EV;
save EV_JY
set(gca, 'YLim',[100 600]); % X轴的数据显示范围
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')
legend('区域负荷功率曲线(不含电动汽车)','location','northwest','区域负荷功率曲线(包含电动汽车)','location','northwest')
3 仿真结果
4 参考文献
[1]王劲峰, 谢诗雨, 李君豪,等. 基于遗传算法的小区电动汽车有序充电策略[J]. 低压电器, 2019, 000(010):47-50.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。