打字猴:1.701011644e+09
1701011644 运行程序输出图形如图10-11所示。
1701011645
1701011646
1701011647
1701011648
1701011649 图10-11 待寻优函数
1701011650
1701011651 该函数存在一个极大值点,因此,采用人工鱼群算法进行函数寻优,应该找到该极大值点,人工鱼群算法程序如下:
1701011652
1701011653     clc,clear,close all                 %清屏和清除变量    warning off                         %消除警告    tic                                 %开始计时    figure(1);hold on                   %新建图形窗口,并设置图形保持句柄    %%参数设置    fishnum=100;                        %生成100只人工鱼    MAXGEN=50;                          %最多迭代次数    try_number=100;                     %最多试探次数    visual=1;                           %感知距离    delta=0.618;                        %拥挤度因子    step=0.1;                           %步长        %%初始化鱼群    lb_ub=[-10,10,2;];    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(2,MAXGEN);            %每步中最优的自变量    besty=-100;                         %最优函数值    Y=AF_foodconsistence(X);            %待优化目标函数    while gen<=MAXGEN        disp([‘迭代步数:  ‘,num2str(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);                                                  %图形窗口(1)        plot(X(1,index),X(2,index),’.’,‘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),bestx(2),‘ro’,‘MarkerSize’,100)               %绘制最优个体图形    xlabel(‘x’)                                                 %x轴标记    ylabel(‘y’)                                                 %y轴标记    title(‘鱼群算法迭代过程中最优坐标移动’)        %%优化过程图    figure    plot(1:MAXGEN,BestY)    xlabel(‘迭代次数’)    ylabel(‘优化值’)    title(‘鱼群算法迭代过程’)    disp([‘最优解X: ‘,num2str(bestx’,’%1.5f   ‘)])    disp([‘最优解Y: ‘,num2str(besty,’%1.5f\n’)])    toc                                        %结束计时
1701011654
1701011655 相应的待优化函数即适应度函数如下:
1701011656
1701011657     function [Y]=AF_foodconsistence(X)    fishnum=size(X,2);    for i=1:fishnum        Y(1,i)=sin(X(1,i))/X(1,i)*sin(X(2,i))/X(2,i);    %目标函数    end
1701011658
1701011659 考虑鱼群的聚群行为如图10-12所示。
1701011660
1701011661
1701011662
1701011663
1701011664 图10-12 鱼群聚群行为
1701011665
1701011666
1701011667 鱼在游动过程中为了保证自身的生存和躲避危害会自然地聚集成群。鱼聚群时所遵守的规则有三条:分割规则、对准规则和内聚规则。人工鱼xi搜索其视野内的伙伴数目n及中心位置xj,若,表明伙伴中心位置状态较优且不太拥挤,则xi朝伙伴的中心位置xi移动一步,否则执行觅食行为。
1701011668
1701011669 鱼群的聚群行为编程如下:
1701011670
1701011671     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 & D0        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)
1701011672
1701011673 考虑鱼群的追尾行为如图10-13所示。
1701011674
1701011675
1701011676
1701011677
1701011678 图10-13 鱼群追尾行为
1701011679
1701011680
1701011681 追尾行为指鱼向其可视区域内的最优方向移动的一种行为。人工鱼xi搜索其视野内所有伙伴中的函数最优伙伴xi,如果,表明最优伙伴的周围不太拥挤,则人工鱼xi朝函数最优伙伴xi移动一步,否则执行觅食行为。
1701011682
1701011683 鱼群的追尾行为编程如下:
1701011684
1701011685     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 & D0        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):,i),i,visual,step,try_number,LBUB,         lastY);        end    else        [Xnext,Ynext]=AF_prey(X(:,i),i,visual,step,try_number,LBUB,lastY);    end
1701011686
1701011687 求解完成,相应的画图程序如下:
1701011688
1701011689     %%画图显示    figure(‘color’,[1,1,1])                                     %设置图形背景为白色    [X1,X2] = meshgrid(-10:0.1:10,-10:0.1:10);                  %平面栅格化    Y=sin(X1)./X1.*sin(X2)./X2;                                 %目标函数    mesh(X1,X2,Y)                                               %曲面    hold on                                                     %图形保持句柄    plot3(bestx(1),bestx(2),besty,‘b.’,‘Markersize’,40)         %画图
1701011690
1701011691 运行程序输出结果如下:
1701011692
1701011693     最优解X: 0.00906   0.01187    最优解Y: 0.99996    时间已过 6.528033 秒。
[ 上一页 ]  [ :1.701011644e+09 ]  [ 下一页 ]