日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

鱼群算法matlab代码,人工鱼群算法MATLAB实现

發布時間:2023/12/10 循环神经网络 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 鱼群算法matlab代码,人工鱼群算法MATLAB实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

人工魚群算法

在一片水域中,魚往往能自行或尾隨其他魚找到營養物質多的地方,因而魚生存數目最多的地方一般就是本水域中營養物質最多的地方,人工魚群算法就是根據這一特點,通過構造人工魚來模仿魚群的覓食、聚群及追尾行為,從而實現尋優。

中文名 人工魚群算法 典型行為覓食行為 特 點 具有較快的收斂速度 停止條件 均方差小于允許的誤差。

算法描述

在一片水域中,魚往往能自行或尾隨其他魚找到營養物質多的地方,因而魚生存數目最多的地方一般就是本水域中營養物質最多的地方,人工魚群算法就是根據這一特點,通過構造人工魚來模仿魚群的覓食、聚群及追尾行為,從而實現尋優,以下是魚的幾種典型行為:

1)覓食行為:一般情況下魚在水中隨機地自由游動,當發現食物時,則會向食物逐漸增多的方向快速游去。

2)聚群行為:魚在游動過程中為了保證自身的生存和躲避危害會自然地聚集成群,魚聚群時所遵守的規則有三條:分隔規則:盡量避免與臨近伙伴過于擁擠;對準規則:盡量與臨近伙伴的平均方向一致;內聚規則:盡量朝臨近伙伴的中心移動。

3)追尾行為:當魚群中的一條或幾條魚發現食物時,其臨近的伙伴會尾隨其快速到達食物點。

4)隨機行為:單獨的魚在水中通常都是隨機游動的,這是為了更大范圍地尋找食物點或身邊的伙伴。

特點

1)具有較快的收斂速度,可以用于解決有實時性要求的問題;

2)對于一些精度要求不高的場合,可以用它快速的得到一個可行解;

3)不需要問題的嚴格機理模型,甚至不需要問題的精確描述,這使得它的應用范圍得以延伸。

停止條件

1) 判斷連續多次所得的均方差小于允許的誤差;

2)判斷某個區域的人工魚群的數目達到某個比率;

3)連續多次所獲取的值均不能超過已找到的極值。

4)迭代次數達到預設次數

一維函數尋優MATLAB代碼:

①main.m

MATLAB

clc

clear all

close all

tic

figure(1);hold on

ezplot('x*sin(10*pi*x)+2',[-1,2]);

%% 參數設置

fishnum=50; %生成50只人工魚

MAXGEN=50; %最多迭代次數

try_number=100;%最多試探次數

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); %每步中最優的函數值

BestX=-1*ones(1,MAXGEN); %每步中最優的自變量

besty=-100; %最優函數值

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('魚群算法迭代過程中最優坐標移動')

%% 優化過程圖

figure

plot(1:MAXGEN,BestY)

xlabel('迭代次數')

ylabel('優化值')

title('魚群算法迭代過程')

disp(['最優解X:',num2str(bestx,'%1.4f')])

disp(['最優解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]);

%%參數設置

fishnum=50;%生成50只人工魚

MAXGEN=50;%最多迭代次數

try_number=100;%最多試探次數

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);%每步中最優的函數值

BestX=-1*ones(1,MAXGEN);%每步中最優的自變量

besty=-100;%最優函數值

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('魚群算法迭代過程中最優坐標移動')

%%優化過程圖

figure

plot(1:MAXGEN,BestY)

xlabel('迭代次數')

ylabel('優化值')

title('魚群算法迭代過程')

disp(['最優解X:',num2str(bestx,'%1.4f')])

disp(['最優解Y:',num2str(besty,'%1.4f')])

toc

②dist.m

MATLAB

%計算第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

%計算第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 當前人工魚的序號

%visual 感知范圍

%step 最大移動步長

%deta 擁擠度

%try_number 最大嘗試次數

%LBUB 各個數的上下限

%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當前人工魚的序號

%visual感知范圍

%step最大移動步長

%deta擁擠度

%try_number最大嘗試次數

%LBUB各個數的上下限

%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 當前人工魚的位置

%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;

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

%隨機行為

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當前人工魚的位置

%ii當前人工魚的序號

%visual感知范圍

%step最大移動步長

%try_number最大嘗試次數

%LBUB各個數的上下限

%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

%隨機行為

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 產生的初始人工魚群

% example:

% Nfish=3;

% lb_ub=[-3.0,12.1,1;4.1,5.8,1];

%%這里的lb_ub是2行3列的矩陣,每行中前兩個數是范圍的上下限,第3個數是在該范圍內的數的個數

% X=Inital(Nfish,lb_ub)

%%就是產生[-3.0,12.1]內的數1個,[4.1,5.8]內的數1個

%%兩個數一組,這樣的數一共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產生的初始人工魚群

%example:

%Nfish=3;

%lb_ub=[-3.0,12.1,1;4.1,5.8,1];

%%這里的lb_ub是2行3列的矩陣,每行中前兩個數是范圍的上下限,第3個數是在該范圍內的數的個數

%X=Inital(Nfish,lb_ub)

%%就是產生[-3.0,12.1]內的數1個,[4.1,5.8]內的數1個

%%兩個數一組,這樣的數一共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 當前人工魚的序號

%visual 感知范圍

%step 最大移動步長

%deta 擁擠度

%try_number 最大嘗試次數

%LBUB 各個數的上下限

%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當前人工魚的序號

%visual感知范圍

%step最大移動步長

%deta擁擠度

%try_number最大嘗試次數

%LBUB各個數的上下限

%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)

%計算第i條魚與所有魚的位置,包括本身。

%輸入:

%Xi 第i條魚的當前位置

%X 所有魚的當前位置

% 輸出:

%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)

%計算第i條魚與所有魚的位置,包括本身。

%輸入:

%Xi第i條魚的當前位置

%X所有魚的當前位置

%輸出:

%D第i條魚與所有魚的距離

col=size(X,2);

D=zeros(1,col);

forj=1:col

D(j)=norm(Xi-X(:,j));

end

效果

參考文獻

Feng Shi. MATLAB 智能算法-30個案例分析[J]. 2015.

總結

以上是生活随笔為你收集整理的鱼群算法matlab代码,人工鱼群算法MATLAB实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。