matlab norm函数使用_Matalab 人工鱼群算法(子函数)

人工鱼群算法

1.  基于动物行为的群体智能优化算法

2.  鱼群的行为主要有:觅食、聚群、追尾、随机行为

91ffa8ead3a1ec168d3a071f51d3f7b1.png

3.  面向问题:二元函数的优化

44d66c1f403daac92593fdb88b4695e9.png

4.  主要的判断式(聚群和追尾行为):

d5607419cd348142ee3aa281044749cb.png

其中Yc为新位置产生的函数值,Yi为上一个位置,ni为视野内伙伴数量。

5.  代码主体部分来自书本:《MATLAB智能算法30个案例分析(第2版)》

算法中子函数(单独保存成函数名的m文件):

NO.1     觅食行为

----------------------------------

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;

    %在其视野范围内随机选择一个位置,随机数的范围为(-1,1)

    Yj=AF_food(Xj);

    if Yi

        Xnext = AF_update(Xi,Xj,step,LBUB);

        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_food(Xnext);

NO.2  聚群行为

----------------------------------

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=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_food(Xc);

    Yi=lastY(i);

    if Yc/nf>deta*Yi

        Xnext = AF_update(Xi,Xc,step,LBUB);

        Ynext=AF_food(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

NO.3 函数值计算

----------------------------------

function Y = AF_food(X)

%计算人工鱼当前位置的食物浓度,即为要处理的函数表达式

num = size(X,2);

Y = zeros(1,num);

for i=1:num

    Y(1,i) = (sin(X(1,i))/X(1,i))*(sin(X(2,i))/X(2,i));

end

NO.4 位置更新

----------------------------------

function Xnext = AF_update(Xi,Xcho,step,LBUB)

%用来更新位置

Xnext=Xi+rand*step*(Xcho-Xi)/norm(Xcho-Xi); %norm求解范数,默认二范数

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

NO.5 初始化函数

----------------------------------

function X=AF_init(Nfish,lb_ub)

%输入:

% Nfish 鱼群大小

% lb_ub 鱼的活动范围

%输出:

% X 产生的初始人工鱼群

%%lb_ub每行中前两个数是范围的上下限,第3个数自变量的维数

lb=lb_ub(1);

ub=lb_ub(2);

nr=lb_ub(3);

X=zeros(nr,Nfish);

for j=1:nr

    X(j,:)=lb+(ub-lb)*rand(1,Nfish);

    %X(j,:) = unifrnd(lb,ub,[1,Nfish]); 其实直接产生范围内的随机数也可以

end

NO.5 追尾函数

----------------------------------

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=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 = AF_update(Xi,Xmax,step,LBUB);

        Ynext=AF_food(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

用来对比的一个小程序

----------------------------------

clc

clear all;

[X,Y] = meshgrid(-10:0.1:10);

Z=(sin(X)./X).*(sin(Y)./Y);

mesh(X,Y,Z)

hold on

[max_value,index] = max(Z(:)) 

[I_row, I_col] = ind2sub(size(Z),index);

%ind2sub将线性化索引转换成下标

disp(['最大值点X:',num2str(X(I_row,I_col))]); %因为函数是对称的

disp(['最大值点Y:',num2str(Y(I_row,I_col))]);

plot3(X(I_row,I_col),Y(I_row,I_col),max_value,'r*','MarkerSize',10)

%plot3(-0.0068486,-0.0068486,0.99998,'bo','MarkerSize',10)

%可以把鱼群算法的最大值点数值代入对比一下

主函数代码会另放一篇文章中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值