粒子群算法详解-附matlab代码说明

合集下载

粒子群_Matlab程序代码

粒子群_Matlab程序代码

粒子群优化算法(panicle swarm optimization ,PSO)是kennedy 和Eberhart 在研究鸟类和鱼类的群体行为基础上于1995年提出的一种群智能算法,其思想米源予人工生命和演化计算理论,模仿鸟群飞行觅食行为,通过鸟集体协作使群体达到最优。

1.粒子群算法的原理PSO 中,每个优化问题的解看作搜索空间中的一只鸟(即粒子),所有的粒子都有一个被优化的函数决定的适应值,并且有一个速度决定它们飞翔的方向和速率,粒子们追随当前的最优粒子在解空间中搜索。

算法首先初始化一群随机粒子,然后通过迭代找到最优解。

在每一次迭代中,粒子通过跟踪两个“极值”即个体极值和全局极值来更新自己的速度与位置。

在D 维目标搜索空间中,由种群数为m 的粒子组成粒子群,其中第f 个粒子在第d 维的位置为Xid ,其飞行速度为Vid ,该粒子当前搜索到的最优位置为Pid(goodvalue)和整个粒子群当前的最优位置Pgd(bestvalue)。

每维的速度与位置更新公式如下112(1)()(1)()(1)id id id id id id v v c rand p x c rand g x ω+=⨯+⨯⨯-+⨯⨯-L 11(2)id id id x x v ++=+LW 为惯性权重,C1和C2为学习因子,rand ()——[0,1]范围内变化的随机数。

2.参数介绍与设置(1)ww 是保持粒子运动惯性的参数,能使种群扩展搜索空间,获得较好的求解效果。

较大的w 有利于群体在更大的范围内进行搜索。

而较小的w 能够保证群体收敛到最优位置,所以w 的选择及在迭代中的变化对搜索能力和跳出局优能力具有重要影响。

一般将w 设定为0.8左右。

(1)加速因子c1和c2c1和c2用于调整粒子自身经验和社会经验在其运动中的作用,表示将每个粒子拉向pbest 和gbest 位置的随机加速项的权重,低的值允许粒子在被拉回前可以在目标区域外徘徊, 而高的值则导致粒子突然冲向或越过目标区域。

粒子群算法matlab程序

粒子群算法matlab程序

粒子群算法matlab程序粒子群算法(PSO)是一种基于群体智能的求解优化问题的算法。

其通过模拟鸟群等大规模群体行为,实现全局搜索和基于群体协作的局部搜索。

在PSO中,通过一组粒子(每个粒子代表一个解)来搜索问题的解空间,在搜索过程中,粒子的位置表示该解在解空间中的位置,速度表示该解在该方向(即属性)上的变化速率,最终达到全局最优解或局部最优解。

PSO算法有着简单易懂、实现简便、计算速度快以及易于与其他算法结合等优点。

下面我将介绍一下如何使用matlab编写简单的粒子群算法程序。

程序主要分为以下步骤:1.初始化在程序开始之前需要对粒子进行初始化操作,其中需要确定粒子群的大小、每个粒子的位置、速度等初始参数。

2.计算适应值计算每个粒子的适应值,即根据当前位置计算该解的适应值。

适应值可以根据实际问题进行定义,如最小化目标函数或最大化收益等。

3.更新粒子速度和位置这一步是PSO算法的核心步骤,通过改变粒子的速度和位置来找到更优的解。

其核心公式为:v(t+1) = w * v(t) + c1 * rand() * (pbest - x(t)) + c2 * rand() * (gbest - x(t)) x(t+1) = x(t) + v(t+1)其中w是惯性权重,c1、c2是学习因子,pbest是该粒子的历史最优解,gbest 是当前全局最优解。

4.更新pbest和gbest在每次更新位置之后需要更新每个粒子自己的历史最优解以及全局最优解。

5.停止条件判断设定停止条件,如最小适应值误差、迭代次数、最大迭代次数等,如果达到了停止条件,则程序结束,输出全局最优解。

下面是一份简单的PSO算法的matlab代码:function [best_fit, best_x] = pso(func, dim, lb, ub, max_iter, swarm_size, w, c1, c2)%初始化粒子v = zeros(swarm_size, dim);x = repmat(lb, swarm_size, 1) + repmat(ub - lb, swarm_size, 1) .* rand(swarm_size, dim);pbest = x;[best_fit, best_idx] = min(func(x));gbest = x(best_idx,:);%开始迭代for iter = 1 : max_iter%更新速度和位置v = w * v + c1 * rand(swarm_size, dim) .* (pbest - x) + c2 * rand(swarm_size, dim) .* repmat(gbest, swarm_size, 1) - x;x = x + v;%边界处理x = max(x, repmat(lb, swarm_size, 1));x = min(x, repmat(ub, swarm_size, 1));%更新pbest和gbestidx = func(x) < func(pbest);pbest(idx,:) = x(idx,:);[min_fit, min_idx] = min(func(pbest));if min_fit < best_fitbest_fit = min_fit;best_x = pbest(min_idx,:);endendend在使用上述代码时,需要定义适应值函数(func)、解空间维度(dim)、每个维度的上界(ub)与下界(lb)、最大迭代次数(max_iter)、粒子群大小(swarm_size)、惯性权重(w)、学习因子(c1、c2)等参数。

整数空间粒子群算法MATLAB程序

整数空间粒子群算法MATLAB程序

整数空间粒子群算法clear allclcticT =1200; %最大迭代次数PopSize=40; %种群大小c1 =2; %学习因子1c2 = 2; %学习因子2w=0.9; %惯性因子NDim = 60; %空间维数for i=1:PopSizefor j=1:NDim %初始化各粒子初始位置,在有效范围内随机选数x(i,j)=round(rand*20) + 20;endendvmax=zeros(PopSize,NDim);for i=1:PopSizefor j=1:NDim %初始化各粒子最大速度,使粒子不能越出边界vmax(i,j)=10;endendv = vmax.*rand( PopSize,NDim);%计算初始各粒子的适应度值for i = 1:PopSizefvalue(i) = youhualianxuduo(x(i,:));endpbest = x; %记录各粒子的个体极值点位置fpbest = fvalue; %记录初始个体最佳适应度值[fbestval,index] = min(fvalue); % 找出全局极值和相应的序号gbest1=fbestval;g1=x(index,:);%浸入主循环,按照公式依次迭代直到满足迭代次数for i=1:Tfor j=1:PopSizeif(youhualianxuduo(x(j,:))<fpbest(j))pbest(j,:)=x(j,:);fpbest(j)=youhualianxuduo(x(j,:));endif (fpbest(j)<gbest1)g1=pbest(j,:);gbest1=fpbest(j);endfor d=1:NDimif pbest(j,d)>x(j,d)a1=0;elsea1=c1*(pbest(j,d)-x(j,d));endif pbest(j,d)>x(j,d)b1=c1*(pbest(j,d)-x(j,d));elseb1=0;endif g1(d)>x(j,d)a2=0;elsea2=c2*(g1(d)-x(j,d));endif g1(d)>x(j,d)b2=c2*(g1(d)-x(j,d));elseb2=0;endR1=randi([a1,b1],1,1);R2=randi([a2,b2],1,1);v(j,d)=round(w*v(j,d))+R1+R2;end%更新速度Vfor n=1:PopSize %速度v的限定,最大值为10 for k=1:NDimif v(n,k)>10v(n,k)=10;endif v(n,k)<-10v(n,k)=-10;endendendx(j,:)=x(j,:)+v(j,:); %更新位置x% 逸出标志for l=1:PopSize % 阻止逸出for m=1:NDimif x(l,m)<1|x(l,m)>40x(l,m)=round(rand*20+20);endendendendw=0.9-i*0.5/Tgb1(i)=gbest1;endfigure(7)plot(gb1);TempStr=sprintf('c1=%g,c2=%g',c1,c2); title(TempStr);xlabel('迭代次数');ylabel('适应度值');toc。

粒子群算法matlab

粒子群算法matlab

粒子群算法matlab本文旨在介绍粒子群算法Matlab。

粒子群算法是一种全局搜索和优化技术,它的目的是通过可重复的迭代搜索来找到搜索空间中的最优解。

本文详细阐述了粒子群算法的基本原理,讨论了它的设计思想和参数设置,以及如何将粒子群算法应用于Matlab中。

最后,本文介绍了若干数值实例,来验证粒子群算法的可行性。

关键词:子群算法;Matlab;全局优化;迭代搜索1.论粒子群算法(Particle Swarm Optimization,PSO)是一种动态优化算法,它能自动识别全局最优解。

它结合了群众智慧和机器学习,是一种运用群体智能手段实现全局优化的有效方法。

由于其计算代价低廉,计算时间短,解决问题效果良好,因此得到了广泛的应用。

Matlab是屡获殊荣的数值计算软件,它能够对各类数据进行可视化分析和仿真模拟。

由于Matlab具有丰富的工具箱,可以快速准确地解决复杂的科学问题,因此它已经成为科学计算的标准软件。

本文将主要介绍如何将粒子群算法应用于Matlab中。

2.法原理粒子群算法是由Kennedy和Eberhart在1995年提出的,它也被称为Zebra算法,是建立在群体智能概念上的,由群体中全局优化算法之一。

粒子群算法以群体中的每个个体的最优位置和最优速度为基础,通过可重复的迭代搜索来找到搜索空间中的最优解。

算法的设计基本思想是:建立一组虚拟粒子,每个粒子代表一个可能的解决方案,每个粒子有一个位置和一个速度。

算法通过不断迭代,让这些粒子像鱼群一样游动,从而找到最优解。

3.法设计粒子群算法由三个参数组成:全局最优系数(cg)、社会系数(cs)和惯性权重(w)。

cg和cs是粒子群算法的两个基本系数,它们分别代表了粒子群对全局最优和社会最优的响应程度。

w是惯性权重,它代表了粒子群对历史最优位置的惯性搜索能力。

通常情况下,系数cg和w会在一定范围内不断变化,使得算法能够更快地找到最优解。

4. Matlab实现为了在Matlab中实现粒子群算法,需要对Matlab的调用进行必要的设置。

改进粒子群算法matlab代码

改进粒子群算法matlab代码

改进粒子群算法matlab代码粒子群算法是一种基于群体智能的优化算法,其主要思想是将优化问题转化为粒子在搜索空间中寻找最优解的过程。

粒子群算法的运作方式是通过定义一群随机粒子,并根据它们在搜索空间中的位置和速度,来引导粒子向着更好的解决方案进行搜索。

以下是改进版粒子群算法的MATLAB代码:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 粒子群算法-改进版%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 初始化参数和粒子群function [gbest_x, gbest_y] = PSO(num_particles,max_iterations, f, lower_bound, upper_bound)% 定义粒子群基本参数w = 0.7; % 惯性权重c1 = 1.4; % 学习因子1c2 = 1.4; % 学习因子2% 初始化粒子位置和速度particles_position = unifrnd(lower_bound, upper_bound, [num_particles, 2]);particles_velocity = zeros(num_particles, 2);% 初始化个体最优解和全局最优解pbest_position = particles_position;pbest_value = zeros(num_particles, 1);for i = 1:num_particlespbest_value(i) = f(particles_position(i,:));end[global_min_value, global_min_index] = min(pbest_value); gbest_position = particles_position(global_min_index, :);gbest_value = global_min_value;% 迭代优化for iter = 1:max_iterationsfor i = 1:num_particles% 更新粒子速度particles_velocity(i,:) = w *particles_velocity(i,:) ...+ c1 * rand() * (pbest_position(i,:) -particles_position(i,:)) ...+ c2 * rand() * (gbest_position -particles_position(i,:));% 限制粒子速度范围particles_velocity(i,1) = max(particles_velocity(i,1), lower_bound);particles_velocity(i,1) = min(particles_velocity(i,1), upper_bound);particles_velocity(i,2) = max(particles_velocity(i,2), lower_bound);particles_velocity(i,2) = min(particles_velocity(i,2), upper_bound);% 更新粒子位置particles_position(i,:) = particles_position(i,:) + particles_velocity(i,:);% 限制粒子位置范围particles_position(i,1) = max(particles_position(i,1), lower_bound);particles_position(i,1) = min(particles_position(i,1),upper_bound);particles_position(i,2) = max(particles_position(i,2), lower_bound);particles_position(i,2) = min(particles_position(i,2), upper_bound);% 更新个体最优解temp_value = f(particles_position(i,:));if temp_value < pbest_value(i)pbest_value(i) = temp_value;pbest_position(i,:) = particles_position(i,:);endend% 更新全局最优解[temp_min_value, temp_min_index] = min(pbest_value);if temp_min_value < gbest_valuegbest_value = temp_min_value;gbest_position = pbest_position(temp_min_index,:);endend% 返回全局最优解gbest_x = gbest_position(1);gbest_y = gbest_position(2);end其中,num_particles为粒子数目,max_iterations为最大迭代次数,f为目标函数句柄,lower_bound和upper_bound为搜索空间的下界和上界。

(完整word版)用MATLAB编写PSO算法及实例

(完整word版)用MATLAB编写PSO算法及实例

用MATLAB 编写PSO 算法及实例1.1 粒子群算法PSO 从这种模型中得到启示并用于解决优化问题。

PSO 中,每个优化问题的潜在解都是搜索空间中的一只鸟,称之为粒子。

所有的粒子都有一个由被优化的函数决定的适值( fitness value) ,每个粒子还有一个速度决定它们飞翔的方向和距离。

然后粒子们就追随当前的最优粒子在解空间中搜索。

PSO 初始化为一群随机粒子(随机解),然后通过迭代找到最优解。

在每一次迭代中,粒子通过跟踪两个极值来更新自己;第一个就是粒子本身所找到的最优解,这个解称为个体极值;另一个极值是整个种群目前找到的最优解,这个极值是全局极值。

另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。

假设在一个维的目标搜索空间中,有个粒子组成一个群落,其中第个粒子表示为一个维的向量,。

第个粒子的“飞行 ”速度也是一个维的向量,记为,。

第个粒子迄今为止搜索到的最优位置称为个体极值,记为,。

整个粒子群迄今为止搜索到的最优位置为全局极值,记为在找到这两个最优值时,粒子根据如下的公式(1.1)和( 1.2)来更新自己的速度和位置:(1.1) (1. 2)其中:和为学习因子,也称加速常数(acceleration constant),和为[0,1]范围内的均匀随机数。

式(1.1)右边由三部分组成,第一部分为“惯性(inertia)”或“动量(momentum)”部分,反映了粒子的运动“习惯(habit)”,代表粒子有维持自己D N i D ),,,(21iD i i i x x x X N i ,,2,1 i D ),,21i iD i i v v v V ,( 3,2,1 i i ),,,(21iD i i best p p p p N i ,,2,1 ),,,(21gD g g best p p p g )(2211id gd id id id id x p r c x p r c v w v id id id v x x 1c 2c 1r 2r先前速度的趋势;第二部分为“认知(cognition)”部分,反映了粒子对自身历史经验的记忆(memory)或回忆(remembrance),代表粒子有向自身历史最佳位置逼近的趋势;第三部分为“社会(social)”部分,反映了粒子间协同合作与知识共享的群体历史经验。

粒子群算法解决VRP代码(matlab)

粒子群算法解决VRP代码(matlab)

粒子群算法解决VRP代码(matlab)particle_swarm_optimization.m文件:function PSOforTSP%初始化Alpha=0.25; %个体经验保留概率Beta=0.25; %全局经验保留概率NC_max=100; %最大迭代次数m=80; %微粒数CityNum=14; %问题的规模(城市个数)[dislist,Clist]=tsp(CityNum);NC=1;%迭代计数器R_best=zeros(NC_max,CityNum); %各代最佳路线L_best=inf.*ones(NC_max,1);%各代最佳路线的长度L_ave=zeros(NC_max,1);%各代路线的平均长度%产生微粒的初始位置for i=1:mx(i,:)=randperm(CityNum);L(i)=CalDist(dislist,x(i,:));endp=x; %p为个体最好解pL=L;[L_best(1,1) n_best]=min(L);R_best(1,:)=x(n_best,:);L_ave(1,1)=mean(L);%初始交换序v=ones(CityNum-1,2,m)*(round(rand*(CityNum-1))+1);figure(1);while NC<=NC_max %停止条件之一:达到最大迭代次数for i=1:mxnew(i,:)=changeFun(x(i,:),v(:,:,i));A=changeNum(x(i,:),p(i,:));Arand=randFun(A,Alpha);xnew(i,:)=changeFun(xnew(i,:),Arand);B=changeNum(x(i,:),R_best(NC,:));Brand=randFun(B,Beta);xnew(i,:)=changeFun(xnew(i,:),Brand);v(:,:,i)=changeNum(x(i,:),xnew(i,:));L(i)=CalDist(dislist,xnew(i,:));if L(i)<pl(i)< p="">p(i,:)=xnew(i,:);pL(i)=L(i);endend[L_bestnew n_best]=min(L);R_bestnew=xnew(n_best,:);L_ave(NC+1,1)=mean(L);if L_bestnew<l_best(nc,1)< p="">L_best(NC+1,1)=L_bestnew;R_best(NC+1,:)=R_bestnew;elseL_best(NC+1,1)=L_best(NC,1);R_best(NC+1,:)=R_best(NC,:);endx=xnew;drawTSP10(Clist,R_best(NC,:),L_best(NC,1),NC,0); %pause;NC=NC+1;end%输出结果Pos=find(L_best==min(L_best));Shortest_Route=R_best(Pos(1),:);Shortest_Length=L_best(Pos(1)); figure(2);plot([L_best L_ave]);legend('最短距离','平均距离'); endfunction xnew=changeFun(x,C); changeLen=size(C,1);xnew=x;for i=1:changeLena=xnew(C(i,1));xnew(C(i,1))=xnew(C(i,2));xnew(C(i,2))=a;endendfunction C=changeNum(x,y); CityNum=size(x,2);C=ones(CityNum-1,2);for i=1:CityNum-1pos=find(x==y(i));C(i,:)=[i pos];x=changeFun(x,C(i,:));endendfunction v=randFun(v,w);randLen=size(v,1);for i=1:randLenif rand>wv(i,2)=v(i,1);endendendfunction F=CalDist(dislist,s)%计算回路路径距离DistanV=0;n=size(s,2);for i=1:(n-1)DistanV=DistanV+dislist(s(i),s(i+1));endDistanV=DistanV+dislist(s(n),s(1));F=DistanV;endfunction [DLn,cityn]=tsp(n)city14=[0 0;0.3 0.334;0.08 0.433;0.166 0.456;0.5 0.4439;0.2439 0.1463;0.1207 0.2293;0.2293 0.761;0.6171 0.9414;0.8732 0.6536;0.6878 0.5219;0.8488 0.3609;0.6683 0.2536;0.6195 0.2634];for i=1:14for j=1:14DL14(i,j)=((city14(i,1)-city14(j,1))^2+(city14(i,2)-city14(j,2))^2)^0.5;endendDLn=DL14;cityn=city14;enddrawTSP10.m文件:function m=drawTSP(Clist,BSF,bsf,p,f)CityNum=size(Clist,1);for i=1:CityNum-1plot([Clist(BSF(i),1),Clist(BSF(i+1),1)],[Clist(BSF(i),2),Clist(BSF(i +1),2)],'ms-','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g');hold on;endaxis([0,1,0,1]);plot([Clist(BSF(CityNum),1),Clist(BSF(1),1)],[Clist(BSF(CityNu m),2),Clist(BSF(1), 2)],'ms-','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g');title([num2str(CityNum),'城市TSP']);if f==0text(0.1,0.1,['第',int2str(p),' 步',' 最短距离为',num2str(bsf)]);elsetext(0.1,0.1,['最终搜索结果:最短距离',num2str(bsf)]);endhold off;pause(0.05);</l_best(nc,1)<></pl(i)<>。

粒子群算法 matlab源代码

粒子群算法  matlab源代码

%相关参数的设置UB=600; %函数的上界LB=300; %函数的下界PopSize=40; %种群的大小Dim=10; %微粒的维数c1=2; %学习因子c2=2; %学习因子w_start=0.9;%惯性权重的开始值w_end=0.4;%惯性权重的最后值Vmax=100;%微粒的最大速度MaxIter=1500;%最大迭代次数Iter=0;%初始迭代次数%初始化群和速度X=rand(PopSize,Dim)*(UB-LB)+LB;%微粒位置随机初始化V=rand(PopSize,Dim);%微粒速度随机初始化;%测试函数:Griewank函数ind=repmat(1:Dim,PopSize,1);FX=sum(((X.^2)/4000)')'- prod(cos(X./sqrt(ind))')'+1;%设定当前位置为粒子的最好位置,并记录其最好值PBest=X;FPBest=FX;%找到初始微粒群体的最好微粒[Fgbest,r]=min(FX);CF=Fgbest;%记录当前全局最优值Best=X(r,:);%用于保存最优粒子的位置FBest=Fgbest;%循环while(Iter<=MaxIter)Iter=Iter+1;%更新惯性权重的值;w_now=((w_start-w_end)*(MaxIter-Iter)/MaxIter)+w_end;A=repmat(X(r,:),PopSize,1);%生成随机数R1=rand(PopSize,Dim);R2=rand(PopSize,Dim);%速度更新V=w_now*V+c1*R1.*(PBest-X)+c2*R2.*(A-X);%对进化后速度大于最大速度的微粒进行处理changeRows=V>Vmax;VStep(find(changeRows))=Vmax;%对进化后速度小雨最小速度的微粒进行处理changeRows=V<-Vmax;V(find(changeRows))=-Vmax;%微粒位置进行更新X=X+1.0*V;%重新计算新位置的适应度值ind=repmat(1:Dim,PopSize,1);FX=sum(((X.^2)/4000)')'- prod(cos(X./sqrt(ind))')'+1;%更新每个微粒的最好位置P=FX<FPBest;FPBest(find(P))=FX(find(P));%适应值更换PBest(find(P),:)=X(find(P),:)%粒子位置更换[Fgbest,g]=min(FPBest);%保存最好适应值if Fgbest<CF %如果本次适应值好于上次则保存[fBest,b]=min(FPBest);%最好适应值为fBestBest=PBest(b,:);%最好位置为BestendCF=Fgbest;%保留本次适应值准备与下次比较end %循环结束。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

粒子群算法(1)----粒子群算法简介一、粒子群算法的历史粒子群算法源于复杂适应系统(Complex Adaptive System,CAS)。

CAS理论于1994年正式提出,CAS中的成员称为主体。

比如研究鸟群系统,每个鸟在这个系统中就称为主体。

主体有适应性,它能够与环境及其他的主体进行交流,并且根据交流的过程“学习”或“积累经验”改变自身结构与行为。

整个系统的演变或进化包括:新层次的产生(小鸟的出生);分化和多样性的出现(鸟群中的鸟分成许多小的群);新的主题的出现(鸟寻找食物过程中,不断发现新的食物)。

所以CAS系统中的主体具有4个基本特点(这些特点是粒子群算法发展变化的依据):首先,主体是主动的、活动的。

主体与环境及其他主体是相互影响、相互作用的,这种影响是系统发展变化的主要动力。

环境的影响是宏观的,主体之间的影响是微观的,宏观与微观要有机结合。

最后,整个系统可能还要受一些随机因素的影响。

粒子群算法就是对一个CAS系统---鸟群社会系统的研究得出的。

粒子群算法(Particle Swarm Optimization, PSO)最早是由Eberhart和Kennedy于1995年提出,它的基本概念源于对鸟群觅食行为的研究。

设想这样一个场景:一群鸟在随机搜寻食物,在这个区域里只有一块食物,所有的鸟都不知道食物在哪里,但是它们知道当前的位置离食物还有多远。

那么找到食物的最优策略是什么呢?最简单有效的就是搜寻目前离食物最近的鸟的周围区域。

PSO算法就从这种生物种群行为特性中得到启发并用于求解优化问题。

在PSO中,每个优化问题的潜在解都可以想象成d维搜索空间上的一个点,我们称之为“粒子”(Particle),所有的粒子都有一个被目标函数决定的适应值(Fitness Value ),每个粒子还有一个速度决定他们飞翔的方向和距离,然后粒子们就追随当前的最优粒子在解空间中搜索。

Reynolds对鸟群飞行的研究发现。

鸟仅仅是追踪它有限数量的邻居但最终的整体结果是整个鸟群好像在一个中心的控制之下.即复杂的全局行为是由简单规则的相互作用引起的。

二、粒子群算法的具体表述上面罗嗦了半天,那些都是科研工作者写论文的语气,不过,PSO的历史就像上面说的那样。

下面通俗的解释PSO算法。

PSO算法就是模拟一群鸟寻找食物的过程,每个鸟就是PSO中的粒子,也就是我们需要求解问题的可能解,这些鸟在寻找食物的过程中,不停改变自己在空中飞行的位置与速度。

大家也可以观察一下,鸟群在寻找食物的过程中,开始鸟群比较分散,逐渐这些鸟就会聚成一群,这个群忽高忽低、忽左忽右,直到最后找到食物。

这个过程我们转化为一个数学问题。

寻找函数y=1-cos(3*x)*exp(-x)的在[0,4]最大值。

该函数的图形如下:当x=0.9350-0.9450,达到最大值y=1.3706。

为了得到该函数的最大值,我们在[0,4]之间随机的洒一些点,为了演示,我们放置两个点,并且计算这两个点的函数值,同时给这两个点设置在[0,4]之间的一个速度。

下面这些点就会按照一定的公式更改自己的位置,到达新位置后,再计算这两个点的值,然后再按照一定的公式更新自己的位置。

直到最后在y=1.3706这个点停止自己的更新。

这个过程与粒子群算法作为对照如下:这两个点就是粒子群算法中的粒子。

该函数的最大值就是鸟群中的食物计算两个点函数值就是粒子群算法中的适应值,计算用的函数就是粒子群算法中的适应度函数。

更新自己位置的一定公式就是粒子群算法中的位置速度更新公式。

下面演示一下这个算法运行一次的大概过程:第一次初始化第一次更新位置第二次更新位置第21次更新最后的结果(30次迭代)最后所有的点都集中在最大值的地方。

粒子群算法(2)----标准的粒子群算法在上一节的叙述中,唯一没有给大家介绍的就是函数的这些随机的点(粒子)是如何运动的,只是说按照一定的公式更新。

这个公式就是粒子群算法中的位置速度更新公式。

下面就介绍这个公式是什么。

在上一节中我们求取函数y=1-cos(3*x)*exp(-x)的在[0,4]最大值。

并在[0,4]之间放置了两个随机的点,这些点的坐标假设为x1=1.5;x2=2.5;这里的点是一个标量,但是我们经常遇到的问题可能是更一般的情况--x为一个矢量的情况,比如二维的情况z=2*x1+3*x22的情况。

这个时候我们的每个粒子为二维,记粒子P1=(x11,x12),P2=(x21,x22),P3=(x31,x32),......Pn=(xn1,xn2)。

这里n为粒子群群体的规模,也就是这个群中粒子的个数,每个粒子的维数为2。

更一般的是粒子的维数为q,这样在这个种群中有n个粒子,每个粒子为q 维。

由n个粒子组成的群体对Q维(就是每个粒子的维数)空间进行搜索。

每个粒子表示为:x i=(x i1,x i2,x i3,...,x iQ),每个粒子对应的速度可以表示为v i=(v i1,v i2,v i3,....,v iQ),每个粒子在搜索时要考虑两个因素:1。

自己搜索到的历史最优值p i ,p i=(p i1,p i2,....,p iQ),i=1,2,3,....,n。

2。

全部粒子搜索到的最优值p g,p g=(p g1,p g2,....,p gQ),注意这里的p g只有一个。

下面给出粒子群算法的位置速度更新公式:这里有几个重要的参数需要大家记忆,因为在以后的讲解中将会经常用到:它们是:是保持原来速度的系数,所以叫做惯性权重。

是粒子跟踪自己历史最优值的权重系数,它表示粒子自身的认识,所以叫“认知”。

通常设置为2。

是粒子跟踪群体最优值的权重系数,它表示粒子对整个群体知识的认识,所以叫做“社会知识”,经常叫做“社会”。

通常设置为2。

是[0,1]区间内均匀分布的随机数。

是对位置更新的时候,在速度前面加的一个系数,这个系数我们叫做约束因子。

通常设置为1。

这样一个标准的粒子群算法就结束了。

下面对整个基本的粒子群的过程给一个简单的图形表示:判断终止条件可是设置适应值到达一定的数值或者循环一定的次数。

注意:这里的粒子是同时跟踪自己的历史最优值与全局(群体)最优值来改变自己的位置预速度的,所以又叫做全局版本的标准粒子群优化算法。

粒子群算法(3)----标准的粒子群算法(局部版本)在全局版的标准粒子群算法中,每个粒子的速度的更新是根据两个因素来变化的,这两个因素是:1. 粒子自己历史最优值p i。

2. 粒子群体的全局最优值p g。

如果改变粒子速度更新公式,让每个粒子的速度的更新根据以下两个因素更新,A. 粒子自己历史最优值p i。

B. 粒子邻域内粒子的最优值pn k。

其余保持跟全局版的标准粒子群算法一样,这个算法就变为局部版的粒子群算法。

一般一个粒子i 的邻域随着迭代次数的增加而逐渐增加,开始第一次迭代,它的邻域为0,随着迭代次数邻域线性变大,最后邻域扩展到整个粒子群,这时就变成全局版本的粒子群算法了。

经过实践证明:全局版本的粒子群算法收敛速度快,但是容易陷入局部最优。

局部版本的粒子群算法收敛速度慢,但是很难陷入局部最优。

现在的粒子群算法大都在收敛速度与摆脱局部最优这两个方面下功夫。

其实这两个方面是矛盾的。

看如何更好的折中了。

根据取邻域的方式的不同,局部版本的粒子群算法有很多不同的实现方法。

第一种方法:按照粒子的编号取粒子的邻域,取法有四种:1,环形取法2,随机环形取法3,轮形取法4,随机轮形取法。

1环形 2 随机环形3 轮形4随机轮形因为后面有以环形取法实现的算法,对环形取法在这里做一点点说明:以粒子1为例,当邻域是0的时候,邻域是它本身,当邻域是1时,邻域为2,8;当邻域是2时,邻域是2,3,7,8;......,以此类推,一直到邻域为4,这个时候,邻域扩展到整个例子群体。

据文献介绍(国外的文献),采用轮形拓扑结构,PSO的效果很好。

第二种方法:按照粒子的欧式距离取粒子的邻域在第一种方法中,按照粒子的编号来得到粒子的邻域,但是这些粒子其实可能在实际位置上并不相邻,于是Suganthan提出基于空间距离的划分方案,在迭代中计算每一个粒子与群中其他粒子的距离。

记录任何2个粒子间的的最大距离为dm。

对每一粒子按照||x a-x b||/dm计算一个比值。

其中||x a-x b||是当前粒子a到b的距离。

而选择阈值frac 根据迭代次数而变化。

当另一粒子b满足||x a-x b||/dm<frac时,认为b成为当前粒子的邻域。

这种办法经过实验,取得较好的应用效果,但是由于要计算所有粒子之间的距离,计算量大,且需要很大的存储空间,所以,该方法一般不经常使用。

粒子群算法(4)----粒子群算法分类粒子群算法主要分为4个大的分支:(1)标准粒子群算法的变形在这个分支中,主要是对标准粒子群算法的惯性因子、收敛因子(约束因子)、“认知”部分的c1,“社会”部分的c2进行变化与调节,希望获得好的效果。

惯性因子的原始版本是保持不变的,后来有人提出随着算法迭代的进行,惯性因子需要逐渐减小的思想。

算法开始阶段,大的惯性因子可以是算法不容易陷入局部最优,到算法的后期,小的惯性因子可以使收敛速度加快,使收敛更加平稳,不至于出现振荡现象。

经过本人测试,动态的减小惯性因子w,的确可以使算法更加稳定,效果比较好。

但是递减惯性因子采用什么样的方法呢?人们首先想到的是线型递减,这种策略的确很好,但是是不是最优的呢?于是有人对递减的策略作了研究,研究结果指出:线型函数的递减优于凸函数的递减策略,但是凹函数的递减策略又优于线型的递减,经过本人测试,实验结果基本符合这个结论,但是效果不是很明显。

对于收敛因子,经过证明如果收敛因子取0.729,可以确保算法的收敛,但是不能保证算法收敛到全局最优,经过本人测试,取收敛因子为0.729效果较好。

对于社会与认知的系数c2,c1也有人提出:c1先大后小,而c2先小后大的思想,因为在算法运行初期,每个鸟要有大的自己的认知部分而又比较小的社会部分,这个与我们自己一群人找东西的情形比较接近,因为在我们找东西的初期,我们基本依靠自己的知识取寻找,而后来,我们积累的经验越来越丰富,于是大家开始逐渐达成共识(社会知识),这样我们就开始依靠社会知识来寻找东西了。

2007年希腊的两位学者提出将收敛速度比较快的全局版本的粒子群算法与不容易陷入局部最优的局部版本的粒子群算法相结合的办法,利用的公式是v=n*v(全局版本)+(1-n)*v(局部版本)速度更新公式,v代表速度w(k+1)=w(k)+v位置更新公式该算法在文献中讨论了系数n取各种不同情况的情况,并且运行来了20000次来分析各种系数的结果。

(2)粒子群算法的混合这个分支主要是将粒子群算法与各种算法相混合,有人将它与模拟退火算法相混合,有些人将它与单纯形方法相混合。

相关文档
最新文档