clear
tic
varNum=2; %变量数
afNum=50; %人工鱼个数
iterativeTime=50; %迭代次数
lchrom=16; %染色体基因串的长度
visual=2.5; %感知距离
step=0.3; %移动步长
crowd=0.618; %拥挤度因子
try_number=50; %随机选择次数
friend_number=50;
sim_model=4;
Xl=-5.12;
Xh=5.12;
X=af_init(afNum,varNum,Xl,Xh,lchrom); %初始化
for i=1:afNum
temp=[X(i,1),X(i,2)];
tempconsistence(i)=functionconsistence(temp,sim_model);
end
foodconsistence=tempconsistence';%求食物浓度
[a,b]=max(foodconsistence);
Xmax=[X(b,1),X(b,2)];
Ymax=a; %初始公告板记录
k=0;
visualweak=0;
while(k<iterativeTime)
for i=1:afNum
Xi=[X(i,1),X(i,2)]; %人工鱼当前状态
nf1=0;
Xc=0;
for j=1:friend_number %聚群行为开始
Xj=[X(j,1),X(j,2)];
if(norm(Xj-Xi)<visual)
nf1=nf1+1;
Xc=Xc+Xj;
end
end
if(nf1>1)
Xc=Xc/nf1;
if((functionconsistence(Xc,sim_model)/nf1)>(crowd*functionconsistence(Xi,sim_model)))
Xinext1=Xi+rand*step*(Xc-Xi)/norm(Xc-Xi);
if (Xinext1(1)<Xl)
Xinext1(1)=Xl;
end
if (Xinext1(1)>Xh)
Xinext1(1)=Xh;
end
if (Xinext1(2)<Xl)
Xinext1(2)=Xl;
end
if (Xinext1(2)>Xh)
Xinext1(2)=Xh;
end
else
Xinext1=af_prey(Xi,try_number,sim_model,visualweak,visual,step);
if (Xinext1(1)<Xl)
Xinext1(1)=Xl;
end
if (Xinext1(1)>Xh)
Xinext1(1)=Xh;
end
if (Xinext1(2)<Xl)
Xinext1(2)=Xl;
end
if (Xinext1(2)>Xh)
Xinext1(2)=Xh;
end
end
end %聚群行为结束
for j=1:friend_number %追尾行为开始
Xj=[X(j,1),X(j,2)];
if((norm(Xj-Xi)<visual) & (functionconsistence(Xj,sim_model)>Ymax))
Xmax=Xj;
Ymax=functionconsistence(Xj,sim_model);
end
end
if(Ymax>(functionconsistence(Xi,sim_model)))
Xinext2=Xi+rand*step*(Xmax-Xi)/norm(Xmax-Xi);
if (Xinext2(1)<Xl)
Xinext2(1)=Xl;
end
if (Xinext2(1)>Xh)
Xinext2(1)=Xh;
end
if (Xinext2(2)<Xl)
Xinext2(2)=Xl;
end
if (Xinext2(2)>Xh)
Xinext2(2)=Xh;
end
else
Xinext2=af_prey(Xi,try_number,sim_model,visualweak,visual,step);
if (Xinext2(1)<Xl)
Xinext2(1)=Xl;
end
if (Xinext2(1)>Xh)
Xinext2(1)=Xh;
end
if (Xinext2(2)<Xl)
Xinext2(2)=Xl;
end
if (Xinext2(2)>Xh)
Xinext2(2)=Xh;
end
end %追尾行为结束
if((functionconsistence(Xinext1,sim_model))>(functionconsistence(Xinext2,sim_model)))
X(i,1)=Xinext1(1);
X(i,2)=Xinext1(2);
else
X(i,1)=Xinext2(1);
X(i,2)=Xinext2(2);
end
end %一次迭代结束
k=k+1; %进入下一次迭代
visualweak=k/visual;
end
Xmax
Ymax
toc