PSO标准算法其中wc1c2a可以改变%包含初始化函数迭代函数还有总体的PSO算法函数function[Result,OnLine,OffLine,MinMaxMeanAdapt]=PSO_Stand(SwarmSize,ParticleSize,ParticleScope,IsStep,IsDraw,LoopCount,IsPlot)%function[Result,OnLine,OffLine,MinMaxMeanAdapt]=PSO_Stand(SwarmSize,ParticleSize,ParticleScope,InitFunc,StepFindFunc,AdaptFunc,IsStep,IsDraw,LoopCount,IsPlot)%功能描述:一个循环n次的PSO算法完整过程,返回这次运行的最小与最大的平均适应度,以及在线性能与离线性能%[Result,OnLine,OffLine,MinMaxMeanAdapt]=PsoProcess(SwarmSize,ParticleSize,ParticleScope,InitFunc,StepFindFunc,AdaptFunc,IsStep,IsDraw,LoopCount,IsPlot)%输入参数:SwarmSize:种群大小的个数%输入参数:ParticleSize:一个粒子的维数%输入参数:ParticleScope:一个粒子在运算中各维的范围;%ParticleScope格式:%3维粒子的ParticleScope格式:%[x1Min,x1Max%x2Min,x2Max%x3Min,x3Max]%%输入参数:InitFunc:初始化粒子群函数%输入参数:StepFindFunc:单步更新速度,位置函数%输入参数:AdaptFunc:适应度函数%输入参数:IsStep:是否每次迭代暂停;IsStep=0,不暂停,否则暂停。缺省不暂停%输入参数:IsDraw:是否图形化迭代过程;IsDraw=0,不图形化迭代过程,否则,图形化表示。缺省不图形化表示%输入参数:LoopCount:迭代的次数;缺省迭代100次%输入参数:IsPlot:控制是否绘制在线性能与离线性能的图形表示;IsPlot=0,不显示;%IsPlot=1;显示图形结果。缺省IsPlot=1%返回值:Result为经过迭代后得到的最优解%返回值:OnLine为在线性能的数据%返回值:OffLine为离线性能的数据%返回值:MinMaxMeanAdapt为本次完整迭代得到的最小与最大的平均适应度%%用法[Result,OnLine,OffLine,MinMaxMeanAdapt]=PsoProcess(SwarmSize,ParticleSize,ParticleScope,InitFunc,StepFindFunc,AdaptFunc,IsStep,IsDraw,LoopCount,IsPlot);%%异常:首先保证该文件在Matlab的搜索路径中,然后查看相关的提示信息。%%编制人:XXX%编制时间:2007.3.26%添加MinMaxMeanAdapt,以得到性能评估数据%修改时间:2012.12.12%容错控制ifnargin3%ifnargin4error('输入的参数个数错误。')end[row,colum]=size(ParticleSize);ifrow1||colum1error('输入的粒子的维数错误,是一个1行1列的数据。');end[row,colum]=size(ParticleScope);ifrow~=ParticleSize||colum~=2error('输入的粒子的维数范围错误。');end%设置缺省值ifnargin4%ifnargin7IsPlot=1;LoopCount=100;IsStep=0;IsDraw=0;%elseifnargin8elseifnargin5IsPlot=1;IsDraw=0;LoopCount=100;%elseifnargin9elseifnargin6LoopCount=100;IsPlot=1;%elseifnargin10elseifnargin7IsPlot=1;end%控制是否显示2维以下粒子维数的寻找最优的过程%ifIsDraw~=0%DrawObjGraphic(ParticleSize,ParticleScope,AdaptFunc);%end%初始化种群%[ParSwarm,OptSwarm]=InitFunc(SwarmSize,ParticleSize,ParticleScope,AdaptFunc);[ParSwarm,OptSwarm]=InitSwarm(SwarmSize,ParticleSize,ParticleScope);%在测试函数图形上绘制初始化群的位置ifIsDraw~=0if1==ParticleSizeforParSwarmRow=1:SwarmSizeplot([ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,1)],[ParSwarm(ParSwarmRow,3),0],'r*-','markersize',8);text(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,3),num2str(ParSwarmRow));%在图形中加注释endendif2==ParticleSizeforParSwarmRow=1:SwarmSizestem3(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,2),ParSwarm(ParSwarmRow,5),'r.','markersize',8);%绘制3D图形endendend%暂停让抓图ifIsStep~=0disp('开始迭代,按任意键:')pauseend%开始更新算法的调用fork=1:LoopCount%显示迭代的次数:disp('----------------------------------------------------------')TempStr=sprintf('第%g次迭代',k);disp(TempStr);disp('----------------------------------------------------------')%调用一步迭代的算法%[ParSwarm,OptSwarm]=StepFindFunc(ParSwarm,OptSwarm,AdaptFunc,ParticleScope,0.95,0.4,LoopCount,k);[ParSwarm,OptSwarm]=BaseStepPso(ParSwarm,OptSwarm,ParticleScope,0.95,0.4,LoopCount,k);%在目标函数的图形上绘制2维以下的粒子的新位置ifIsDraw~=0if1==ParticleSizeforParSwarmRow=1:SwarmSizeplot([ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,1)],[ParSwarm(ParSwarmRow,3),0],'r*-','markersize',8);text(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,3),num2str(ParSwarmRow));endendif2==ParticleSizeforParSwarmRow=1:SwarmSizestem3(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,2),ParSwarm(ParSwarmRow,5),'r.','markersize',8);endendendXResult=OptSwarm(SwarmSize+1,1:ParticleSize);%存取本次迭代得到的全局最优值YResult=AdaptFunc(XResult);%计算全局最优值对应的粒子的适应度值ifIsStep~=0%XResult=OptSwarm(SwarmSize+1,1:ParticleSize);%YResult=AdaptFunc(XResult);str=sprintf('%g步迭代的最优目标函数值%g',k,YResult);disp(str);disp('下次迭代,按任意键继续');pauseend%记录每一步的平均适应度MeanAdapt(1,k)=mean(ParSwarm(:,2*ParticleSize+1));%mean函数为取有效值函数end%for循环结束标志%记录最小与最大的平均适应度MinMaxMeanAdapt=[min(MeanAdapt),max(MeanAdapt)];%计算离线与在线性能fork=1:LoopCountOnLine(1,k)=sum(MeanAdapt(1,1:k))/k;%求取在线性能的数据OffLine(1,k)=max(MeanAdapt(1,1:k));endfork=1:LoopCountOffLine(1,k)=sum(OffLine(1,1:k))/k;%求取离线性能的数据end%绘制离线性能与在线性能曲线%subplot(m,n,p);%将图形窗口分成m行n列的子窗口,序号为p的子窗口为当前窗口if1==IsPlotsubplot(1,2,1);%figureholdontitle('离线性能曲线图')xlabel('迭代次数');ylabel('离线性能');gridonplot(OffLine);subplot(1,2,2);%figureholdontitle('在线性能曲线图')xlabel('迭代次数');ylabel('在线性能');gridonplot(OnLine);end%记录本次迭代得到的最优值适应度值XResult=OptSwarm(SwarmSize+1,1:ParticleSize);YResult=AdaptFunc(XResult);Result=[XResult,YResult];%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%适应度函数functiony=AdaptFunc(x)%Griewan函数%输入x,给出相应的y值,在x=(0,0,…,0)处有全局极小点0.%编制人:Jeary%编制日期:2010.12.12[row,col]=size(x);ifrow1error('适应度函数:输入的参数错误');endy1=1/4000*sum(x.^2);y2=1;forh=1:coly2=y2*cos(x(h)/sqrt(h));endy=y1-y2+1;y=-y;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%初始化粒子群函数function[ParSwarm,OptSwarm]=InitSwarm(SwarmSize,ParticleSize,ParticleScope)%function[ParSwarm,OptSwarm]=InitSwarm(SwarmSize,ParticleSize,ParticleScope,AdaptFunc)%功能描述:初始化粒子群,限定粒子群的位置以及速度在指定的范围内%[ParSwarm,OptSwarm,BadSwarm]=InitSwarm(SwarmSize,ParticleSize,ParticleScope,AdaptFunc)%%输入参数:SwarmSize:种群大小的个数%