%BBO算法,主要是对消除重复样本的操作进行了改进,整理时间:2011.06.10
clear all
close all
G = 200; % 进化代数
Size = 50; % 种群规模
pmodify = 1; % 迁移概率
NumVar = 35; % 参数个数
Keep = 3; % 精因个数
pmutate = 0.05; % 变异概率
lambdaLower = 0.0; % 对于每个基因的最小迁入率
lambdaUpper = 1; % 对于每个基因的最大迁入率
dt = 1; % 步长
I = 1; % 对于每个栖息地的最大迁入率
e = 1; % 对于每个栖息地的最大迁出率
%确定每个参数的取值范围
for i=1:1:NumVar
MinX(i)=-32;
MaxX(i)=32;
end
%初始化种群
for i=1:1:NumVar
E=MinX(i)+(MaxX(i)-MinX(i))*rand(Size,i);
end
%求适应度值
for i=1:1:Size
Population(i).chrom=E(i,:);
p=Population(i).chrom;
Population(i).cost=Ackley(p);
end
%排序
Population = PopSort(Population);
%初始化种群概率
for j = 1 : Size
Prob(j) = 1 / Size;
end
%进化开始
for kg = 1:1:G
time(kg) = kg ;
%保存最优个体
for j = 1 : Keep
chromKeep(j,:) = Population(j).chrom;
costKeep(j) = Population(j).cost;
end
for i = 1 : length(Population)
%求种群数量
if Population(i).cost < inf
Population(i).SpeciesCount = Size - i;
else
Population(i).SpeciesCount = 0;
end
%计算每个栖息地的移入移出率
%余弦模型
lambda(i) = 0.5 * I * (cos(pi*Population(i).SpeciesCount / Size)+1);
mu(i) = 0.5 * e * (-cos(pi*Population(i).SpeciesCount / Size)+1);
%二次模型
% lambda(i) = I * (Population(i).SpeciesCount / Size -1)^2;
% mu(i) = e * (Population(i).SpeciesCount / Size )^2;
%指数模型
% lambda(i) = I * exp(-Population(i).SpeciesCount / Size);
% mu(i) = e * exp(Population(i).SpeciesCount / Size - 1) ;
%线性模型
% lambda(i) = I * (1 - Population(i).SpeciesCount / Size);
% mu(i) = e * Population(i).SpeciesCount / Size;
end
lambdaMin = min(lambda);
lambdaMax = max(lambda);
for k = 1:1 : Size
if rand > pmodify
continue;
end
%标准化移入率
lambdaScale = lambdaLower + (lambdaUpper - lambdaLower) * (lambda(k) - lambdaMin) / (lambdaMax - lambdaMin);
%迁移操作,概率的输入新的信息到栖息地i
for j = 1 : NumVar
if rand < lambdaScale
RandomNum = rand * sum(mu);
Select = mu(1);
SelectIndex = 1;
while (RandomNum > Select) & (SelectIndex < Size)
SelectIndex = SelectIndex + 1;
Select = Select + mu(SelectIndex);
end
Island(k,j) = Population(SelectIndex).chrom(j);
else
Island(k,j) = Population(k).chrom(j);
end
end
end
for j = 1 : 1 :Size
%余弦模型
lambdaMinus = 0.5 * I * (cos(pi*(Population(j).SpeciesCount-1) / Size)+1);
muPlus = 0.5 * e * (-cos(pi*(Population(j).SpeciesCount+1) / Size)+1);
%二次模型
% lambdaMinus = I * ((Population(j).SpeciesCount-1) / Size -1)^2;
% muPlus = e * ((Population(j).SpeciesCount+1) / Size )^2;
%指数模型
% lambdaMinus = I * exp(-(Population(j).SpeciesCount-1) / Size);
% muPlus = e * exp((Population(j).SpeciesCount+1) / Size - 1) ;
%线性模型
% lambdaMinus = I * (1 - (Population(j).SpeciesCount-1) / Size);
% muPlus = e * (Population(j).SpeciesCount+1) / Size;
if j < Size
ProbMinus = Prob(j+1);
else
ProbMinus = 0;
end
if j > 1
ProbPlus = Prob(j-1);
else
ProbPlus = 0;
end
ProbDot(j) = -(lambda(j) + mu(j)) * Prob(j) + lambdaMinus * ProbMinus + muPlus * ProbPlus;
end
% 计算每个栖息地的种群数量概率P(si)
Prob = Prob + ProbDot * dt;
Prob = max(Prob, 0);
Prob = Prob / sum(Prob);
%变异操作
Pmax = max(Prob);
MutationRate = pmutate * (1 - Prob / Pmax);
for k = (Size/2): 1: Size
for parnum = 1 : NumVar
if MutationRate(k) > rand
Island(k,parnum) = MinX(parnum)+(MaxX(parnum)-MinX(parnum))*rand;
end
end
end
for i=1:1:Size
Q(i)=Ackley(Island(i,:));
if Q(i)<Population(i).cost
Population(i).cost=Q(i);
Population(i).chrom=Island(i,:);
end
end
%排序
Population = PopSort(Population);
for k = 1 : Keep
Population(Size-k+1).chrom = chromKeep(k,:);
Population(Size-k+1).cost = costKeep(k);
end
%对超出取值范围的样本进行重新赋值
for i = 1 : Size
for k = 1 : NumVar
Population(i).chrom(k) = max(Population(i).chrom(k), MinX(k));
Population(i).chrom(k) = min(Population(i).chrom(k), MaxX(k));
end
end
%对相同的样本进行重新赋值
for i = 1 : length(Population)
Chrom1 = sort(Population(i).chrom);
for j = i+1 : length(Population)
Chrom2 = sort(Population(j).chrom);
if isequal(Chrom1, Chrom2)
parnum = ceil(length(Population(j).chrom) * rand);
Population(j).chrom(parnum) = min(Chrom1)+(max(Chrom2)-min(Chrom1))*rand;
end
end
end
BestJ(kg) = Population(1).cost;
kg %进化次数
BestJ(kg)
end
b=Population(1).chrom;
figure(1);
plot(time,BestJ);
title('最小误差进化过程')
xlabel('进化次数');
ylabel('最小误差');
save BBO b;
- 1
- 2
- 3
前往页