19人工蜂群算法ABC函数优化--视频分享
19人工蜂群算法ABC函数优化:百度网盘链接:链接:http://pan.baidu.com/s/1ge8nCVT 密码:5h8n
具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1
ABC算法的实现步骤,具体过程如下:Step1:随机产生CSN(蜂群规模)个初始解,将其中一半与采蜜蜂对应,并计算各个解的适应度值,将最优解记录下来;Step2:置Cycle=1;Step3:采蜜蜂进行邻域搜索产生新解;Step4:计算相关的选择概率;Step5:观察蜂根据轮盘赌选择法以概率选择食物源,并进行邻域搜索产生新解 ,计算适应度值;Step6:判断是否有要放弃的解,如果存在,则进行随机搜索产生一个新解替换旧解;Step7:记录迄今为止最好的解;Step8:Cycle = Cycle +1,若Cycle<MCN,则转Step3;否则,输出最优结果。蜜蜂执行搜索活动的过程可概括为:(1)采蜜蜂确定蜜源,对其进行开采并记忆蜜源的相关信息,与观察蜂共同分享它们所开采的蜜源的相关信息;(2)观察蜂以一定的选择策略在邻近的蜜源里选择蜜源;(3)被放弃的蜜源处的采蜜蜂转变为侦察蜂,并且开始随机搜索新的蜜源。
人工蜂群算法ABC函数优化PDF文档如下:链接:http://pan.baidu.com/s/1qXQmiVq 密码:8tak
具体的代码如下:% 人工蜂群算法
clc,clear,close all
warning off
feature jit off
tic
% 算法参数
NP=20; % 蜂群大小
FoodNumber=NP/2; % 蜂群食物源数量,也就是产生 解 的个数
limit=100; % 经过“limit”次采蜜蜂和观察蜂的循环搜索之后,不能够被改进,那么该位置将被放弃
maxCycle=500; % 最大迭代循环
%/* Problem specific variables*/
objfun='Sphere'; % 待优化函数
D=100; % 未知数为100个
ub=ones(1,D)*100; % 未知量取值下边界
lb=ones(1,D)*(-100); % 未知量取值上边界
runtime=1; % 算法运行次数,一般设置1即可
GlobalMins=zeros(1,runtime); % 适应度最小值初始化
for r=1:runtime
% 初始化变量值
Range = repmat((ub-lb),); % 最大值
Lower = repmat(lb, ); % 最小值
Foods = rand(FoodNumber,D) .* Range + Lower;% 初始化个体
ObjVal=feval(objfun,Foods); % 目标函数值
Fitness=calculateFitness(ObjVal); % 适应度值,取其导数,为最小值
% 设定拖尾矩阵,初始化
trial=zeros(1,FoodNumber);
% 找到最好的食物源
BestInd=find(ObjVal==min(ObjVal));
BestInd=BestInd(end);
GlobalMin=ObjVal(BestInd); % 函数值最小
GlobalParams=Foods(BestInd,:); % 相应的食物源个体
iter=1;
while ((iter <= maxCycle)),% 迭代开始
% 采蜜蜂
for i=1:(FoodNumber)
% 参数随机可变
Param2Change=fix(rand*D)+1;
% 随机选择相连个体
neighbour=fix(rand*(FoodNumber))+1;
% 随机选择的个体不等于i
while(neighbour==i)
neighbour=fix(rand*(FoodNumber))+1;
end;
sol=Foods(i,:);% 个体选择
%/*v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) */
sol(Param2Change)=Foods(i,Param2Change)+(Foods(i,Param2Change)-Foods(neighbour,Param2Change))*(rand-0.5)*2;
% 个体取值范围约束
ind=find(sol<lb); % 最小值约束
sol(ind)=lb(ind);
ind=find(sol>ub); % 最大值约束
sol(ind)=ub(ind);
% 估计新的目标函数值和适应度值
ObjValSol=feval(objfun,sol);
FitnessSol=calculateFitness(ObjValSol);
% 更新最优个体值
if (FitnessSol>Fitness(i)) % 如果新产生的个体值适应度值越大,则表明函数值越小,则个体最优
Foods(i,:)=sol;
Fitness(i)=FitnessSol;
ObjVal(i)=ObjValSol;
trial(i)=0;
else
trial(i)=trial(i)+1; % /*if the solution i can not be improved, increase its trial counter*/
end;
end;
% 观察蜂
% 计算概率
% 观察蜂根据与蜜源相关的概率值选择蜜源,概率值计算公式
% prob(i)=a*fitness(i)/max(fitness)+b*/
prob=(0.9.*Fitness./max(Fitness))+0.1;
i=1;
t=0;
while(t<FoodNumber)
if(rand<prob(i))
t=t+1;
% 继续随机选择个体
Param2Change=fix(rand*D)+1;
% 随机选择相连个体
neighbour=fix(rand*(FoodNumber))+1;
% 随机选择的个体不等于i
while(neighbour==i)
neighbour=fix(rand*(FoodNumber))+1;
end;
sol=Foods(i,:); % 个体选择
%/*v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) */
sol(Param2Change)=Foods(i,Param2Change)+(Foods(i,Param2Change)-Foods(neighbour,Param2Change))*(rand-0.5)*2;
% 个体取值范围约束
ind=find(sol<lb); % 最小值约束
sol(ind)=lb(ind);
ind=find(sol>ub); % 最大值约束
sol(ind)=ub(ind);
% 估计新的目标函数值和适应度值
ObjValSol=feval(objfun,sol);
FitnessSol=calculateFitness(ObjValSol);
% 更新最优个体值
if (FitnessSol>Fitness(i)) %如果新产生的个体值适应度值越大,则表明函数值越小,则个体最优
Foods(i,:)=sol;
Fitness(i)=FitnessSol;
ObjVal(i)=ObjValSol;
trial(i)=0;
else
trial(i)=trial(i)+1; % /*if the solution i can not be improved, increase its trial counter*/
end;
end;
i=i+1;
if (i==(FoodNumber)+1)
i=1;
end;
end;
% 记录最好的目标函数值
ind=find(ObjVal==min(ObjVal));
ind=ind(end);
if (ObjVal(ind)<GlobalMin)
GlobalMin=ObjVal(ind); % 最优目标函数值
GlobalParams=Foods(ind,:); % 最优个体
end;
% 侦察蜂
% 如果某一次循环拖尾次数大于设定limit,则重新更新个体,重新计算
ind=find(trial==max(trial));
ind=ind(end);
if (trial(ind)>limit)
Bas(ind)=0;
sol=(ub-lb).*rand(1,D)+lb;
ObjValSol=feval(objfun,sol);
FitnessSol=calculateFitness(ObjValSol);
Foods(ind,:)=sol;
Fitness(ind)=FitnessSol;
ObjVal(ind)=ObjValSol;
end;
fprintf('iter=%d ObjVal=%g\n',iter,GlobalMin);
iter=iter+1;
end % End of ABC
GlobalMins(r)=GlobalMin;
end; % end of runs
toc
% save all
disp('最优解为:')
GlobalParams
disp('最优目标函数值为:')
GlobalMin简化的代码如下:% 人工蜂群算法函数寻优
% ABC算法
clc,clear,close all
warning off
format longG
% ABC 参数初始化
maxiter = 20;% 迭代次数
sizepop = 10;% 种群数量
popmin1 = -1;popmax1 = 1; % x1
popmin2 = -1;popmax2 = 1; % x2
trail(1:sizepop,1) = 0; % 未找到更优解的迭代次数
limit = sizepop; % 拖尾最大次数
% 初始化种群
for i=1:sizepop
x1 = popmin1+(popmax1-popmin1)*rand;
x2 = popmin2+(popmax2-popmin2)*rand;
pop(i,:) = ;
fitness(i) = fun();% 适应度函数值--目标函数值--最小目标函数值
end
% 记录一组最优值
=min(fitness);
zbest=pop(bestindex,:); %全局最佳
fitnesszbest=bestfitness; %全局最佳适应度值
% 迭代寻优
for i=1:maxiter
% 采蜜峰开始工作
for j=1:sizepop
% 选择采蜜的个体
x2y = randi(2); % 两个未知数
% 选择相连的种群
neighbour = randi(sizepop);
% neighbour != j
while( neighbour==j)
neighbour = randi(sizepop);
end
% 种群更新(解)
tempx = pop(j,:);% 当前的解
tempx(x2y) = pop(j,x2y) + (pop(j,x2y)-pop(neighbour,x2y))*(rand-0.5)*2;
% tempx(x2y) = pop(j,x2y) + (pop(j,x2y)-pop(neighbour,x2y))*rand;
% x1越界限制
if tempx(1)>popmax1
tempx(1)=popmax1;
end
if tempx(1)<popmin1
tempx(1)=popmin1;
end
% x2越界限制
if tempx(2)>popmax2
tempx(2)=popmax2;
end
if tempx(2)<popmin2
tempx(2)=popmin2;
end
% 适应度更新
temp_fitness = fun( tempx );% 当前的适应度函数值--目标函数值--最小目标函数值
% 比较个体间比较
if temp_fitness<fitness(j)
fitness(j) = temp_fitness;
pop(j,:) = tempx;
end
if temp_fitness<bestfitness
bestfitness = temp_fitness;
zbest =tempx;
end
end
% 观察峰
% 计算概率
prob = 0.9*fitness./max(fitness) + 0.1;
for j=1:sizepop
if(rand<prob(j))
% 选择采蜜的个体
x2y = randi(2); % 两个未知数
% 选择相连的种群
neighbour = randi(sizepop);
% neighbour != j
while( neighbour==j)
neighbour = randi(sizepop);
end
% 种群更新(解)
tempx = pop(j,:);% 当前的解
tempx(x2y) = pop(j,x2y) + (pop(j,x2y)-pop(neighbour,x2y))*(rand-0.5)*2;
% tempx(x2y) = pop(j,x2y) + (pop(j,x2y)-pop(neighbour,x2y))*rand;
% x1越界限制
if tempx(1)>popmax1
tempx(1)=popmax1;
end
if tempx(1)<popmin1
tempx(1)=popmin1;
end
% x2越界限制
if tempx(2)>popmax2
tempx(2)=popmax2;
end
if tempx(2)<popmin2
tempx(2)=popmin2;
end
% 适应度更新
temp_fitness = fun( tempx );% 当前的适应度函数值--目标函数值--最小目标函数值
% 比较个体间比较
if temp_fitness<fitness(j)
fitness(j) = temp_fitness;
pop(j,:) = tempx;
end
if temp_fitness<bestfitness
bestfitness = temp_fitness;
zbest =tempx;
else
trail(j) = trail(j)+1;
end
end
end
% 侦察峰开始工作
= max(trail);
index = index(1);
if(maxTrial(1)>limit)
x1 = popmin1+(popmax1-popmin1)*rand;
x2 = popmin2+(popmax2-popmin2)*rand;
pop(index,:) = ;
fitness(index) = fun();% 适应度函数值--目标函数值--最小目标函数值
end
fitness_iter(i) = bestfitness;
end
disp('最优解')
disp(zbest)
fprintf('\n')
figure('color',)
plot(fitness_iter,'ro-','linewidth',2)
figure('color',)
loglog(fitness_iter,'ro-','linewidth',2)
axis tight
谢谢楼主,刚开始学习,多多交流 呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜 非常好,谢谢分享 感谢分享,学习ABC算法。 想学人工蜂群算法,谢谢分享 谢谢楼主分享 感谢楼主! 非常好的代码,谢谢 谢谢分享,好好学习,天天巡航上
页:
[1]
2