functionX=Init(Nfish,FieldDR) %输入: % Nfish 鱼群大小 % FieldDR 鱼的活动范围 %输出: % X 产生的初始人工鱼群 Nvar = size(FieldDR,2); X = zeros(Nfish,Nvar); fori=1:Nfish X(i,:) = FieldDR(1,:)+(FieldDR(2,:)-FieldDR(1,:)).*rand(1,Nvar); end end
目标函数(食物浓度函数)代码如下:
function[Y] = FoodConsistence(X) Y = X.*sin(10*pi.*X)+2; end
距离函数代码如下:
functionD = Dist(Xi,X) %计算第i条鱼与所有鱼的位置,包括本身。 col=size(X,1); D=zeros(1,col); forj=1:col D(j) = norm(Xi-X(j,:)); end end
觅食行为的代码如下:
function[Xnext,Ynext] = Prey(Xi,ii,visual,step,try_number,FieldDR,lastY) %觅食行为 %输入: %Xi 当前人工鱼的位置 %ii 当前人工鱼的序号 %visual 感知范围 %step 最大移动步长 %try_number 最大尝试次数 %FieldDR 各个数的上下限 %lastY 上次的各人工鱼位置的食物浓度 %输出: %Xnext Xi人工鱼的下一个位置 %Ynext Xi人工鱼的下一个位置的食物浓度 Xnext = []; Yi = lastY(ii); fori=1:try_number Xj = Xi+(2*rand(1,length(Xi))-1)*visual; Yj = FoodConsistence(Xj); if Yi<Yj Xnext = Xi+rand*step*(Xj-Xi)/norm(Xj-Xi); for k=1:length(Xnext) if Xnext(k)>FieldDR(2,k) Xnext(k) = FieldDR(2,k); end if Xnext(k)<FieldDR(1,k) Xnext(k) = FieldDR(1,k); end end break; end end %随机行为 ifisempty(Xnext) Xnext = Xi+(2*rand(1,length(Xi))-1)*visual; fori=1:length(Xnext) if Xnext(i)>FieldDR(i,2) Xnext(i) = FieldDR(i,2); end if Xnext(i)<FieldDR(i,1) Xnext(i) = FieldDR(i,1); end end end Ynext = FoodConsistence(Xnext); end
聚群行为的代码如下:
function[Xnext,Ynext]=Swarm(X,i,visual,step,deta,try_number,FieldDR,lastY) % 聚群行为 %输入: %X 所有人工鱼的位置 %i 当前人工鱼的序号 %visual 感知范围 %step 最大移动步长 %deta 拥挤度 %try_number 最大尝试次数 %FieldDR 各个数的上下限 %lastY 上次的各人工鱼位置的食物浓度 %输出: %Xnext Xi人工鱼的下一个位置 %Ynext Xi人工鱼的下一个位置的食物浓度 Xi = X(i,:); D = Dist(Xi,X); index = find(D>0 & D<visual); nf = length(index); if nf>0 iflength(index)==1 Xc = X(index,:); else Xc = mean(X(index,:)); end Yc = FoodConsistence(Xc); Yi = lastY(i); if Yc/nf > deta*Yi Xnext = Xi+rand*step*(Xc-Xi)/norm(Xc-Xi); fori = 1:length(Xnext) if Xnext(i) > FieldDR(2,i) Xnext(i) = FieldDR(2,i); end if Xnext(i) < FieldDR(1,i) Xnext(i) = FieldDR(1,i); end end Ynext = FoodConsistence(Xnext); else [Xnext,Ynext] = Prey(Xi,i,visual,step,try_number,FieldDR,lastY); end else [Xnext,Ynext] = Prey(Xi,i,visual,step,try_number,FieldDR,lastY); end end
追尾行为的代码如下:
function[Xnext,Ynext]=Follow(X,i,visual,step,deta,try_number,FieldDR,lastY) % 追尾行为 %输入: %X 所有人工鱼的位置 %i 当前人工鱼的序号 %visual 感知范围 %step 最大移动步长 %deta 拥挤度 %try_number 最大尝试次数 %FieldDR 各个数的上下限 %lastY 上次的各人工鱼位置的食物浓度 %输出: %Xnext Xi人工鱼的下一个位置 %Ynext Xi人工鱼的下一个位置的食物浓度 Xi = X(i,:); D = Dist(Xi,X); index = find(D>0 & D<visual); nf = length(index); if nf>0 XX = X(index,:); YY = lastY(index); [Ymax,Max_index] = max(YY); Xmax = XX(Max_index,:); Yi = lastY(i); if Ymax/nf > deta*Yi; Xnext = Xi+rand*step*(Xmax-Xi)/norm(Xmax-Xi); fori=1:length(Xnext) if Xnext(i)>FieldDR(2,i) Xnext(i) = FieldDR(2,i); end if Xnext(i)<FieldDR(2,i) Xnext(i) = FieldDR(2,i); end end Ynext = FoodConsistence(Xnext); else [Xnext,Ynext]=Prey(Xi,i,visual,step,try_number,FieldDR,lastY); end else [Xnext,Ynext] = Prey(Xi,i,visual,step,try_number,FieldDR,lastY); end end
人工鱼群算法代码如下:
clc clear close all figure hold on ezplot('x*sin(10*pi*x)+2',[-1,2]);