1.算法描述 作为电动汽车的普及与推广,必要的基础配套服务设施、充电站的建设位置和选址规划对整体行业的发展起着重要的意义,本文中提出了一个不同等级电动汽车充电站的选址与求解算法,考虑到了备选地址的分布情况,基于目标规划的整体思路,建立了一个使得电站建设初始成本,以及用户充电总成本最小化的不同等级充电站的选址解决模型,为了求解,运用了遗传搜索算法,针对其中表示电站址等级和用户分配的两个决策变量,设计了遗传编码和初始解构建相结合的新颖方案,并采用了遗传变异策略,可同时确定出充电站的建址位置、建设等级以及各个需求点的分配,该算法有很好的电站寻址能力,通过模型求得的解能很好的解答该题。
从定量建模的角度出发,建立一个考虑多种等级的充电站选址模型,希望可以同时决策充电站的建址位置、建设等级以及各个需求点分配给哪个充电站进行服务等问题,同时结合考虑建站成本最小以及用户出行成本最小的问题,针对建立的模型,设计了一个遗传收搜算法来进行求解。
根据已给数据,充电站的建设分为4个等级,各等级充电站的动力蓄电池存储能力、日服务能力等各不相同,具体如表1所示:
首先我们要做的就是通过演算来决定怎样选择Station地点才能使各个方面的成本最小化。结合给定的条件,可以想到是,将每种可能性尝试一遍,计算出成本,并且记录已知最小值与此时的Station信息。那么我们可以算出,但用这种方法,我们需要循环测试5的十次方种可能性,然而这种方法的时间复杂度为 。随着充电站数量的增多或者在模型中需要加入其他考虑因素的话,枚举算法在运算时间上就难以接受。因此在这里我们需要考虑更加合适的启发式算法---遗传算法。
电动汽车充电站的运营成本主要是按购电电价(分时电价)向电网公司支付电费,它的主要收入来源于按照制定给用户的充电电价收取的充电费用。充电站通过两者的差价来实现盈利。因此我们研究充电站分时充电电价时段的制定,希望通过用户的自主响应,以达到有序充电的目的,实现充电站的最大盈利。
第一步:获取用户的充电需求
当用户驶入电站,根据用户自身条件选择(1)即充(不等待,即刻充电)(2)可以最大等待时间区间(即用户在附近上班、公务或其他事宜,可延迟充电最大时间)(3)无充电时间,更换电池板。充电站则根据充电站通过电动汽车上的电池管理系统获取电动汽车电池容量Bi,以及电池当前荷电状态(state of charge,SOC) Asi (即电动汽车当前电池电量与其电池总容量的比例)。合理制定用户的充电分时电价时段。
第二步:会根据用户选择以及充电站内系统运行状态给予用户一个实时分时电价
电动汽车充电站以实现削峰填谷为目标,并以满足客户充电需求以及充电站变压器不过载为约束,动态制定面向该用户的分时电价。
第三步:用户自主响应分时电价,确定充电计划。
充电站在制定的分时电价后,用户自主响应选择充电模式,可选择延迟电动汽车充电开始时间至低电价时段或立即开始充电,或重新调整以上三个不同的充电模式,直至与充电站内的电荷状态及盈利模式相符。充电站最后根据用户选择确定电动汽车充电计划,实现站内接入电动汽车的有序充电控制。否则,即视为充电需求不满足,用户离开。
综上所述 ,系统的优化目标函数为:
一项是充电站建站成本,一项是电动车在充电过程中消耗的成本(包括路程上的消耗及占用用户的时间成本)
2.仿真效果预览 matlab2022a仿真如下:
3.MATLAB核心程序
% 1 350 650
% 2 250 530
% 3 110 400
% 4 70 350
global CDZ_lvl;
global CDZ_Ev;
global CDZ_my;
global CDZ_my2;
global Icar;
global Xcar;
global Ycar;
global EVcar;
global ICDZ;
global XCDZ;
global YCDZ;
global Myrod;
global CDZage;
global Car1;
global Car2;
global Car3;
global TYPE;
CDZ_lvl = [1,2,3,4];
CDZ_Ev = [350,250,110,70];
CDZ_my = 1e4*[650,530,400,350];
CDZ_my2 = 1e4*[650,530,400,350]*0.08;
%充电的电动车分布及数量
Icar = [1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30];
Xcar = 9.6/700*[1268.49126300000;1222.61962400000;1345.25604800000;1151.47177400000;1265.68279600000;1207.64112900000;1167.38642500000;1166.45026900000;1142.11021500000;1045.68615600000;1087.81317200000;948.325941000000;831.306452000000;816.327957000000;927.730511000000;823.817204000000;816.327957000000;689.946909000000;760.158602000000;678.713038000000;567.310484000000;568.246640000000;529.864247000000;420.334005000000;191.911962000000;240.592070000000;400.674731000000;541.098118000000;596.331317000000;695.563844000000];
Ycar = 9.6/700*[453.572581000000;427.360215000000;492.891129000000;429.232527000000;527.528898000000;589.315188000000;630.506048000000;582.762097000000;528.465054000000;503.188844000000;597.740591000000;605.229839000000;426.424059000000;350.595430000000;382.424731000000;493.827285000000;584.634409000000;444.211022000000;241.065188000000;271.958333000000;409.573253000000;333.744624000000;461.997984000000;459.189516000000;335.616935000000;211.108199000000;204.555108000000;235.448253000000;482.593414000000;501.316532000000];
EVcar = [33;35;22;29;28;34;37;45;37;45;50;33;29;35;43;42;23;34;31;37;41;24;29;32;32;22;24;26;33;31];
%汽车类型随机划分
II = randperm(length(Icar));
Car1 = II(1:12);
Car2 = II(13:21);
Car3 = II(22:30);
TYPE = ones(1,length(Icar));
TYPE(Car1)=1;
TYPE(Car2)=2;
TYPE(Car3)=3;
ICDZ = [1;2;3;4;5;6;7;8;9;10];
XCDZ = 9.6/700*[1284.40591400000;1162.70564500000;1158.02486600000;857.518817000000;772.328629000000;725.520833000000;574.799731000000;464.333333000000;205.954301000000;920.241263000000];
YCDZ = 9.6/700*[463.870296000000;593.059812000000;418.934812000000;562.166667000000;343.106183000000;302.851478000000;448.891801000000;377.743952000000;315.021505000000;427.360215000000];
%用户路程成本
Myrod = 1;
%充电站建设使用周期为10年
CDZage = 10;
MAXGEN = 200;
NIND = 500;
Nums = 10;
Chrom = crtbp(NIND,Nums*10);
%sh
Areas = [];
for i = 1:Nums
Areas = [Areas,[0;4]];% 目标范围0到4,如果是0,则表明该位置不安装充电桩
end
FieldD = [rep([10],[1,Nums]);Areas;rep([0;0;0;0],[1,Nums])];
gen = 0;
for a=1:1:NIND
%计算对应的目标值
X = round(4*rand(1,Nums));%初始值
[epls,f1,f2,Aim] = func_obj(X);
E = epls;
Js(a,1) = E;
end
Objv = (Js+eps);
gen = 0;
%%
while gen < MAXGEN;
gen
Pe0 = 0.995;
pe1 = 0.005;
FitnV=ranking(Objv); %编码
Selch=select('sus',Chrom,FitnV);%选择
Selch=recombin('xovsp', Selch,Pe0); %交叉
Selch=mut( Selch,pe1); %变异
phen1=bs2rv(Selch,FieldD);
for a=1:1:NIND
X = round(phen1(a,:));
%计算对应的目标值
[epls,f1,f2,Aim]= func_obj(X);
E = epls;
JJ(a,1) = E;
end
Objvsel=(JJ);
[Chrom,Objv]=reins(Chrom,Selch,1,1,Objv,Objvsel);
gen=gen+1;
%保存参数收敛过程和误差收敛过程以及函数值拟合结论
index1 = isnan(JJ);
index2 = find(index1 == 1);
JJ(index2) = [];
index3 = find(JJ==10000000000000);
JJ(index3) = [];
Error(gen) = mean(JJ);
[VV,II]=min(JJ);
end
figure;
plot(Error,'linewidth',2);
grid on
xlabel('迭代次数');
ylabel('遗传算法优化过程');
legend('Average fitness');
[V,I] = min(JJ);
X = round(phen1(I,:))
[epls,f1,f2,Aim]= func_obj(X);
%成本输出
epls
f1
f2
%显示布局图
ii=find(X==0);
X(ii)=[];
XCDZ(ii)=[];
YCDZ(ii)=[];
figure;
for i = 1:length(X)
if X(i)==1
plot(XCDZ(i),YCDZ(i),'bo','LineWidth',2,...
'MarkerEdgeColor','k',...
'MarkerFaceColor','b',...
'MarkerSize',10);
hold on
text(XCDZ(i)+0.2,YCDZ(i)+0.2,num2str(X(i)));hold on
end
if X(i)==2
plot(XCDZ(i),YCDZ(i),'rs','LineWidth',2,...
'MarkerEdgeColor','k',...
'MarkerFaceColor','r',...
'MarkerSize',10);
hold on
text(XCDZ(i)+0.2,YCDZ(i)+0.2,num2str(X(i))); hold on
end
if X(i)==3
plot(XCDZ(i),YCDZ(i),'k^','LineWidth',2,...
'MarkerEdgeColor','k',...
'MarkerFaceColor','c',...
'MarkerSize',10);
hold on
text(XCDZ(i)+0.2,YCDZ(i)+0.2,num2str(X(i)));hold on
end
if X(i)==4
plot(XCDZ(i),YCDZ(i),'r>','LineWidth',2,...
'MarkerEdgeColor','k',...
'MarkerFaceColor','g',...
'MarkerSize',10);
hold on
text(XCDZ(i)+0.2,YCDZ(i)+0.2,num2str(X(i)));hold on
end
end
hold on
plot(Xcar,Ycar,'gx');
for i = 1:length(Aim)
plot([Xcar(i),XCDZ(Aim(i))],[Ycar(i),YCDZ(Aim(i))],'b-o','LineWidth',1,...
'MarkerEdgeColor','k',...
'MarkerFaceColor','y',...
'MarkerSize',5);
hold on
text(Xcar(i)+0.2,Ycar(i)+0.2,num2str(i));hold on
end
02_052m