functionlhl_AFclc;clearall;closeall;formatlongVisual=2.5;%人工鱼的感知距离Step=0.3;%人工鱼的移动最大步长N=10;%人工鱼的数量Try_number=50;%迭代的最大次数delta=0.618;%拥挤度因子a1=-10;b1=10;a2=-10;b2=10;d=[];%存储50个状态下的目标函数值;k=0;m=50;%迭代次数X1=rand(N,1)*(b1-a1)+a1;%在-10~10之间,随机生成50个数;X2=rand(N,1)*(b2-a2)+a2;X=[X1X2];%X=ones(N,2);%fori=1:N%X(i,1)=-10;%X(i,2)=10;%end%人工鱼数量,两个状态变量X1和X2;%计算50个初始状态下的;fori=1:N=[X(i,1),X(i,2)];d(i)=maxf();end%公告牌用于记录人工鱼个体的历史最好状态[w,i]=max(d);%求出初始状态下的最大值w和最大值的位置i;maxX=[X(i,1),X(i,2)];%初始公告板记录,最大值位置;maxY=w;%初始化公告板记录,最大值;figurex=[];figurey=[];figurez=[];figurex(numel(figurex)+1)=maxX(1);%将maxX(1)放入figurex中,figurey(numel(figurey)+1)=maxX(2);%numel返回数组或者向量中所含元素的总数,matlab数组下标默认是从1开始的figurez(numel(figurez)+1)=maxY;while(km)fori=1:NXX=[X(i,1),X(i,2)];%拿出其中一条鱼来看他的四种行为判断%%%%%%第一种行为:聚群行为:伙伴多且不挤,就向伙伴中心位置移动%群聚行为是伙伴的中心点,凸规划下,中心点一定还在约束内%群聚行为不是一种maxf(Xc)的比较,就是看伙伴位置nf1=0;Xc=0;label_swarm=0;%群聚行为发生标志forj=1:NXX_1=[X(j,1),X(j,2)];if(norm(XX_1-XX)Visual)%norm函数求向量XXX-XX的范数,由于二维向量,2或者省略都可以nf1=nf1+1;Xc=Xc+XX_1;endendXc=Xc-XX;%需要去除XX本身;nf1=nf1-1;Xc=Xc/nf1;%此时Xc表示XX感知范围其他伙伴的中心位置;if((maxf(Xc)/nf1delta*maxf(XX))&&(norm(Xc-XX)~=0))XXR1=rand*Step*(Xc-XX)/norm(Xc-XX);XXnext1=XX+XXR1;if(XXnext1(1)b1)XXnext1(1)=b1;endif(XXnext1(1)a1)XXnext1(1)=a1;endif(XXnext1(2)b2)XXnext1(2)=b2;endif(XXnext1(2)a2)XXnext1(2)=a2;endlabel_swarm=1;temp_y_XXnext1=maxf(XXnext1);elselabel_swarm=0;temp_y_XXnext1=-inf;end%%%%%%%%%%%%第二种行为:追尾行为:周围伙伴有最大值且附近不挤,向其伙伴方向移动%追尾行为追寻伙伴行为,还是在约束内temp_maxY=-inf;%按照理论来说这块应该初始化为-无穷小,label_follow=0;%追尾行为发生标记forj=1:NXX_2=[X(j,1),X(j,2)];if((norm(XX_2-XX)Visual)&&(maxf(XX_2)temp_maxY))temp_maxX=XX_2;temp_maxY=maxf(XX_2);endendnf2=0;forj=1:NXX_2=[X(j,1),X(j,2)];if(norm(XX_2-temp_maxX)Visual)nf2=nf2+1;endendnf2=nf2-1;%去掉他本身if((temp_maxY/nf2)delta*maxf(XX)&&(norm(temp_maxX-XX)~=0))%附近有Yj最大的伙伴,并且不太拥挤XXR2=rand*Step*(temp_maxX-XX)/norm(temp_maxX-XX);%rand不是随机反向,是随机步长XXnext2=XX+XXR2;if(XXnext2(1)b1)XXnext2(1)=b1;endif(XXnext2(1)a1)XXnext2(1)=a1;endif(XXnext2(2)b2)XXnext2(2)=b2;endif(XXnext2(2)a2)XXnext2(2)=a2;endlabel_follow=1;temp_y_XXnext2=maxf(XXnext2);elselabel_follow=0;temp_y_XXnext2=-inf;end%%%%%%%%%%%%第三种行为:觅食行为:与前两个行为不同,觅食和随机行为都是找附近的状态,而不是找附近的同伴%觅食和随机行为可能出现超出约束,所以,XX_3和XX_4是不一样的%觅食行为和群聚行为、追尾行为是不一样的,觅食行为是一种根据状态来判断的行为,群聚和追尾是根据伙伴来判断的行为label_prey=0;%判断觅食行为是否找到优于当前的状态forj=1:Try_numberR1V=Visual*(-1+2*rand(2,1)');XX_3=XX+R1V;if(XX_3(1)b1)%下面这四个是一套,如果超出约束条件,就选值为边界条件XX_3(1)=b1;endif(XX_3(1)a1)XX_3(1)=a1;endif(XX_3(2)b2)XX_3(2)=b2;endif(XX_3(2)a2)XX_3(2)=a2;endif(maxf(XX)maxf(XX_3))XXR3=rand*Step*(XX_3-XX)/norm(XX_3-XX);XXnext3=XX+XXR3;if(XXnext3(1)b1)%下面这四个是一套,如果超出约束条件,就选值为边界条件XXnext3(1)=b1;endif(XXnext3(1)a1)XXnext3(1)=a1;endif(XXnext3(2)b2)XXnext3(2)=b2;endif(XXnext3(2)a2)XXnext3(2)=a2;endlabel_prey=1;break;endendtemp_y_XXnext3=max(XXnext3);if(label_prey==0)temp_y_XXnext3=-inf;end%%%%%%%%%%%%行为选择if((label_swarm==0)&&(label_follow==0)&&(label_prey==0))%聚群和追尾鱼太多太拥挤,都不发生;觅食觅不到更好的,造成三种行为都不发生。%如果前三种行为都没有发生出现,必然是发生随机行为R2S=Step*(-1+2*rand(2,1)');temp_XX=XX+R2S;if(XX(1)b1)%下面这四个是一套,如果超出约束条件,就选值为边界条件XX(1)=b1;endif(XX(1)a1)XX(1)=a1;endif(XX(2)b2)XX(2)=b2;endif(XX(2)a2)XX(2)=a2;endelse%三种行为找最优if(temp_y_XXnext1temp_y_XXnext2)if(temp_y_XXnext1temp_y_XXnext3)temp_XX=XXnext1;elsetemp_XX=XXnext3;endelseif(temp_y_XXnext2temp_y_XXnext3)temp_XX=XXnext2;elsetemp_XX=XXnext3;endendendXX=temp_XX;X(i,1)=XX(1);X(i,2)=XX(2);%%%%%%end%至此,所有人工鱼,完成一次行为判断和移动%这块是更新公告牌信息fori=1:NXXX=[X(i,1),X(i,2)];if(maxf(XXX)maxY)maxY=maxf(XXX);maxX=XXX;figurex(numel(figurex)+1)=maxX(1);figurey(numel(figurey)+1)=maxX(2);figurez(numel(figurez)+1)=maxY;endendx=X(:,1)';y=X(:,2)';plot(x,y,'*r');axis([-1010-1010]);k=k+1endmaxXmaxYplot3(figurex,figurey,figurez,'-g.')functiony=maxf(QQ)%目标函数y=(sinX1/X1)*(sinX2/X2),这块可以指定自己的目标函数%输入二维向量,输出一个值y=(sin(QQ(1))/QQ(1))*(sin(QQ(2))/QQ(2));