首页 > 编程知识 正文

用什么方法可以使油水混合,粒子群算法改进

时间:2023-05-03 21:22:24 阅读:61169 作者:2659

混合粒子群算法将全局粒子群算法和局部粒子群算法相结合,其速度更新采用公式

其中G(k 1是全局版本的速度更新表达式,L(k 1是本地版本的速度更新表达式,混合粒子群算法采用H(k 1)的表达式。

位置更新式

由于本地版本和全局版本的组合,因此粒子群的初始化函数必须与本地版本相同,但这里不列出。 请参阅粒子群算法(7)的LocalInitSwarm函数。

重要的是混合粒子群算法的单步更新函数,函数名为HybridStepPso

代码如下。

function [ParSwarm,optswarm ]=hybridsteppso (par swarm,opt swarm,AdaptFunc,ParticleScope,MaxW,MinW,LoopCount,) 的基本粒子群算法的单步更新位置、速度算法%%[ParSwarm,optswarm ]=localsteppsobycircle (par swarm,opt swarm,AdaptFunc,partical curcount(%%算法思想:全局版本速度更新公式: VQ(k1 )=w*v ) k ) C1*R1* ) pg-w ) C2* ) pq-w ) %pg是个体历史上最好的, pq是全局最好的%本地版本速度更新公式: VL ) ) w n是从0到1的百分之几输入参数: ParSwarm:粒子群矩阵、粒子位置、速度和当前目标函数值%输入参数: OptSwarm :粒子群个体最优解%输入参数: AdaptFunc :自适应函数%输入参数: LoopCount :迭代总数%输入参数: CurCount :当前迭代次数%%返回值:包含与输入同名的参数的%%用法: [ ParticleScope、MaxW、MinW、LoopCount、CurCount ) %%异常:首先确保此文件位于Matlab的搜索路径中,然后查看相关提示信息。 %%作者,XXX%创建时间,2010.5.6%参考文献,XXX%%修改记录----------------------1 ).* * 1 )随机数可以大大提高性能修正混合因子(从小到大修正CurCount/LoopCount至C1=2.05 ),在C2=2.05%修正速度范围时, 区间每个维度范围的0.5 (一半)请参考MATLAB粒子群优化算法的编程%%综合评价:使用此版本的调节系数,可以有效地实现%%容错控制ifnargin(=8error ) '。 (endifnargout )=2error )输出数量太少,无法保证循环迭代。 ' (结束)开始单步更新操作(************* 可以更改惯性因子的变化------------------------------------- -以更改以下代码-----------------请参阅%*****上的代码更改惯性因子的变化* * * * * * * * * * * * * * * * * * * * * * * *。

t/LoopCount;%-----------------------------------------------% 得到粒子群群体大小以及一个粒子维数的信息[ParRow,ParCol]=size(ParSwarm);%得到粒子的维数ParCol=(ParCol-1)/2;GlobleSubTract1=OptSwarm(1:ParRow,:)-ParSwarm(:,1:ParCol);%粒子自身历史最优解位置减去粒子当前位置LocalSubTract1=OptSwarm(1:ParRow,:)-ParSwarm(:,1:ParCol);%粒子自身历史最优解位置减去粒子当前位置LocalSubTract2=OptSwarm(ParRow+1:end-1,:)-ParSwarm(:,1:ParCol);%粒子邻域最优解位置减去粒子当前位置%*********************************************%***** 更改下面的代码,可以更改c1,c2的变化*****c1=2.05;c2=2.05;%---------------------------------------------------------------------%con=1;%c1=4-exp(-con*abs(mean(ParSwarm(:,2*ParCol+1))-AdaptFunc(OptSwarm(ParRow+1,:))));%c2=4-c1;%----------------------------------------------------------------------%***** 更改上面的代码,可以更改c1,c2的变化*****%*********************************************for row=1:ParRow GlobleSubTract2=OptSwarm(ParRow*2+1,:)-ParSwarm(row,1:ParCol);%全局最优的位置减去每个粒子当前的位置 LocalTempV=w.*ParSwarm(row,ParCol+1:2*ParCol)+c1*unifrnd(0,1).*LocalSubTract1(row,:)+c2*unifrnd(0,1).*LocalSubTract2(row,:); GlobleTempV=w.*ParSwarm(row,ParCol+1:2*ParCol)+c1*unifrnd(0,1).*GlobleSubTract1(row,:)+c2*unifrnd(0,1).*GlobleSubTract2; TempV=Hybrid.*GlobleTempV+(1-Hybrid).*LocalTempV; %限制速度的代码 for h=1:ParCol if TempV(:,h)>ParticleScope(h,2)/2.0 TempV(:,h)=ParticleScope(h,2)/2.0; end if TempV(:,h)<-ParticleScope(h,2)/2.0 TempV(:,h)=(-ParticleScope(h,2)+1e-10)/2.0; %加1e-10防止适应度函数被零除 end end % 更新速度 ParSwarm(row,ParCol+1:2*ParCol)=TempV; %********************************************* %***** 更改下面的代码,可以更改约束因子的变化***** %--------------------------------------------------------------------- %a=1; %--------------------------------------------------------------------- a=0.729; %***** 更改上面的代码,可以更改约束因子的变化***** %********************************************* % 限制位置的范围 TempPos=ParSwarm(row,1:ParCol)+a*TempV; for h=1:ParCol if TempPos(:,h)>ParticleScope(h,2) TempPos(:,h)=ParticleScope(h,2); end if TempPos(:,h)<=ParticleScope(h,1) TempPos(:,h)=ParticleScope(h,1)+1e-10; end end %更新位置 ParSwarm(row,1:ParCol)=TempPos; % 计算每个粒子的新的适应度值 ParSwarm(row,2*ParCol+1)=AdaptFunc(ParSwarm(row,1:ParCol)); if ParSwarm(row,2*ParCol+1)>AdaptFunc(OptSwarm(row,1:ParCol)) OptSwarm(row,1:ParCol)=ParSwarm(row,1:ParCol); endend%for循环结束%确定邻域的范围linyurange=fix(ParRow/2);%确定当前迭代的邻域范围jiange=ceil(LoopCount/linyurange);linyu=ceil(CurCount/jiange); for row=1:ParRow if row-linyu>0&&row+linyu<=ParRow tempM =[ParSwarm(row-linyu:row-1,:);ParSwarm(row+1:row+linyu,:)]; [maxValue,linyurow]=max(tempM(:,2*ParCol+1)); if maxValue>AdaptFunc(OptSwarm(ParRow+row,:)) OptSwarm(ParRow+row,:)=tempM(linyurow,1:ParCol); end else if row-linyu<=0 %该行上面的部分突出了边界,下面绝对不会突破边界 if row==1 tempM=[ParSwarm(ParRow+row-linyu:end,:);ParSwarm(row+1:row+linyu,:)]; [maxValue,linyurow]=max(tempM(:,2*ParCol+1)); if maxValue>AdaptFunc(OptSwarm(ParRow+row,:)) OptSwarm(ParRow+row,:)=tempM(linyurow,1:ParCol); end else tempM=[ParSwarm(1:row-1,:);ParSwarm(ParRow+row-linyu:end,:);ParSwarm(row+1:row+linyu,:)]; [maxValue,linyurow]=max(tempM(:,2*ParCol+1)); if maxValue>AdaptFunc(OptSwarm(ParRow+row,:)) OptSwarm(ParRow+row,:)=tempM(linyurow,1:ParCol); end end else %该行下面的部分突出了边界,上面绝对不会突破边界 if row==ParRow tempM=[ParSwarm(ParRow-linyu:row-1,:);ParSwarm(1:linyu,:)]; [maxValue,linyurow]=max(tempM(:,2*ParCol+1)); if maxValue>AdaptFunc(OptSwarm(ParRow+row,:)) OptSwarm(ParRow+row,:)=tempM(linyurow,1:ParCol); end else tempM=[ParSwarm(row-linyu:row-1,:);ParSwarm(row+1:end,:);ParSwarm(1:linyu-(ParRow-row),:)]; [maxValue,linyurow]=max(tempM(:,2*ParCol+1)); if maxValue>AdaptFunc(OptSwarm(ParRow+row,:)) OptSwarm(ParRow+row,:)=tempM(linyurow,1:ParCol); end end end end end%for %寻找适应度函数值最大的解在矩阵中的位置(行数),进行全局最优的改变 [maxValue,row]=max(ParSwarm(:,2*ParCol+1));if AdaptFunc(ParSwarm(row,1:ParCol))>AdaptFunc(OptSwarm(ParRow*2+1,:)) OptSwarm(ParRow*2+1,:)=ParSwarm(row,1:ParCol);end

注意代码的91行到96行,这几行就是混合粒子群速度更新公式,其他部分基本与前面的实现一样。

最后还是一个把这两个函数组装在一起的函数,同样采用LocalPsoProcessByCircle函数,详细见粒子群算法(7)的内容,最后还是给出一个应用实例。

Scope=[-10 10;-10 10;-10 10;-10 10;-10 10;-10 10;-10 10;-10 10;-10 10;-10 10];//粒子每维的限制范围qun=20;//粒子群的规模lizi=10;//每个粒子的维数[Result,OnLine,OffLine,MinMaxMeanAdapt,BestofStep]=LocalPsoProcessByCircle(qun,lizi,Scope,@localinitswarm,@Hybridsteppso,@Rastrigin,0,0,1000,0);

注意:在这个LocalPsoProcessByCircle函数中,使用HybridStepPso作为单步更新的函数,其余基本与局部粒子群算法相同。

经过本人的实际测试,运行条件相同,最好的是局部版本的PSO,混合的PSO并不像有些文献上说的那么好,也许是我实现的不对,如果有那个大侠实现的效果更好,可以给我联系,我们可以共享代码。

同时也希望那些砖家、叫兽们共享你们的效果非常好的代码。

本人已经实现了一个PSO的工具箱,不过效果不好,本人水平低劣,又需要的可以联系我。

不知道CSDN能不能做链接下载,如果可以,请告诉我,我做个链接,大家可以随便下载,共同交流。

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。