算法流程
背包问题
Matlab 代码
%% 二进制蝙蝠算法
%初始化种群
r = 0.7;
narvs = 10; %问题的维度
n = 100;
dim = narvs;
maxgen = 100;
populationSize = 100;
Qmin=0; % Frequency minimum 频率最小值
Qmax=2; % Frequency maximum 频率最大值
Q=zeros(n,1); % Frequency
v=zeros(n,dim); % Velocities 速度
cg_curve=zeros(1,maxgen);
x = randsrc(n,narvs,[0,1;0.5,0.5]);
%计算适应度值
fitness =targetPackage(x',100);
%找到当前最好
[fmax,I]=max(fitness);
best=x(I,:);
A = 0.6;
bestfit = zeros(maxgen,1);
for i = 1:maxgen
cg_curve(i)=fmax; %当前值
for j = i:populationSize
for d = 1:dim
Q(i) = Qmin+(Qmin-Qmax)*rand; %更新频率
v(j,d) = v(j,d)+(x(j,d)-best(d))*Q(j); %更新速度
% V型的转换函数,很多采用的是西格玛函数用于速度到位置的离散转换
V_shaped_transfer_function=abs((2/pi)*atan((pi/2)*v(j,d)));
if rand<V_shaped_transfer_function % Equation 10 in the paper
x(j,d)=~x(j,d);
else
x(j,d)=x(j,d);
end
if rand > r % Pulse rate ()
x(j,d)=best(d);
end
end
Fnew = targetPackage(x(j,:)',1);
if (Fnew >= fitness(j,:))&&(rand < A)
x(j,:)=x(j,:);
fitness(j,:) = Fnew;
end
if Fnew>=fmax
best=x(j,:);
fmax=Fnew;
end
end
bestfit(i,:) = fmax;
end
targetPackage(best',1)
plot(bestfit)
目标函数
function fitness = targetPackage(x,indNum)
%targetPackage 此处显示有关此函数的摘要
% X:表示种群
volume=[95 75 23 73 50 22 6 57 89 98]; %物品体积
value=[89 59 19 43 100 72 44 16 7 64]; %物品价值
Weight=300; %背包重量
% a = zeros(indNum,1);
% for i=1:indNum
% a(i,1) = volume*x(:,i);
% end
%超过总重量的个体的适应度值都视为0
k = find(volume*x<Weight);
fitness=zeros(indNum,1);
for j=1:size(k,2)
fitness(k(j),1) = value*x(:,k(j));
end
end
仿真结果
参考文献
[1] Mirjalili, Seyedali, Seyed Mohammad Mirjalili, and Xin-She Yang. 2014. “Binary Bat Algorithm.” Neural Computing and Applications 25 (3): 663–81.