ABC算法
来源:互联网 发布:淘宝茶叶店模板 编辑:程序博客网 时间:2024/06/05 07:37
ABC(Artificial Bee Colony)算法,人工蜂群算法,是由Karaboga于2005年提出的一种新颖的基于群智能的全局优化算法,来源于蜂群的采蜜行为,蜜蜂根据各自的分工进行不同的活动,并实现蜂群信息的共享和交流,从而找到问题的最优解。人工蜂群算法属于群智能优化算法的一种。
该方法主要分为三个阶段:采蜜蜂发现新的蜜源、观察蜂根据采蜜蜂的蜜源寻找新的蜜源,侦查蜂寻找新的蜂源代替多次没有更新的蜜源;
算法流程如下:
1、初始化蜜源及其花蜜量(自变量向量及对应的适应度函数值),最优的蜜源和花蜜量;
2、对于每一个蜜源:利用当前蜜源信息、任一蜜源(随机选择)和最优蜜源寻找新的蜜源,选择更新,同时记录每个蜜源未更新的次数到,同时更新蜂群最优蜜源及花蜜量;
3、对于每一个蜜源:以一定概率更新每个蜜源,这个概率和每个蜜源的花蜜量相关,花蜜量越大的蜜源被更新的可能性越大,同时更新蜂群最优蜜源及花蜜量;;
4、统计每个蜜源更新的次数,最大未更新次数查过预定值,随机初始化蜜源信息;
5、达到终止条件结束,输出最优蜜源和花蜜量;否则转至步骤2;
附一个简单的ABC代码:
function [best_x,best_f,FEs_cut,avgErr_FEs,bestErr_FEs,sussFlag]= ABC(D,Max_FEs,func_num,LB,UB,opt_f,err)%by zxr 2017/3NP = D; %No. of foodsSF = 1;limit = 200;FoodNumber=ceil(NP/2); %/*The number of food sources equals the half of the colony size*/% avgErr_FEs = -1*ones(1,Max_FEs);% bestErr_FEs = -1*ones(1,Max_FEs);% limit=FoodNumber*D;% /*All food sources are initialized */%/*Variables are initialized in the range [LB,UB]. If each parameter has different range, use arrays LB[j], UB[j] instead of LB and UB */%/* Control Parameters of ABC algorithm*/Range = UB-LB;Lower = LB;% ObjVal=benchmark_func(Foods, func_num);for FoodID = 1:FoodNumber Foods(FoodID,:) = rand(1,D) .* Range + Lower; ObjVal(FoodID) = func(Foods(FoodID,:), func_num, opt_f);endFEs = FoodNumber;Fitness=calculateFitness(ObjVal);%reset trial counterstrial=zeros(1,FoodNumber);%/*The best food source is memorized*/BestInd=find(ObjVal==min(ObjVal));BestInd=BestInd(end);GlobalMin=ObjVal(BestInd);GlobalParams=Foods(BestInd,:);avgErr_FEs(1:FEs)= mean(ObjVal);bestErr_FEs(1:FEs)= GlobalMin ;stop = 0;FEs_cut = -1;sussFlag = 0;while (stop < 1 ),%%%%%%%%% EMPLOYED BEE PHASE %%%%%%%%%%%%%%%%%%%%%%%% for i=1:(FoodNumber) %/*A randomly chosen solution is used in producing a mutant solution of the solution i*/ neighbour=fix(rand*(FoodNumber))+1; %/*Randomly selected solution must be different from the solution i*/ while(neighbour==i) neighbour=fix(rand*(FoodNumber))+1; end; sol=Foods(i,:); for j=1:D sol(j)=Foods(i,j)+(Foods(i,j)-Foods(neighbour,j))*(rand-0.5)*2 * SF; end % /*if generated parameter value is out of boundaries, it is shifted onto the boundaries*/ ind=find(sol<LB); sol(ind)=LB(ind); ind=find(sol>UB); sol(ind)=UB(ind); %evaluate new solution ObjValSol=func(sol, func_num,opt_f); FEs = FEs + 1; if (FEs>Max_FEs) % Too many FE stop=1; break; end if GlobalMin <= err && ~sussFlag sussFlag = 1; FEs_cut = FEs; end FitnessSol=calculateFitness(ObjValSol); % /*a greedy selection is applied between the current solution i and its mutant*/ if (FitnessSol>Fitness(i)) %/*If the mutant solution is better than the current solution i, replace the solution with the mutant and reset the trial counter of solution 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; avgErr_FEs(FEs)= mean(ObjVal) ; bestErr_FEs(FEs)= GlobalMin ; end;%%%%%%%%%%%%%%%%%%%%%%%% CalculateProbabilities %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/* A food source is chosen with the probability which is proportioal to its quality*/%/*Different schemes can be used to calculate the probability values*/%/*For example prob(i)=fitness(i)/sum(fitness)*/%/*or in a way used in the metot below prob(i)=a*fitness(i)/max(fitness)+b*/%/*probability values are calculated by using fitness values and normalized by dividing maximum fitness value*/prob=(0.9.*Fitness./max(Fitness))+0.1;%%%%%%%%%%%%%%%%%%%%%%%% ONLOOKER BEE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%i=1;t=0;while(t<FoodNumber) if(rand<prob(i)) t=t+1; %/*A randomly chosen solution is used in producing a mutant solution of the solution i*/ neighbour=fix(rand*(FoodNumber))+1; %/*Randomly selected solution must be different from the solution i*/ while(neighbour==i) neighbour=fix(rand*(FoodNumber))+1; end; sol=Foods(i,:); for j=1:D sol(j)=Foods(i,j)+(Foods(i,j)-Foods(neighbour,j))*(rand-0.5)*2 * SF; end % /*if generated parameter value is out of boundaries, it is shifted onto the boundaries*/ ind=find(sol<LB); sol(ind)=LB(ind); ind=find(sol>UB); sol(ind)=UB(ind); %evaluate new solution ObjValSol=func(sol, func_num,opt_f); FEs = FEs + 1; if (FEs>Max_FEs) % Too many FE stop=1; break; end if GlobalMin <= err && ~sussFlag sussFlag = 1; FEs_cut = FEs; end FitnessSol=calculateFitness(ObjValSol); % /*a greedy selection is applied between the current solution i and its mutant*/ if (FitnessSol>Fitness(i)) %/*If the mutant solution is better than the current solution i, replace the solution with the mutant and reset the trial counter of solution 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; avgErr_FEs(FEs)= mean(ObjVal) ; bestErr_FEs(FEs)= GlobalMin ; end; i=i+1; if (i==(FoodNumber)+1) i=1; end; end; %/*The best food source is memorized*/ ind=find(ObjVal==min(ObjVal)); ind=ind(end); if (ObjVal(ind)<GlobalMin) GlobalMin=ObjVal(ind); GlobalParams=Foods(ind,:); end;%%%%%%%%%%%% SCOUT BEE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/*determine the food sources whose trial counter exceeds the "limit" value. %In Basic ABC, only one scout is allowed to occur in each cycle*/ind=find(trial==max(trial));ind=ind(end);if (trial(ind)>limit) trial(ind)=0;%Bas(ind)=0; sol=(UB-LB).*rand(1,D)+LB; ObjValSol=func(sol, func_num,opt_f); FEs = FEs + 1; if (FEs>Max_FEs) % Too many FE stop=1; break; end if GlobalMin <= err && ~sussFlag sussFlag = 1; FEs_cut = FEs; end FitnessSol=calculateFitness(ObjValSol); Foods(ind,:)=sol; Fitness(ind)=FitnessSol; ObjVal(ind)=ObjValSol; avgErr_FEs(FEs)= mean(ObjVal) ; bestErr_FEs(FEs)= GlobalMin ; end;if ( (FEs>=Max_FEs ) )%||((GlobalMin-opt_f) <=err) stop=1; endend % End of ABCbest_x =GlobalParams;best_f = GlobalMin;
0 0
- ABC算法
- ABC算法
- 人工蜂群算法(ABC算法)
- 优化算法—人工蜂群算法(ABC)
- abc
- abc
- abc
- abc
- abc
- abc
- abc
- abc
- abc
- abc
- abc
- abc
- ABC
- ABC
- Android倒计时!
- 0313-列表标签应用实例与解释
- BIOS+UEFI双启动镜像备忘录
- 第一部分:基本功能
- 工作的一半或者更多时间在为同伴或者自己填坑
- ABC算法
- Cookie(一)---宏观了解
- Fiddler小技巧之URL替换
- JAVA时间对象---字符串转日期,日期转字符串
- TCP协议
- Mac下SublimeText_编辑保存的Html乱码问题解决
- LeetCode 34 Search for a Range
- spring 带参 bean的注入
- iOS socket网络编程