人工鱼群算法matlab实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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_maxY))

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

%%%%%%

%%%%%%第三种行为:觅食行为:与前两个行为不同,觅食和随机行为都是找附近的状态,而不是找附近的同伴

相关文档
最新文档