|
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文档如下:
具体的代码如下: - % 人工蜂群算法
- 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),[FoodNumber 1]); % 最大值
- Lower = repmat(lb, [FoodNumber 1]); % 最小值
- 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,:) = [x1, x2];
- fitness(i) = fun([x1,x2]); % 适应度函数值--目标函数值--最小目标函数值
- end
- % 记录一组最优值
- [bestfitness,bestindex]=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
-
- % 侦察峰开始工作
- [maxTrial, index] = max(trail);
- index = index(1);
- if(maxTrial(1)>limit)
- x1 = popmin1+(popmax1-popmin1)*rand;
- x2 = popmin2+(popmax2-popmin2)*rand;
- pop(index,:) = [x1, x2];
- fitness(index) = fun([x1,x2]); % 适应度函数值--目标函数值--最小目标函数值
- end
-
- fitness_iter(i) = bestfitness;
- end
- disp('最优解')
- disp(zbest)
- fprintf('\n')
- figure('color',[1,1,1])
- plot(fitness_iter,'ro-','linewidth',2)
- figure('color',[1,1,1])
- loglog(fitness_iter,'ro-','linewidth',2)
- axis tight
复制代码
|
|