hlayumi的个人空间 http://blog.eetop.cn/hslogic [收藏] [复制] [分享] [RSS]

日志

人工鱼群算法

热度 5已有 131 次阅读2019-5-16 00:30 |系统分类:芯片设计

clear
tic
varNum=2;                   %变量数
afNum=50;                   %人工鱼个数
iterativeTime=50;           %迭代次数          
lchrom=16;                  %染色体基因串的长度
visual=2.5;                 %感知距离             
step=0.3;                   %移动步长
crowd=0.618;                %拥挤度因子
try_number=50;              %随机选择次数
friend_number=50;
sim_model=4;
Xl=-5.12;
Xh=5.12;
X=af_init(afNum,varNum,Xl,Xh,lchrom);    %初始化
for i=1:afNum
    temp=[X(i,1),X(i,2)];
    tempconsistence(i)=functionconsistence(temp,sim_model);
end
foodconsistence=tempconsistence';%求食物浓度
[a,b]=max(foodconsistence);
Xmax=[X(b,1),X(b,2)];
Ymax=a;                   %初始公告板记录
k=0;
visualweak=0;
while(k<iterativeTime)
    for i=1:afNum    
    Xi=[X(i,1),X(i,2)];       %人工鱼当前状态
    nf1=0;
    Xc=0;
    for j=1:friend_number              %聚群行为开始
       Xj=[X(j,1),X(j,2)];
       if(norm(Xj-Xi)<visual)
       nf1=nf1+1;
       Xc=Xc+Xj;
       end
    end
    if(nf1>1)
     Xc=Xc/nf1;
     if((functionconsistence(Xc,sim_model)/nf1)>(crowd*functionconsistence(Xi,sim_model)))
        Xinext1=Xi+rand*step*(Xc-Xi)/norm(Xc-Xi);
        if (Xinext1(1)<Xl)
            Xinext1(1)=Xl;
        end
        if (Xinext1(1)>Xh)
            Xinext1(1)=Xh;
        end
        if (Xinext1(2)<Xl)
            Xinext1(2)=Xl;
        end
        if (Xinext1(2)>Xh)
            Xinext1(2)=Xh;
        end 
     else
       Xinext1=af_prey(Xi,try_number,sim_model,visualweak,visual,step);
        if (Xinext1(1)<Xl)
            Xinext1(1)=Xl;
        end
        if (Xinext1(1)>Xh)
            Xinext1(1)=Xh;
        end
        if (Xinext1(2)<Xl)
            Xinext1(2)=Xl;
        end
        if (Xinext1(2)>Xh)
            Xinext1(2)=Xh;
        end 
     end   
    end                             %聚群行为结束
   for j=1:friend_number              %追尾行为开始
     Xj=[X(j,1),X(j,2)];
     if((norm(Xj-Xi)<visual) & (functionconsistence(Xj,sim_model)>Ymax))
         Xmax=Xj;
         Ymax=functionconsistence(Xj,sim_model);
     end
   end
   if(Ymax>(functionconsistence(Xi,sim_model)))
        Xinext2=Xi+rand*step*(Xmax-Xi)/norm(Xmax-Xi);
        if (Xinext2(1)<Xl)
            Xinext2(1)=Xl;
        end
        if (Xinext2(1)>Xh)
            Xinext2(1)=Xh;
        end
        if (Xinext2(2)<Xl)
            Xinext2(2)=Xl;
        end
        if (Xinext2(2)>Xh)
            Xinext2(2)=Xh;
        end   
     else
       Xinext2=af_prey(Xi,try_number,sim_model,visualweak,visual,step);
         if (Xinext2(1)<Xl)
            Xinext2(1)=Xl;
        end
        if (Xinext2(1)>Xh)
            Xinext2(1)=Xh;
        end
        if (Xinext2(2)<Xl)
            Xinext2(2)=Xl;
        end
        if (Xinext2(2)>Xh)
            Xinext2(2)=Xh;
        end 
   end                                %追尾行为结束
   if((functionconsistence(Xinext1,sim_model))>(functionconsistence(Xinext2,sim_model)))
     X(i,1)=Xinext1(1);
     X(i,2)=Xinext1(2);
   else
     X(i,1)=Xinext2(1);
     X(i,2)=Xinext2(2);
   end
   end                                 %一次迭代结束  
   k=k+1;                             %进入下一次迭代
   visualweak=k/visual;
end   
Xmax
Ymax
toc

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

关闭

站长推荐上一条 /2 下一条

关于我们|联系我们|ET创芯网 ( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2019-8-23 19:19 , Processed in 0.030355 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

返回顶部