📄 gmjafsa.m
字号:
%人工鱼群算法format longVisual=1;Step=0.001;N=50;Try_number=50;a=0.5;b=2;d=[];h=1e-3;Friend_number=50;k=0;m=50;X=rand(1,N)*(b-a)+a;%人工鱼数量for i=1:Nd(i)=maxf(X(i));end[w,i]=min(d);maxX=X(i);%初始公告板记录maxY=w;%初始公告板记录figurex=[];figurey=[];figurex(numel(figurex)+1)=maxX;figurey(numel(figurey)+1)=maxY;kkk=0;while(~(maxY<h)) for i=1:N XX=X(i);%人工鱼当前状态Xi nf=0; Xc=0; for j=1:N %聚群行为开始 XXX=X(j); if(norm(XXX-XX)<Visual) nf=nf+1; Xc=Xc+XXX; end end Xc=Xc/nf; if((maxf(Xc))<maxf(XX)) XXnext1=Xc+rand*Step*(XX-Xc)/norm(XX-Xc); if(XXnext1>b) XXnext1=b; end if(XXnext1<a) XXnext1=a; end else XXnext1=gmjprey(XX,Try_number,Visual,Step); if(XXnext1>b) XXnext1=b; end if(XXnext1<a) XXnext1=a; end end%聚群行为结束 %maxX=XX;%追尾行为开始 %maxY=maxf(XX); for j=1:Friend_number XXX=X(j); if(norm(XXX-XX)<Visual & maxf(XXX)<maxY) maxX=XXX; maxY=maxf(XXX); end end if((maxY)<maxf(XX)) XXnext2=maxX+rand*Step*(XX-maxX)/norm(XX-maxX); if(XXnext2>b) XXnext2=b; end if(XXnext2<a) XXnext2=a; end else XXnext2 =gmjprey(XX,Try_number,Visual,Step); if(XXnext2>b) XXnext2=b; end if(XXnext2<a) XXnext2=a; end end%追尾行为结束 if(maxf(XXnext1)<maxf(XXnext2)) X(i)=XXnext1; else X(i)=XXnext2; endend %一次迭代结束 for i=1:N XXXX=X(i); if maxf(XXXX)<maxY if(maxf(XXXX)-maxY>-h) maxY=maxf(XXXX); maxX=XXXX; figurex(numel(figurex)+1)=maxX; figurey(numel(figurey)+1)=maxY; kkk=1; break else maxY=maxf(XXXX); maxX=XXXX; figurex(numel(figurex)+1)=maxX; figurey(numel(figurey)+1)=maxY; end endend k=k+1; %进入下一次迭代 if(kkk) break endend maxXmaxYplot(figurex,figurey)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -