⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 afsa.m

📁 在matlab环境下用智能算法--人工鱼群算法求函数极值的matlab程序
💻 M
字号:
function r=AFSA()
N=20;    % N为鱼规模,即鱼的条数 
visual=1; % visual为可视范围
step=0.01; % step 为步长
maxnum=50; % maxnum 为最大迭代次数

x=10*rand(1,20); % x为初始群体----定义域上的20个随机自变量值

% 创建公告板记录 g, root
[ymax,index]=max(f(x)); % g为初始群体中的最好适应度值,index为其相应的下标值
xmax=x(index); % root 为g对应的自变量值

%画函数图形
fplot('f',[0 10])  % 与 ezplot('f',0,10) 结果相同
hold on

% 开始迭代
num=0;     % num 为当前迭代次数
while (num<maxnum)
  for i=1:N
           nf=0;  % nf为当前鱼周围可视范围内的伙伴鱼的条数(不含当前鱼)
           xc=0;  % xc 为当前鱼可视范围内伙伴鱼的中心位置
            for j=1:N
                if abs(x(i)-x(j))>0 & abs(x(i)-x(j))<visual
                   xc=xc+x(j);
                   nf=nf+1;
                end
            end
            xc=xc/nf;  %找到伙伴鱼的中心位置            
            if f(xc)>f(x(i))
               xsnext(i)=x(i)+rand*step*(xc-x(i));
            else
               xsnext(i)=Prey(x(i));
            end%聚群行为结束
       
            xmax=x(i);
             fmax=f(x(i));
            for j=1:N
                if abs(x(i)-x(j))>0 & abs(x(i)-x(j))<visual & f(x(j))>fmax
                    xmax=x(j);
                   fmax=f(x(j));
                end
            end
            if xmax~=x(i)
                xfnext(i)=x(i)+rand*step*(xmax-x(i));
                if xfnext(i)>10
                     xfnext(i)=10;
                elseif xfnext(i)<0
                     xfnext(i)=0;
                 end
            else
                xfnext(i)=Prey(x(i));
            end
            %追尾行为结束                                        
            
            % fsnext(i)=f(xsnext(i));
            % ffnest(i)=f(xfnext(i));
            xnext=zeros(1,20);
            if f(xsnext(i))>f(xfnext(i))
                 xnext(i)=xsnext(i);
            else
                 xnext(i)=xfnext(i);
            end
            
            x(i)=xnext(i);  % 更新下一次迭代的初始值
  end  % 一次迭代结束
  
  %画迭代过程
  plot(xnext,f(xnext),'.')
  hold on
  %pause
 
  % 找出当前迭代中最好的,如果其比公告板上的记录还好,就用其代替公告板上的记录
  for i=1:N
       if f(xnext(i))>ymax
            ymax=f(xnext(i));
            xmax=xnext(i);
       end
   end
    num=num+1; %进入下一次迭代
end   

% 显示公告板记录
xmax
ymax 
num
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -