%%基本蝙蝠算法
function[best,fmin,N_iter]=bat(para)
if nargin<1
para=[10 0.25 0.5];
end
n=para(1); %种群数量,一般选取[10,25]
A=para(2); %音量,一般为常数或者递减
r=para(3); %脉冲率,一般为常数或者递减
%确定频率变化范围
Qmin=0;
Qmax=2;
%算法迭代参数设置
tol=0.00001; %算法结束误差
N_iter=0; %算法运行总次数
d=3; %解的维度
%数组初始化
Q=zeros(n,1); %频率值
v=zeros(n,d); %速度值
%初始化种群
for i=1:n
Sol(i,:)=randint(1,d);
Fitness(i)=Fun(Sol(i,:));
end
%找到当前最优解
[fmin,I]=min(Fitness);
best=Sol(I,:);
%迭代过程
while(fmin>tol)
for i=1:n
Q(i)=Qmin+(Qmin-Qmax)*rand;
v(i,:)=v(i,:)+(Sol(i,:)-best)*Q(i);
S(i,:)=Sol(i,:)+v(i,:);
if rand>r
S(i,:)=best+0.01*randint(1,d);
end
%新的适应度值
Fnew=Fun(S(i,:));
if(Fnew<=Fitness(i))&&(rand<A)
Sol(i,:)=S(i,:);
Fitness(i)=Fnew;
end
%更新当前最优解
if Fnew<=fmin
best=S(i,:);
fmin=Fnew;
end
end
N_iter=N_iter+n;
end
%结果显示
disp(['迭代次数:',num2str(N_iter)]);
disp(['最优解:',num2str(best),'最小值:',num2str(fmin)]);
%%计算目标函数值
function z=Fun(u)
z=(1-u(1))^2+100*(u(2)-u(1)^2)^2+(1-u(3))^2;