本文共 5241 字,大约阅读时间需要 17 分钟。
1 粒子群算法的概念
粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解. PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数优化、神经网络训练、模糊系统控制以及其他遗传算法的应用领域。2 粒子群算法分析
2.1基本思想 粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。每个粒子在搜索空间中单独的搜寻最优解,并将其记为当前个体极值,并将个体极值与整个粒子群里的其他粒子共享,找到最优的那个个体极值作为整个粒子群的当前全局最优解,粒子群中的所有粒子根据自己找到的当前个体极值和整个粒子群共享的当前全局最优解来调整自己的速度和位置。下面的动图很形象地展示了PSO算法的过程:clc;close allclearload('data4.mat')figure(1)%画障碍图hold onS=(S_coo(2)-0.5)*num_shange+(S_coo(1)+0.5);%起点对应的编号E=(E_coo(2)-0.5)*num_shange+(E_coo(1)+0.5);%终点对应的编号for i=1:num_shange for j=1:num_shange if sign(i,j)==1 y=[i-1,i-1,i,i]; x=[j-1,j,j,j-1]; h=fill(x,y,'k'); set(h,'facealpha',0.5) end s=(num2str((i-1)*num_shange+j)); %text(j-0.95,i-0.5,s,'fontsize',6) endendaxis([0 num_shange 0 num_shange])%限制图的边界plot(S_coo(2),S_coo(1), 'p','markersize', 10,'markerfacecolor','b','MarkerEdgeColor', 'm')%画起点plot(E_coo(2),E_coo(1),'o','markersize', 10,'markerfacecolor','g','MarkerEdgeColor', 'c')%画终点set(gca,'YDir','reverse');%图像翻转for i=1:num_shange plot([0 num_shange],[i-1 i-1],'k-'); plot([i i],[0 num_shange],'k-');%画网格线endPopSize=20;%种群大小OldBestFitness=0;%旧的最优适应度值gen=0;%迭代次数maxgen =20;%最大迭代次数c1=0.5;%认知系数c2=0.7;%社会学习系数w=0.96;%惯性系数%%%初始化路径w_min=0.5;w_max=1;Group=ones(num_point,PopSize); %种群初始化for i=1:PopSize p_lin=randperm(num_point)';%随机生成1*400不重复的行向量 %% 将起点编号放在首位 index=find(p_lin==S); lin=p_lin(1); p_lin(1)=p_lin(index); p_lin(index)=lin; Group(:,i)=p_lin; %%将每个个体进行合理化处理 [Group(:,i),flag]=deal_fun(Group(:,i),num_point,liantong_point,E,num_shange); while flag==1%如处理不成功,则初始化个体,重新处理 p_lin=randperm(num_point)'; index=find(p_lin==S); lin=p_lin(1); p_lin(1)=p_lin(index); p_lin(index)=lin; Group(:,i)=p_lin; [Group(:,i),flag]=deal_fun(Group(:,i),num_point,liantong_point,E,num_shange); endend%最优解route=Group(:,end)';index1=find(route==E);route_lin=route(1:index1);for i=2:index1 Q1=[mod(route_lin(i-1)-1,num_shange)+1-0.5,ceil(route_lin(i-1)/num_shange)-0.5]; Q2=[mod(route_lin(i)-1,num_shange)+1-0.5,ceil(route_lin(i)/num_shange)-0.5]; plot([Q1(1),Q2(1)],[Q1(2),Q2(2)],'b-.','LineWidth',3);hold on endtitle('粒子群算法-随机路线');title('粒子群算法-随机路线');figure(2)hold onfor i=1:num_shange for j=1:num_shange if sign(i,j)==1 y=[i-1,i-1,i,i]; x=[j-1,j,j,j-1]; h=fill(x,y,'k'); set(h,'facealpha',0.5) end s=(num2str((i-1)*num_shange+j)); text(j-0.95,i-0.5,s,'fontsize',6) endendaxis([0 num_shange 0 num_shange])%限制图的边界plot(S_coo(2),S_coo(1), 'p','markersize', 10,'markerfacecolor','b','MarkerEdgeColor', 'm')%画起点plot(E_coo(2),E_coo(1),'o','markersize', 10,'markerfacecolor','g','MarkerEdgeColor', 'c')%画终点set(gca,'YDir','reverse');%图像翻转for i=1:num_shange plot([0 num_shange],[i-1 i-1],'k-'); plot([i i],[0 num_shange],'k-');%画网格线endfor i=2:index1 Q1=[mod(route_lin(i-1)-1,num_shange)+1-0.5,ceil(route_lin(i-1)/num_shange)-0.5]; Q2=[mod(route_lin(i)-1,num_shange)+1-0.5,ceil(route_lin(i)/num_shange)-0.5]; plot([Q1(1),Q2(1)],[Q1(2),Q2(2)],'b-.','LineWidth',3)end%初始化粒子速度(即交换序)Velocity =zeros(num_point,PopSize); for i=1:PopSize Velocity(:,i)=round(rand(1,num_point)'*num_point/10); %round取整end%计算每个个体对应路径的距离for i=1:PopSize EachPathDis(i) = PathDistance(Group(:,i)',E,num_shange);endIndivdualBest=Group;%记录各粒子的个体极值点位置,即个体找到的最短路径IndivdualBestFitness=EachPathDis;%记录最佳适应度值,即个体找到的最短路径的长度[GlobalBestFitness,index]=min(EachPathDis);%找出全局最优值和相应序号%寻优while gen < maxgen w=w_max-(w_max-w_min)*gen/maxgen; %迭代次数递增 gen = gen +1 %更新全局极值点位置,这里指路径 for i=1:PopSize GlobalBest(:,i) = Group(:,index); end %求pij-xij ,pgj-xij交换序,并以概率c1,c2的保留交换序 pij_xij=GenerateChangeNums(Group,IndivdualBest); %根据个体最优解求交换序 pij_xij=HoldByOdds(pij_xij,c1);%以概率c1保留交换序 pgj_xij=GenerateChangeNums(Group,GlobalBest);%根据全局最优解求交换序 pgj_xij=HoldByOdds(pgj_xij,c2);%以概率c2保留交换序 %以概率w保留上一代交换序 Velocity=HoldByOdds(Velocity,w); Group = PathExchange(Group,Velocity); %根据交换序进行路径交换 Group = PathExchange(Group,pij_xij); Group = PathExchange(Group,pgj_xij); for i = 1:PopSize [Group(:,i),flag]=deal_fun(Group(:,i),num_point,liantong_point,E,num_shange); while flag==1 p_lin=randperm(num_point)'; index=find(p_lin==S); lin=p_lin(1); p_lin(1)=p_lin(index); p_lin(index)=lin; Group(:,i)=p_lin; [Group(:,i),flag]=deal_fun(Group(:,i),num_point,liantong_point,E,num_shange); end end for i = 1:PopSize % 更新各路径总距离 EachPathDis(i) = PathDistance(Group(:,i)',E,num_shange); end IsChange = EachPathDis
完整代码或者代写添加QQ 1564658423
转载地址:http://ziqf.baihongyu.com/