文档库 最新最全的文档下载
当前位置:文档库 › 人工鱼群算法matlab实现

人工鱼群算法matlab实现

人工鱼群算法matlab实现
人工鱼群算法matlab实现

人工鱼群算法m a t l a b

实现

集团标准化工作小组 #Q8QGGQT-GX8G08Q8-GNQGJ8-MHHGN#

function lhl_AF

clc;clear all; close all;

format long

Visual = ; %人工鱼的感知距离

Step = ; %人工鱼的移动最大步长

N = 10; %人工鱼的数量

Try_number = 50;%迭代的最大次数

delta=; %拥挤度因子

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

%%%%%%

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

%觅食和随机行为可能出现超出约束,所以,XX_3和XX_4是不一样的

%觅食行为和群聚行为、追尾行为是不一样的,觅食行为是一种根据状态来判断的行为,群聚和追尾是根据伙伴来判断的行为

label_prey =0; %判断觅食行为是否找到优于当前的状态

for j = 1:Try_number

R1V=Visual*(-1+2*rand(2,1)');

XX_3 = XX+R1V;

if(XX_3(1) > b1) % 下面这四个是一套,如果超出约束条件,就选值为边界条件

XX_3(1) = b1;

end

if(XX_3(1) < a1)

XX_3(1) = a1;

end

if(XX_3(2) > b2)

XX_3(2) = b2;

end

if(XX_3(2) < a2)

XX_3(2) = a2;

end

if(maxf(XX)

XXR3=rand*Step*(XX_3-XX)/norm(XX_3-XX);

XXnext3 = XX+XXR3;

if(XXnext3(1) > b1) % 下面这四个是一套,如果超出约束条件,就选值为边界条件

XXnext3(1) = b1;

end

if(XXnext3(1) < a1)

XXnext3(1) = a1;

end

if(XXnext3(2) > b2)

XXnext3(2) = b2;

end

if(XXnext3(2) < a2)

XXnext3(2) = a2;

end

label_prey =1;

break;

end

end

temp_y_XXnext3=max(XXnext3);

if(label_prey ==0)

temp_y_XXnext3=-inf;

end

%%%%%%

%%%%%%行为选择

if((label_swarm==0) && (label_follow==0) && (label_prey ==0))

%聚群和追尾鱼太多太拥挤,都不发生;觅食觅不到更好的,造成三种行为都不发生。

%如果前三种行为都没有发生出现,必然是发生随机行为

R2S=Step*(-1+2*rand(2,1)');

temp_XX = XX+R2S;

if(XX(1) > b1) % 下面这四个是一套,如果超出约束条件,就选值为边界条件

XX(1) = b1;

end

if(XX(1) < a1)

XX(1) = a1;

end

if(XX(2) > b2)

XX(2) = b2;

end

if(XX(2) < a2)

XX(2) = a2;

end

else

%三种行为找最优

if(temp_y_XXnext1 > temp_y_XXnext2)

if(temp_y_XXnext1 > temp_y_XXnext3)

temp_XX = XXnext1;

else

temp_XX = XXnext3;

end

else

if(temp_y_XXnext2 > temp_y_XXnext3)

temp_XX = XXnext2;

else

temp_XX = XXnext3;

end

end

end

XX=temp_XX;

X(i,1) = XX(1);

X(i,2) = XX(2);

%%%%%%

end

%至此,所有人工鱼,完成一次行为判断和移动

%这块是更新公告牌信息

for i = 1:N

XXX = [X(i,1),X(i,2)];

if (maxf(XXX)>maxY)

maxY = maxf(XXX);

maxX = XXX;

figurex(numel(figurex)+1) = maxX(1);

figurey(numel(figurey)+1) = maxX(2);

figurez(numel(figurez)+1) = maxY;

end

end

x=X(:,1)';

y=X(:,2)';

plot(x,y,'*r');

axis([-10 10 -10 10]);

k = k+1

end

maxX

maxY

plot3(figurex,figurey,figurez,'-g.')

function y = maxf(QQ)

%目标函数y=(sinX1/X1)*(sinX2/X2),这块可以指定自己的目标函数%输入二维向量,输出一个值

y = (sin(QQ(1))/QQ(1))*(sin(QQ(2))/QQ(2));

相关文档