📄 afsa.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 + -