为了普及电动汽车,以缓解我国日益严重的环境能源问题,本文研究电动汽车充换电站的选址方法,旨在利用提高电动汽车充电设施的覆盖范围,加快电动汽车的普及发展。本文建立人们日常出行模型,模拟电动汽车用户充电需求,同时,建立道路交通网模型,基于免疫算法和MATLAB软件,对充换电站站址和数量进行优化选择,从而为实现从宏观角度规划充换电站的布局优化提供理论方法。
免疫是生物体的特异性生理反应。免疫系统由具有免疫功能的器官、组织、细胞、免疫效应分子及基因等组成。在多种免疫学说中, Burnet 的克隆选择学说和Jerne 的免疫网络学说是免疫系统理论的代表性学说。根据他们的学说, 生物体内先天具有针对不同抗原特性的多样性B 细胞克隆, 抗原侵入机体后, 在T细胞的识别和控制下, 选择相应的B细胞系并使之增殖, 产生特异性抗体结合抗原, 同时抗原与抗体、抗体与抗体之间的促进和抑制关系形成的网络调节结构维持免疫平衡。免疫系统具有的自组织、自适应、辨识功能、学习和记忆以及鲁棒性等人工系统所期望具有的多种优良性能, 是其近年来能够引起科学研究领域内众多专家和学者研究兴趣的重要原因。免疫算法是模仿生物免疫学和基因进化机理, 通过人工方式构造的一类优化搜索算法, 是对生物免疫过程的一种数学仿真, 是免疫计算的一种最重要形式。随着免疫学和人工免疫系统研究的深入, 人们 对生物免疫机理的认识越来越清晰, 优秀仿生机理 的逐渐融入也使免疫算法的功能日趋强大和完善。 一般免疫算法中融合的免疫机理主要有免疫识别、 免疫学习、免疫记忆、克隆选择、多样性等 。基于免疫机理和一些优秀的、相对成熟的进化算法( 如遗 传算法) , 形成了免疫算法的基本框架。免疫算法中, 抗原和抗体之间以及抗体和抗体之间的匹配程 度用亲合度来描述。一般将抗原、抗体、抗原 和抗体之间的亲合度分别对应优化问题的目标函 数、候选解、解与目标函数的匹配程度。相似于生物免疫系统, 免疫算法首先通过对抗原基因类型的初步识别来产生不同的抗体, 而后通过亲合度计算将优秀抗体保存到记忆单元, 并根据亲合度实现抗体进化和调节, 然后重新计算亲合度并循环直至终止条件满足。免疫算法的一般步骤如下 :
步骤 1 抗原识别。
步骤 2 产生初始抗体。
步骤 3 计算亲合度。
步骤 4 记忆单元更新。
步骤 5 抗体生成与调节( 促进和抑制) 。
步骤 6 终止条件判断( 不满足, 则转步骤 3, 否 则结束) 。
clear all close all clc %%========================================================================= %% 1.变量初始化 C= [0 0;0 100;0 200; 0 300;0 400; 100 0;100 100;100 200;100 300;100 400; 200 0;200 100;200 200;200 300;200 400; 300 0;300 100;300 200;300 300;300 400; 400 0;400 100;400 200;400 300;400 400; ];%节点坐标 n=size(C,1);%n表示节点个数 D=zeros(n,n);%D表示完全图的赋权邻接矩阵 distance=inf; SumOfCity = size(C,1);%节点个数 length_address =zeros(n,n);%length_address表示两两节点间的距离,初始设定10000,可以设定无穷大,表示不相连 for i=1:5:n for j=0:3 length_address(i+j,i+j+1)=20;%距离 end end for i=1:5:n-5 for j=0:4 length_address(i+j,i+j+5)=20;%距离 end end length_address=length_address+length_address';%最终距离矩阵 for i=1:n for j=1:n if length_address(i,j)==0 length_address(i,j)=inf; %对称矩阵 end end end D=length_address;%距离矩阵 figure(5); for i=1:n plot(C(i,1),C(i,2),'bo','MarkerSize',10); str=num2str(i); hold on text(C(i,1)+5,C(i,2)+10,str,'Color','red','FontSize',15); end distance=inf; for i=1:n for j=1:n if(length_address(i,j)~=distance) line([C(i,1),C(j,1)],[C(i,2),C(j,2)],'Color','k','LineWidth',2);%划线 text((length_address(j,1))-50,(length_address(j,2))-50,num2str(length_address(i,j)));%标注线段距离 end end end axis([-100 500 -100 500]) %% 2蚁群算法求解求每个节点间的最短路径 %% 2.1参数设置 m=200;%蚂蚁数量 NC_max=200;%%% NC_max 最大迭代次数 Alpha=1;%% Alpha 表征信息素重要程度的参数 Beta=5;%% Beta 表征启发式因子重要程度的参数 Rho=0.8;%% Rho 信息素蒸发系数 Q=1;%% Q 信息素增加强度系数a %% 2.2求每个节点间的最短路径 for startpoint=1:n for endpoint=startpoint:n if startpoint~=endpoint [Shortest_Length(startpoint,endpoint), Shortest_Route{startpoint,endpoint}]=myfloyd(D,startpoint,endpoint);%用floyd算法求解最短距离 % [ Shortest_Route{startpoint,endpoint},Shortest_Length(startpoint,endpoint)]= ACO1( C,D,m,NC_max,startpoint,endpoint,Rho,Beta,Alpha,Q,distance); else Shortest_Length(startpoint,endpoint)=inf;%不存在最短距离 Shortest_Route{startpoint,endpoint}=[]; end end end Shortest_Length=Shortest_Length+Shortest_Length'; for i=1:n for j=1:n if i~=j dianjia(i,j)= ((150-Shortest_Length(i,j))/300)*30;%计算节点间充电的度数 else dianjia(i,j)=1; end end end %% 3 免疫算法求解最优布局 %% 3.1 算法基本参数 sizepop=15; % 种群规模 overbest=10; % 记忆库容量 MAXGEN=100; % 迭代次数 pcross=0.8; % 交叉概率 pmutation=0.8; % 变异概率 ps=0.95; % 多样性评价参数 length=5; % 充电站数 M=n; high_dianjia=2.5;%高电价 low_dianjia=1.8;%低电价 %% 3.2 识别抗原,将种群信息定义为一个结构体 individuals = struct('fitness',zeros(1,M), 'concentration',zeros(1,M),'excellence',zeros(1,M),'chrom',[]); %% 3.3 产生初始抗体群 individuals.chrom = popinit(M,length,C); trace=[]; %记录每代最个体优适应度和平均适应度 chorm_suiji=individuals.chrom(1,:);%随机选择一个布局方案作为后面对比 %% 3.4迭代寻优 end %% 3.5画出免疫算法收敛曲线 figure(1) plot(trace(:,1)); hold on plot(trace(:,2),'--'); legend('最优适应度值','平均适应度值') title('免疫算法收敛曲线','fontsize',12) xlabel('迭代次数','fontsize',12) ylabel('适应度值','fontsize',12) %% 画出配送中心选址图 %城市坐标 city_coordinate=C; carge=[20,90,90,60,70,70,40,90,90,70,60,40,40,40,20,80,90,70,100,50,50,50,80,70,80,40,40,60,70,50,30]; %找出最近配送点 [m n]=size(city_coordinate); for i=1:m distance1(i,:)=dist(city_coordinate(i,:),city_coordinate(bestchrom,:)'); end [a,b]=min(distance1'); a(find(a==0))=50;%本节点的路程固定为50 %% 充电量对比 cheliang=round(100*rand(24,SumOfCity));%一天24小时的车辆数目 fuhe_best=zeros(24,length);%1天24小时各充电桩的负荷 fuhe=zeros(24,length);%1天24小时各充电桩的负荷 %% 免疫算法优化后的各点电价 for t=1:24 for i=1:SumOfCity if b(i)==2||b(i)==3 %高电价 x_best=bestchrom(b(i));% if x_best~=i%如果车辆就在本节点 expense_best(t,i)=dianjia(i,x_best)*high_dianjia*cheliang(t,i);%高电价 fuhe_best(t,b(i))= fuhe_best(t,b(i))+dianjia(i,x_best)*cheliang(t,i);%节点负荷 else expense_best(t,i)=dianjia(i,x_best)*high_dianjia*cheliang(t,i);%本节点固定充电费用 fuhe_best(t,b(i))= fuhe_best(t,b(i))+dianjia(i,x_best)*cheliang(t,i);%节点负荷 end else x_best=bestchrom(b(i));% if x_best~=i%如果车辆就在本节点 expense_best(t,i)=dianjia(i,x_best)*low_dianjia*cheliang(t,i);%低电价 fuhe_best(t,b(i))= fuhe_best(t,b(i))+dianjia(i,x_best)*cheliang(t,i);%节点负荷 else expense_best(t,i)=dianjia(i,x_best)*low_dianjia*cheliang(t,i);%本节点固定充电费用 fuhe_best(t,b(i))= fuhe_best(t,b(i))+dianjia(i,x_best)*cheliang(t,i);%节点负荷 end end end end S_expense_best=sum(expense_best,2);%一天24小时的充电费用 %% 免疫算法优化前的各点电价 for i=1:m distance2(i,:)=dist(city_coordinate(i,:),city_coordinate(chorm_suiji,:)'); end [a2,b2]=min(distance2'); a2(find(a2==0))=50;%本节点的路程固定为50 for t=1:24 for i=1:M if b2(i)==2||b2(i)==3 %高电价 x=chorm_suiji(b2(i));% if x~=i%如果车辆就在本节点 expense(t,i)=dianjia(i,x)*high_dianjia*cheliang(t,i);%高电价 fuhe(t,b2(i))= fuhe(t,b2(i))+dianjia(i,x)*cheliang(t,i);%节点负荷 else expense(t,i)=dianjia(i,x)*high_dianjia*cheliang(t,i);%本节点固定充电费用 fuhe(t,b2(i))= fuhe(t,b2(i))+dianjia(i,x)*cheliang(t,i);%节点负荷 end else x=chorm_suiji(b2(i));% if x~=i%如果车辆就在本节点 expense(t,i)=dianjia(i,x)*low_dianjia*cheliang(t,i);%低电价 fuhe(t,b2(i))= fuhe(t,b2(i))+dianjia(i,x)*cheliang(t,i);%节点负荷 else expense(t,i)=dianjia(i,x)*low_dianjia*cheliang(t,i);%本节点固定充电费用 fuhe(t,b2(i))= fuhe(t,b2(i))+dianjia(i,x)*cheliang(t,i);%节点负荷 end end end end S_expense=sum(expense,2);%一天24小时的充电费用 index=cell(1,length); for i=1:length %计算各个派送点的地址 index{i}=find(b==i); end figure(2) title('最优规划派送路线') cargox=city_coordinate(bestchrom,1); cargoy=city_coordinate(bestchrom,2); for i=1:length if i==2||i==3 plot(cargox(i),cargoy(i),'rs','LineWidth',2,... 'MarkerEdgeColor','r',... 'MarkerFaceColor','y',... 'MarkerSize',30)%%快速充电桩 hold on else plot(cargox(i),cargoy(i),'rs','LineWidth',2,... 'MarkerEdgeColor','c',... 'MarkerFaceColor','b',... 'MarkerSize',20) %慢速充电桩 hold on end end plot(city_coordinate(:,1),city_coordinate(:,2),'o','LineWidth',2,... 'MarkerEdgeColor','k',... 'MarkerFaceColor','g',... 'MarkerSize',10) for i=1:m x=[city_coordinate(i,1),city_coordinate(bestchrom(b(i)),1)]; y=[city_coordinate(i,2),city_coordinate(bestchrom(b(i)),2)]; plot(x,y,'c');hold on end figure(3) plot(1:t,S_expense_best,'ro-',1:t,S_expense,'bo-') legend('免疫算法优化后的每小时充电费用','优化前的每小时充电费用') xlabel('小时') ylabel('费用') figure(4) plot(1:t,fuhe_best(:,1),'ro-') hold on plot(1:t,fuhe_best(:,2),'bo-') plot(1:t,fuhe_best(:,3),'mo-') plot(1:t,fuhe_best(:,4),'co-') plot(1:t,fuhe_best(:,5),'ko-') legend('慢速充电桩','快速充电桩','快速充电桩','慢速充电桩','慢速充电桩') title('免疫算法优化后的每个充电桩负荷') xlabel('小时') ylabel('负荷') figure(6) plot(1:t,fuhe(:,1),'ro-') hold on plot(1:t,fuhe(:,2),'bo-') plot(1:t,fuhe(:,3),'mo-') plot(1:t,fuhe(:,4),'co-') plot(1:t,fuhe(:,5),'ko-') legend('慢速充电桩','快速充电桩','快速充电桩','慢速充电桩','慢速充电桩') title('优化前的每个充电桩负荷') xlabel('小时') ylabel('负荷')
[1]耿建超. (2017). 基于免疫算法的电动汽车充电站选址优化研究. 中国管理信息化(20), 146-148.