人工鱼群算法matlab实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
function lhl_AF
clc;clear all; close all;
format long
Visual = 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 = [X1 X2];
%X = ones(N,2);
%for i = 1:N
% X(i,1)=-10;
% X(i,2)=10;
%end
% 人工鱼数量,两个状态变量X1和X2;
%计算50个初始状态下的;
for i = 1:N
www = [X(i,1),X(i,2)];
d(i) = maxf(www);
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(k for i = 1:N XX = [X(i,1),X(i,2)]; %拿出其中一条鱼来看他的四种行为判断 %%%%%%第一种行为:聚群行为:伙伴多且不挤,就向伙伴中心位置移动 %群聚行为是伙伴的中心点,凸规划下,中心点一定还在约束内 %群聚行为不是一种maxf(Xc)的比较,就是看伙伴位置 nf1=0; Xc=0; label_swarm =0; %群聚行为发生标志 for j = 1:N XX_1 = [X(j,1), X(j,2)]; if (norm(XX_1-XX) nf1 = nf1+1; Xc = Xc+XX_1; end end Xc=Xc-XX; %需要去除XX本身; nf1=nf1-1; Xc = Xc/nf1; %此时Xc表示XX感知范围其他伙伴的中心位置; if((maxf(Xc)/nf1 > delta*maxf(XX)) && (norm(Xc-XX)~=0)) XXR1=rand*Step*(Xc-XX)/norm(Xc-XX); XXnext1=XX+XXR1; if(XXnext1(1) > b1) XXnext1(1) = b1; end if(XXnext1(1) < a1) XXnext1(1) = a1; end if(XXnext1(2) > b2) XXnext1(2) = b2; end if(XXnext1(2) < a2) XXnext1(2) = a2; end label_swarm =1; temp_y_XXnext1=maxf(XXnext1); else label_swarm =0; temp_y_XXnext1=-inf; end %%%%%% %%%%%%第二种行为:追尾行为:周围伙伴有最大值且附近不挤,向其伙伴方向移动 %追尾行为追寻伙伴行为,还是在约束内 temp_maxY = -inf; %按照理论来说这块应该初始化为-无穷小, label_follow =0;%追尾行为发生标记 for j = 1:N XX_2 = [X(j,1),X(j,2)]; if((norm(XX_2-XX) temp_maxX = XX_2; temp_maxY = maxf(XX_2); end end nf2=0; for j = 1:N XX_2 = [X(j,1),X(j,2)]; if(norm(XX_2-temp_maxX) nf2=nf2+1; end end nf2=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; end if(XXnext2(1) < a1) XXnext2(1) = a1; end if(XXnext2(2) > b2) XXnext2(2) = b2; end if(XXnext2(2) < a2) XXnext2(2) = a2; end label_follow =1; temp_y_XXnext2=maxf(XXnext2); else label_follow =0; temp_y_XXnext2=-inf; end %%%%%% %%%%%%第三种行为:觅食行为:与前两个行为不同,觅食和随机行为都是找附近的状态,而不是找附近的同伴