鱼群算法matlab代码,人工鱼群算法MATLAB实现
人工魚群算法
在一片水域中,魚往往能自行或尾隨其他魚找到營養(yǎng)物質(zhì)多的地方,因而魚生存數(shù)目最多的地方一般就是本水域中營養(yǎng)物質(zhì)最多的地方,人工魚群算法就是根據(jù)這一特點(diǎn),通過構(gòu)造人工魚來模仿魚群的覓食、聚群及追尾行為,從而實(shí)現(xiàn)尋優(yōu)。
中文名 人工魚群算法 典型行為覓食行為 特 點(diǎn) 具有較快的收斂速度 停止條件 均方差小于允許的誤差。
算法描述
在一片水域中,魚往往能自行或尾隨其他魚找到營養(yǎng)物質(zhì)多的地方,因而魚生存數(shù)目最多的地方一般就是本水域中營養(yǎng)物質(zhì)最多的地方,人工魚群算法就是根據(jù)這一特點(diǎn),通過構(gòu)造人工魚來模仿魚群的覓食、聚群及追尾行為,從而實(shí)現(xiàn)尋優(yōu),以下是魚的幾種典型行為:
1)覓食行為:一般情況下魚在水中隨機(jī)地自由游動,當(dāng)發(fā)現(xiàn)食物時,則會向食物逐漸增多的方向快速游去。
2)聚群行為:魚在游動過程中為了保證自身的生存和躲避危害會自然地聚集成群,魚聚群時所遵守的規(guī)則有三條:分隔規(guī)則:盡量避免與臨近伙伴過于擁擠;對準(zhǔn)規(guī)則:盡量與臨近伙伴的平均方向一致;內(nèi)聚規(guī)則:盡量朝臨近伙伴的中心移動。
3)追尾行為:當(dāng)魚群中的一條或幾條魚發(fā)現(xiàn)食物時,其臨近的伙伴會尾隨其快速到達(dá)食物點(diǎn)。
4)隨機(jī)行為:單獨(dú)的魚在水中通常都是隨機(jī)游動的,這是為了更大范圍地尋找食物點(diǎn)或身邊的伙伴。
特點(diǎn)
1)具有較快的收斂速度,可以用于解決有實(shí)時性要求的問題;
2)對于一些精度要求不高的場合,可以用它快速的得到一個可行解;
3)不需要問題的嚴(yán)格機(jī)理模型,甚至不需要問題的精確描述,這使得它的應(yīng)用范圍得以延伸。
停止條件
1) 判斷連續(xù)多次所得的均方差小于允許的誤差;
2)判斷某個區(qū)域的人工魚群的數(shù)目達(dá)到某個比率;
3)連續(xù)多次所獲取的值均不能超過已找到的極值。
4)迭代次數(shù)達(dá)到預(yù)設(shè)次數(shù)
一維函數(shù)尋優(yōu)MATLAB代碼:
①main.m
MATLAB
clc
clear all
close all
tic
figure(1);hold on
ezplot('x*sin(10*pi*x)+2',[-1,2]);
%% 參數(shù)設(shè)置
fishnum=50; %生成50只人工魚
MAXGEN=50; %最多迭代次數(shù)
try_number=100;%最多試探次數(shù)
visual=1; %感知距離
delta=0.618; %擁擠度因子
step=0.1; %步長
%% 初始化魚群
lb_ub=[-1,2,1];
X=AF_init(fishnum,lb_ub);
LBUB=[];
for i=1:size(lb_ub,1)
LBUB=[LBUB;repmat(lb_ub(i,1:2),lb_ub(i,3),1)];
end
gen=1;
BestY=-1*ones(1,MAXGEN); %每步中最優(yōu)的函數(shù)值
BestX=-1*ones(1,MAXGEN); %每步中最優(yōu)的自變量
besty=-100; %最優(yōu)函數(shù)值
Y=AF_foodconsistence(X);
while gen<=MAXGEN
fprintf(1,'%d\n',gen)
for i=1:fishnum
%% 聚群行為
[Xi1,Yi1]=AF_swarm(X,i,visual,step,delta,try_number,LBUB,Y);
%% 追尾行為
[Xi2,Yi2]=AF_follow(X,i,visual,step,delta,try_number,LBUB,Y);
if Yi1>Yi2
X(:,i)=Xi1;
Y(1,i)=Yi1;
else
X(:,i)=Xi2;
Y(1,i)=Yi2;
end
end
[Ymax,index]=max(Y);
figure(1);
plot(X(1,index),Ymax,'.','color',[gen/MAXGEN,0,0])
if Ymax>besty
besty=Ymax;
bestx=X(:,index);
BestY(gen)=Ymax;
[BestX(:,gen)]=X(:,index);
else
BestY(gen)=BestY(gen-1);
[BestX(:,gen)]=BestX(:,gen-1);
end
gen=gen+1;
end
plot(bestx(1),besty,'ro','MarkerSize',100)
xlabel('x')
ylabel('y')
title('魚群算法迭代過程中最優(yōu)坐標(biāo)移動')
%% 優(yōu)化過程圖
figure
plot(1:MAXGEN,BestY)
xlabel('迭代次數(shù)')
ylabel('優(yōu)化值')
title('魚群算法迭代過程')
disp(['最優(yōu)解X:',num2str(bestx,'%1.4f')])
disp(['最優(yōu)解Y:',num2str(besty,'%1.4f')])
toc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
clc
clearall
closeall
tic
figure(1);holdon
ezplot('x*sin(10*pi*x)+2',[-1,2]);
%%參數(shù)設(shè)置
fishnum=50;%生成50只人工魚
MAXGEN=50;%最多迭代次數(shù)
try_number=100;%最多試探次數(shù)
visual=1;%感知距離
delta=0.618;%擁擠度因子
step=0.1;%步長
%%初始化魚群
lb_ub=[-1,2,1];
X=AF_init(fishnum,lb_ub);
LBUB=[];
fori=1:size(lb_ub,1)
LBUB=[LBUB;repmat(lb_ub(i,1:2),lb_ub(i,3),1)];
end
gen=1;
BestY=-1*ones(1,MAXGEN);%每步中最優(yōu)的函數(shù)值
BestX=-1*ones(1,MAXGEN);%每步中最優(yōu)的自變量
besty=-100;%最優(yōu)函數(shù)值
Y=AF_foodconsistence(X);
whilegen<=MAXGEN
fprintf(1,'%d\n',gen)
fori=1:fishnum
%% 聚群行為
[Xi1,Yi1]=AF_swarm(X,i,visual,step,delta,try_number,LBUB,Y);
%% 追尾行為
[Xi2,Yi2]=AF_follow(X,i,visual,step,delta,try_number,LBUB,Y);
ifYi1>Yi2
X(:,i)=Xi1;
Y(1,i)=Yi1;
else
X(:,i)=Xi2;
Y(1,i)=Yi2;
end
end
[Ymax,index]=max(Y);
figure(1);
plot(X(1,index),Ymax,'.','color',[gen/MAXGEN,0,0])
ifYmax>besty
besty=Ymax;
bestx=X(:,index);
BestY(gen)=Ymax;
[BestX(:,gen)]=X(:,index);
else
BestY(gen)=BestY(gen-1);
[BestX(:,gen)]=BestX(:,gen-1);
end
gen=gen+1;
end
plot(bestx(1),besty,'ro','MarkerSize',100)
xlabel('x')
ylabel('y')
title('魚群算法迭代過程中最優(yōu)坐標(biāo)移動')
%%優(yōu)化過程圖
figure
plot(1:MAXGEN,BestY)
xlabel('迭代次數(shù)')
ylabel('優(yōu)化值')
title('魚群算法迭代過程')
disp(['最優(yōu)解X:',num2str(bestx,'%1.4f')])
disp(['最優(yōu)解Y:',num2str(besty,'%1.4f')])
toc
②dist.m
MATLAB
%計(jì)算第i條魚與所有魚的位置,包括本身。
function D=dist(Xi,X)
col=size(X,2);
D=zeros(1,col);
for j=1:col
D(j)=norm(Xi-X(:,j));
end
1
2
3
4
5
6
7
8
%計(jì)算第i條魚與所有魚的位置,包括本身。
functionD=dist(Xi,X)
col=size(X,2);
D=zeros(1,col);
forj=1:col
D(j)=norm(Xi-X(:,j));
end
③AF_swarm.m
MATLAB
function [Xnext,Ynext]=AF_swarm(X,i,visual,step,deta,try_number,LBUB,lastY)
% 聚群行為
%輸入:
%X 所有人工魚的位置
%i 當(dāng)前人工魚的序號
%visual 感知范圍
%step 最大移動步長
%deta 擁擠度
%try_number 最大嘗試次數(shù)
%LBUB 各個數(shù)的上下限
%lastY 上次的各人工魚位置的食物濃度
%輸出:
%Xnext Xi人工魚的下一個位置
%Ynext Xi人工魚的下一個位置的食物濃度
Xi=X(:,i);
D=AF_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_foodconsistence(Xc);
Yi=lastY(i);
if Yc/nf>deta*Yi
Xnext=Xi+rand*step*(Xc-Xi)/norm(Xc-Xi);
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
Ynext=AF_foodconsistence(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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
function[Xnext,Ynext]=AF_swarm(X,i,visual,step,deta,try_number,LBUB,lastY)
%聚群行為
%輸入:
%X所有人工魚的位置
%i當(dāng)前人工魚的序號
%visual感知范圍
%step最大移動步長
%deta擁擠度
%try_number最大嘗試次數(shù)
%LBUB各個數(shù)的上下限
%lastY上次的各人工魚位置的食物濃度
%輸出:
%XnextXi人工魚的下一個位置
%YnextXi人工魚的下一個位置的食物濃度
Xi=X(:,i);
D=AF_dist(Xi,X);
index=find(D>0&D
nf=length(index);
ifnf>0
forj=1:size(X,1)
Xc(j,1)=mean(X(j,index));
end
Yc=AF_foodconsistence(Xc);
Yi=lastY(i);
ifYc/nf>deta*Yi
Xnext=Xi+rand*step*(Xc-Xi)/norm(Xc-Xi);
fori=1:length(Xnext)
ifXnext(i)>LBUB(i,2)
Xnext(i)=LBUB(i,2);
end
ifXnext(i)
Xnext(i)=LBUB(i,1);
end
end
Ynext=AF_foodconsistence(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
④AF_prey.m
MATLAB
function [Xnext,Ynext]=AF_prey(Xi,ii,visual,step,try_number,LBUB,lastY)
%覓食行為
%輸入:
%Xi 當(dāng)前人工魚的位置
%ii 當(dāng)前人工魚的序號
%visual 感知范圍
%step 最大移動步長
%try_number 最大嘗試次數(shù)
%LBUB 各個數(shù)的上下限
%lastY 上次的各人工魚位置的食物濃度
%輸出:
%Xnext Xi人工魚的下一個位置
%Ynext Xi人工魚的下一個位置的食物濃度
Xnext=[];
Yi=lastY(ii);
for i=1:try_number
Xj=Xi+(2*rand(length(Xi),1)-1)*visual;
Yj=AF_foodconsistence(Xj);
if Yi
Xnext=Xi+rand*step*(Xj-Xi)/norm(Xj-Xi);
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
Xi=Xnext;
break;
end
end
%隨機(jī)行為
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_foodconsistence(Xnext);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
function[Xnext,Ynext]=AF_prey(Xi,ii,visual,step,try_number,LBUB,lastY)
%覓食行為
%輸入:
%Xi當(dāng)前人工魚的位置
%ii當(dāng)前人工魚的序號
%visual感知范圍
%step最大移動步長
%try_number最大嘗試次數(shù)
%LBUB各個數(shù)的上下限
%lastY上次的各人工魚位置的食物濃度
%輸出:
%XnextXi人工魚的下一個位置
%YnextXi人工魚的下一個位置的食物濃度
Xnext=[];
Yi=lastY(ii);
fori=1:try_number
Xj=Xi+(2*rand(length(Xi),1)-1)*visual;
Yj=AF_foodconsistence(Xj);
ifYi
Xnext=Xi+rand*step*(Xj-Xi)/norm(Xj-Xi);
fori=1:length(Xnext)
ifXnext(i)>LBUB(i,2)
Xnext(i)=LBUB(i,2);
end
ifXnext(i)
Xnext(i)=LBUB(i,1);
end
end
Xi=Xnext;
break;
end
end
%隨機(jī)行為
ifisempty(Xnext)
Xj=Xi+(2*rand(length(Xi),1)-1)*visual;
Xnext=Xj;
fori=1:length(Xnext)
ifXnext(i)>LBUB(i,2)
Xnext(i)=LBUB(i,2);
end
ifXnext(i)
Xnext(i)=LBUB(i,1);
end
end
end
Ynext=AF_foodconsistence(Xnext);
⑤AF_init.m
MATLAB
function X=AF_init(Nfish,lb_ub)
%輸入:
% Nfish 魚群大小
% lb_ub 魚的活動范圍
%輸出:
% X 產(chǎn)生的初始人工魚群
% example:
% Nfish=3;
% lb_ub=[-3.0,12.1,1;4.1,5.8,1];
%%這里的lb_ub是2行3列的矩陣,每行中前兩個數(shù)是范圍的上下限,第3個數(shù)是在該范圍內(nèi)的數(shù)的個數(shù)
% X=Inital(Nfish,lb_ub)
%%就是產(chǎn)生[-3.0,12.1]內(nèi)的數(shù)1個,[4.1,5.8]內(nèi)的數(shù)1個
%%兩個數(shù)一組,這樣的數(shù)一共Nfish個
row=size(lb_ub,1);
X=[];
for i=1:row
lb=lb_ub(i,1);
ub=lb_ub(i,2);
nr=lb_ub(i,3);
for j=1:nr
X(end+1,:)=lb+(ub-lb)*rand(1,Nfish);
end
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
functionX=AF_init(Nfish,lb_ub)
%輸入:
%Nfish魚群大小
%lb_ub魚的活動范圍
%輸出:
%X產(chǎn)生的初始人工魚群
%example:
%Nfish=3;
%lb_ub=[-3.0,12.1,1;4.1,5.8,1];
%%這里的lb_ub是2行3列的矩陣,每行中前兩個數(shù)是范圍的上下限,第3個數(shù)是在該范圍內(nèi)的數(shù)的個數(shù)
%X=Inital(Nfish,lb_ub)
%%就是產(chǎn)生[-3.0,12.1]內(nèi)的數(shù)1個,[4.1,5.8]內(nèi)的數(shù)1個
%%兩個數(shù)一組,這樣的數(shù)一共Nfish個
row=size(lb_ub,1);
X=[];
fori=1:row
lb=lb_ub(i,1);
ub=lb_ub(i,2);
nr=lb_ub(i,3);
forj=1:nr
X(end+1,:)=lb+(ub-lb)*rand(1,Nfish);
end
end
⑥AF_foodconsistence
MATLAB
function [Y]=AF_foodconsistence(X)
fishnum=size(X,2);
for i=1:fishnum
Y(1,i)=X(i)*sin(10*pi*X(i))+2;
end
1
2
3
4
5
function[Y]=AF_foodconsistence(X)
fishnum=size(X,2);
fori=1:fishnum
Y(1,i)=X(i)*sin(10*pi*X(i))+2;
end
⑦AF_follow.m
MATLAB
function [Xnext,Ynext]=AF_follow(X,i,visual,step,deta,try_number,LBUB,lastY)
% 追尾行為
%輸入:
%X 所有人工魚的位置
%i 當(dāng)前人工魚的序號
%visual 感知范圍
%step 最大移動步長
%deta 擁擠度
%try_number 最大嘗試次數(shù)
%LBUB 各個數(shù)的上下限
%lastY 上次的各人工魚位置的食物濃度
%輸出:
%Xnext Xi人工魚的下一個位置
%Ynext Xi人工魚的下一個位置的食物濃度
Xi=X(:,i);
D=AF_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=Xi+rand*step*(Xmax-Xi)/norm(Xmax-Xi);
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
Ynext=AF_foodconsistence(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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
function[Xnext,Ynext]=AF_follow(X,i,visual,step,deta,try_number,LBUB,lastY)
%追尾行為
%輸入:
%X所有人工魚的位置
%i當(dāng)前人工魚的序號
%visual感知范圍
%step最大移動步長
%deta擁擠度
%try_number最大嘗試次數(shù)
%LBUB各個數(shù)的上下限
%lastY上次的各人工魚位置的食物濃度
%輸出:
%XnextXi人工魚的下一個位置
%YnextXi人工魚的下一個位置的食物濃度
Xi=X(:,i);
D=AF_dist(Xi,X);
index=find(D>0&D
nf=length(index);
ifnf>0
XX=X(:,index);
YY=lastY(index);
[Ymax,Max_index]=max(YY);
Xmax=XX(:,Max_index);
Yi=lastY(i);
ifYmax/nf>deta*Yi;
Xnext=Xi+rand*step*(Xmax-Xi)/norm(Xmax-Xi);
fori=1:length(Xnext)
ifXnext(i)>LBUB(i,2)
Xnext(i)=LBUB(i,2);
end
ifXnext(i)
Xnext(i)=LBUB(i,1);
end
end
Ynext=AF_foodconsistence(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
⑧AF_dist
MATLAB
function D=AF_dist(Xi,X)
%計(jì)算第i條魚與所有魚的位置,包括本身。
%輸入:
%Xi 第i條魚的當(dāng)前位置
%X 所有魚的當(dāng)前位置
% 輸出:
%D 第i條魚與所有魚的距離
col=size(X,2);
D=zeros(1,col);
for j=1:col
D(j)=norm(Xi-X(:,j));
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
functionD=AF_dist(Xi,X)
%計(jì)算第i條魚與所有魚的位置,包括本身。
%輸入:
%Xi第i條魚的當(dāng)前位置
%X所有魚的當(dāng)前位置
%輸出:
%D第i條魚與所有魚的距離
col=size(X,2);
D=zeros(1,col);
forj=1:col
D(j)=norm(Xi-X(:,j));
end
效果
參考文獻(xiàn)
Feng Shi. MATLAB 智能算法-30個案例分析[J]. 2015.
總結(jié)
以上是生活随笔為你收集整理的鱼群算法matlab代码,人工鱼群算法MATLAB实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 没有动任何配置文件,今天就出现了修改的J
- 下一篇: 【转】CMMI环境下,该如何实施Agil