【优化布局】基于免疫算法求解充电站最优布局matlab代码

1 简介

为了普及电动汽车,以缓解我国日益严重的环境能源问题,本文研究电动汽车充换电站的选址方法,旨在利用提高电动汽车充电设施的覆盖范围,加快电动汽车的普及发展。本文建立人们日常出行模型,模拟电动汽车用户充电需求,同时,建立道路交通网模型,基于免疫算法和MATLAB软件,对充换电站站址和数量进行优化选择,从而为实现从宏观角度规划充换电站的布局优化提供理论方法。

免疫是生物体的特异性生理反应。免疫系统由具有免疫功能的器官、组织、细胞、免疫效应分子及基因等组成。在多种免疫学说中, Burnet 的克隆选择学说和Jerne 的免疫网络学说是免疫系统理论的代表性学说。根据他们的学说, 生物体内先天具有针对不同抗原特性的多样性B 细胞克隆, 抗原侵入机体后, 在T细胞的识别和控制下, 选择相应的B细胞系并使之增殖, 产生特异性抗体结合抗原, 同时抗原与抗体、抗体与抗体之间的促进和抑制关系形成的网络调节结构维持免疫平衡。免疫系统具有的自组织、自适应、辨识功能、学习和记忆以及鲁棒性等人工系统所期望具有的多种优良性能, 是其近年来能够引起科学研究领域内众多专家和学者研究兴趣的重要原因。免疫算法是模仿生物免疫学和基因进化机理, 通过人工方式构造的一类优化搜索算法, 是对生物免疫过程的一种数学仿真, 是免疫计算的一种最重要形式。随着免疫学和人工免疫系统研究的深入, 人们 对生物免疫机理的认识越来越清晰, 优秀仿生机理 的逐渐融入也使免疫算法的功能日趋强大和完善。 一般免疫算法中融合的免疫机理主要有免疫识别、 免疫学习、免疫记忆、克隆选择、多样性等 。基于免疫机理和一些优秀的、相对成熟的进化算法( 如遗 传算法) , 形成了免疫算法的基本框架。免疫算法中, 抗原和抗体之间以及抗体和抗体之间的匹配程 度用亲合度来描述。一般将抗原、抗体、抗原 和抗体之间的亲合度分别对应优化问题的目标函 数、候选解、解与目标函数的匹配程度。相似于生物免疫系统, 免疫算法首先通过对抗原基因类型的初步识别来产生不同的抗体, 而后通过亲合度计算将优秀抗体保存到记忆单元, 并根据亲合度实现抗体进化和调节, 然后重新计算亲合度并循环直至终止条件满足。免疫算法的一般步骤如下 :

步骤 1 抗原识别。

步骤 2 产生初始抗体。

步骤 3 计算亲合度。

步骤 4 记忆单元更新。

步骤 5 抗体生成与调节( 促进和抑制) 。

步骤 6 终止条件判断( 不满足, 则转步骤 3, 否 则结束) 。

2 部分代码

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('负荷')

3 仿真结果

4 参考文献

[1]耿建超. (2017). 基于免疫算法的电动汽车充电站选址优化研究. 中国管理信息化(20), 146-148.

 

  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
模糊算法是一种基于模糊逻辑理论的智能算法,在PID控制器参数求解问题中有着广泛的应用。Matlab是一种集成开发环境,能够方便地实现模糊算法。下面介绍一下如何利用Matlab实现模糊算法求解PID最参数的代码。 首先,在Matlab中数学建模涉及到三个步骤:输入、处理、输出。 输入: 当我们用模糊控制进行PID参数的调整时,需要输入的变量包括目标值、反馈值等。在Matlab中可以定义输入变量并进行模糊化处理。 例如: close_system('fuzzyPID'); %关掉已有的fuzzyPID模型 fis = newfis('fuzzyPID','mamdani','min','max','min','max','none'); %新建fuzzyPID模型 fis = addvar(fis,'input','E',[-10 10]); %加入误差变量 fis = addmf(fis,'input',1,'NB','gaussmf',[0.2 -10]); %NB模糊化处理 fis = addmf(fis,'input',1,'NM','gaussmf',[0.2 -5]); fis = addmf(fis,'input',1,'NS','gaussmf',[0.2 0]); fis = addmf(fis,'input',1,'ZO','gaussmf',[0.2 5]); fis = addmf(fis,'input',1,'PS','gaussmf',[0.2 10]); fis = addmf(fis,'input',1,'PB','gaussmf',[0.2 15]); 处理: 定义好输入变量后,需要处理它们以获得输出。在Matlab中,可以使用模糊化函数fuzzy和模糊控制函数evalfis进行处理。 例如: fuzzy(E); %对输入变量误差E进行模糊化处理 kp = evalfis([E],fis,'output',1); %计算kp输出变量 输出: 计算得出算法的输出变量后,需要将其转化为可视化结果以便进行比较和分析。Matlab中可以使用图形化函数fuzzyset和surf进行可视化。 例如: fuzzyset(fis,'input',1); %对fuzzyPID模型进行可视化 fuzzyset(fis,'output',1); surf(fis,'output',1); %将结果用三维图形可视化 综上所述,在Matlab中实现模糊算法求解PID最参数的代码主要包括输入变量的定义和模糊化处理、处理函数的计算和输出变量的可视化。利用Matlab进行模糊算法求解PID最参数,不仅可以提高算法的准确性,还能够快速地获得可视化结果,方便用户进行比较和分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Matlab科研辅导帮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值