人工鱼群算法
1. 基于动物行为的群体智能优化算法
2. 鱼群的行为主要有:觅食、聚群、追尾、随机行为
3. 面向问题:二元函数的优化
4. 主要的判断式(聚群和追尾行为):
其中Yc为新位置产生的函数值,Yi为上一个位置,ni为视野内伙伴数量。
5. 代码主体部分来自书本:《MATLAB智能算法30个案例分析(第2版)》
算法中子函数(单独保存成函数名的m文件):
NO.1 觅食行为
----------------------------------
function [Xnext,Ynext]=AF_prey(Xi,ii,visual,step,try_number,LBUB,lastY)
%觅食行为
%输入:
%Xi 当前人工鱼的位置
%ii 当前人工鱼的序号
%visual 感知范围
%step 最大移动步长
%try_number 最大尝试次数
%LBUB 各个数的上下限
%lastY 上次的各人工鱼位置的食物浓度
%输出:
%Xnext Xi人工鱼的下一个位置
%Ynext Xi人工鱼的下一个位置的食物浓度
Xnext=[];
Yi=lastY(ii);
for i=1:try_number
Xj=Xi+(2*rand(length(Xi),1)-1)*visual;
%在其视野范围内随机选择一个位置,随机数的范围为(-1,1)
Yj=AF_food(Xj);
if Yi
Xnext = AF_update(Xi,Xj,step,LBUB);
Xi=Xnext;
break;
end
end
%随机行为
if isempty(Xnext)
Xj=Xi+(2*rand(length(Xi),1)-1)*visual;
Xnext=Xj;
for i=1:length(Xnext)
if Xnext(i)>LBUB(i,2)
Xnext(i)=LBUB(i,2);
end
if Xnext(i)
Xnext(i)=LBUB(i,1);
end
end
end
Ynext=AF_food(Xnext);
NO.2 聚群行为
----------------------------------
function [Xnext,Ynext]=AF_swarm(X,i,visual,step,deta,try_number,LBUB,lastY)
% 聚群行为
%输入:
%X 所有人工鱼的位置
%i 当前人工鱼的序号
%visual 感知范围
%step 最大移动步长
%deta 拥挤度
%try_number 最大尝试次数
%LBUB 各个数的上下限
%lastY 上次的各人工鱼位置的食物浓度
%输出:
%Xnext Xi人工鱼的下一个位置
%Ynext Xi人工鱼的下一个位置的食物浓度
Xi=X(:,i);
D=dist(Xi',X); %求解欧氏距离,左右矩阵需要列数相等
index=find(D>0 & D
nf=length(index);
if nf>0 %如果视野内有伙伴
for j=1:size(X,1)
Xc(j,1)=mean(X(j,index)); %求视野内位置点的中心
end
Yc=AF_food(Xc);
Yi=lastY(i);
if Yc/nf>deta*Yi
Xnext = AF_update(Xi,Xc,step,LBUB);
Ynext=AF_food(Xnext);
else
[Xnext,Ynext]=AF_prey(Xi,i,visual,step,try_number,LBUB,lastY);
end
else
[Xnext,Ynext]=AF_prey(Xi,i,visual,step,try_number,LBUB,lastY);
end
NO.3 函数值计算
----------------------------------
function Y = AF_food(X)
%计算人工鱼当前位置的食物浓度,即为要处理的函数表达式
num = size(X,2);
Y = zeros(1,num);
for i=1:num
Y(1,i) = (sin(X(1,i))/X(1,i))*(sin(X(2,i))/X(2,i));
end
NO.4 位置更新
----------------------------------
function Xnext = AF_update(Xi,Xcho,step,LBUB)
%用来更新位置
Xnext=Xi+rand*step*(Xcho-Xi)/norm(Xcho-Xi); %norm求解范数,默认二范数
for i=1:length(Xnext)
if Xnext(i)>LBUB(i,2)
Xnext(i)=LBUB(i,2);
end %对边界的处理,越界则拉回
if Xnext(i)
Xnext(i)=LBUB(i,1);
end
end
NO.5 初始化函数
----------------------------------
function X=AF_init(Nfish,lb_ub)
%输入:
% Nfish 鱼群大小
% lb_ub 鱼的活动范围
%输出:
% X 产生的初始人工鱼群
%%lb_ub每行中前两个数是范围的上下限,第3个数自变量的维数
lb=lb_ub(1);
ub=lb_ub(2);
nr=lb_ub(3);
X=zeros(nr,Nfish);
for j=1:nr
X(j,:)=lb+(ub-lb)*rand(1,Nfish);
%X(j,:) = unifrnd(lb,ub,[1,Nfish]); 其实直接产生范围内的随机数也可以
end
NO.5 追尾函数
----------------------------------
function [Xnext,Ynext]=AF_follow(X,i,visual,step,deta,try_number,LBUB,lastY)
% 追尾行为
%输入:
%X 所有人工鱼的位置
%i 当前人工鱼的序号
%visual 感知范围
%step 最大移动步长
%deta 拥挤度
%try_number 最大尝试次数
%LBUB 各个数的上下限
%lastY 上次的各人工鱼位置的食物浓度
%输出:
%Xnext Xi人工鱼的下一个位置
%Ynext Xi人工鱼的下一个位置的食物浓度
Xi=X(:,i);
D=dist(Xi',X);
index=find(D>0 & D
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 = AF_update(Xi,Xmax,step,LBUB);
Ynext=AF_food(Xnext);
else
[Xnext,Ynext]=AF_prey(X(:,i),i,visual,step,try_number,LBUB,lastY);
end
else
[Xnext,Ynext]=AF_prey(X(:,i),i,visual,step,try_number,LBUB,lastY);
end
用来对比的一个小程序
----------------------------------
clc
clear all;
[X,Y] = meshgrid(-10:0.1:10);
Z=(sin(X)./X).*(sin(Y)./Y);
mesh(X,Y,Z)
hold on
[max_value,index] = max(Z(:))
[I_row, I_col] = ind2sub(size(Z),index);
%ind2sub将线性化索引转换成下标
disp(['最大值点X:',num2str(X(I_row,I_col))]); %因为函数是对称的
disp(['最大值点Y:',num2str(Y(I_row,I_col))]);
plot3(X(I_row,I_col),Y(I_row,I_col),max_value,'r*','MarkerSize',10)
%plot3(-0.0068486,-0.0068486,0.99998,'bo','MarkerSize',10)
%可以把鱼群算法的最大值点数值代入对比一下
主函数代码会另放一篇文章中