基于蛙跳算法的最优值计算matlab仿真

119 阅读3分钟

1.算法描述

 

9df15ccd3700dcd3035084dfc3b2b103_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

        蛙跳算法是基于种群进化的元启发式算法之一,通过模拟自然界中青蛙觅食过程中种群所体现出的交流与合作行为,以实现对问题的求解。在一片湿地中,分布着一群青蛙,每只青蛙有自己的想法,每只青蛙的想法则被定义为一个解。每只青蛙找到食物时,都会向其周围的青蛙传递信息,从而影响周围青蛙向其靠近,形成一个子种群(模因组)。可见,湿地中青蛙种群将形成多个这样的子种群。子种群内的青蛙相互影响,从而实现组内的局部搜索。当青蛙跳跃一定次数后,为了寻找更多的食物,所有青蛙将重新混合后再次形成子种群,寻找更多的食物。至此,完成种群的一次全局搜索。子种群局部搜索与整个种群全局搜索交替进行,从而实现对问题的求解。

 

       蛙跳算法(SFLA)是一种全新的启发式群体进化算法,具有高效的计算性能和优良的全局搜索能力。对混合蛙跳算法的基本原理进行了阐述,针对算法局部更新策略引起的更新操作前后个体空间位置变化较大,降低收敛速度这一问题,提出了一种基于阈值选择策略的改进蛙跳算法。通过不满足阈值条件的个体分量不予更新的策略,减小了个体空间差异,从而改善了算法的性能。数值实验证明了该改进算法的有效性,并对改进算法的阈值参数进行了率定。

       SFLA由Eusuff和Lansey为解决组合优化问题于2003年最先提出。作为一种新型的仿生物学智能优化算法,SFLA 结合了基于模因(meme)进化的模因演算法(MA,memeticalgorithm)和基于群体行为的粒子群算法(PSO,particle swarm optimization)2 种群智能优化算法的优点。该算法具有概念简单,调整的参数少,计算速度快,全局搜索寻优能力强,易于实现的特点。混合蛙跳算法主要应用于解决多目标优化问题,例如水资源分配、桥墩维修、车间作业流程安排等工程实际应用问题

58961004a7bc188029c376592ae06cf3_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

2.仿真效果预览

matlab2022a仿真结果如下:

 

2a0425a64a31553a94fcb132b949c27b_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

3.MATLAB核心程序 `%%产生初始青娃

F=m*n;

tic;

for i1=1:F

    p(i1,:)=pmax*rands(1,d);

end

%%全局迭代寻优

yy=zeros(1,MAXGEN);

for ii=1:MAXGEN    

    for i2=1:F

        fitness(i2)=fun(p(i2,:));

    end

    %排序,找最好的,并分组

    [fitsort,index]=sort(fitness);

    for i3=1:F

        x(i3,:)=p(index(i3),:);

    end

    gx=x(1,:);%种群内最好的青娃

    yy(ii)=fitsort(1);

    % yy(ii)=fun(x(1,:));

  %   local=zeros(n,d);

    for i4=1:m

      local = p(i4:m:end,:);

        for j=1:Ne %每组青蛙迭代次数

            pb=local(1,:);%组内最优

            pw=local(n,:);%组内最差

            s1=rand.*(pb-pw);%采用组内最优更新

            s1(find(s1>smax))=smax;

            temp= pw+s1;

          temp(find(temp>pmax))=pmax;

           temp(find(temp<pmin))=pmin;

           if fun(temp) > fun(pw)

               s1=rand.*(gx-pw);%采用全局最优更新

                s1(find(s1>smax))=smax;

               temp=pw+s1;

                 temp(find(temp>pmax))=pmax;

          temp(find(temp<pmin))=pmin;

           end

           if fun(temp)>fun(pw)

            s1=pmax*rands(1,d);%随机更新

             s1(find(s1>smax))=smax;

             temp=pw+s1;

             temp(find(temp>pmax))=pmax;

            temp(find(temp<pmin))=pmin;

            end

             local(n,:) = temp;

             for loc=1:n

             fitlocal(loc)=fun(local(loc,:));

             end

             [localsort,indexlocal]=sort(fitlocal);

             for loc=1:n

               localnew(loc,:) = local(indexlocal(loc),:);

              end    

             local=localnew;

        end   %结束Ne

             p(i4:m:end,:) =local;

    end    %结束m

  %最好的青娃适配值

end  %结束MAXGEN

toc`