请选择 进入手机版 | 继续访问电脑版

Hello Mat

 找回密码
 立即注册
查看: 13876|回复: 15

19人工蜂群算法ABC函数优化--视频分享

[复制链接]

1278

主题

1504

帖子

90

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22549
发表于 2017-2-4 20:50:18 | 显示全部楼层 |阅读模式
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:记录迄今为止最好的解;
Step8Cycle = Cycle +1,若Cycle<MCN,则转Step3;否则,输出最优结果。
蜜蜂执行搜索活动的过程可概括为:(1)采蜜蜂确定蜜源,对其进行开采并记忆蜜源的相关信息,与观察蜂共同分享它们所开采的蜜源的相关信息;(2)观察蜂以一定的选择策略在邻近的蜜源里选择蜜源;(3)被放弃的蜜源处的采蜜蜂转变为侦察蜂,并且开始随机搜索新的蜜源。

人工蜂群算法ABC函数优化PDF文档如下:
链接:http://pan.baidu.com/s/1qXQmiVq 密码:8tak

具体的代码如下:
  1. % 人工蜂群算法
  2. clc,clear,close all
  3. warning off
  4. feature jit off
  5. tic
  6. % 算法参数
  7. NP=20;                                   % 蜂群大小
  8. FoodNumber=NP/2;                 % 蜂群食物源数量,也就是产生 解 的个数
  9. limit=100;       % 经过“limit”次采蜜蜂和观察蜂的循环搜索之后,不能够被改进,那么该位置将被放弃
  10. maxCycle=500;                            % 最大迭代循环

  11. %/* Problem specific variables*/
  12. objfun='Sphere';                     % 待优化函数
  13. D=100;                               % 未知数为100个
  14. ub=ones(1,D)*100;                    % 未知量取值下边界
  15. lb=ones(1,D)*(-100);                 % 未知量取值上边界
  16. runtime=1;                           % 算法运行次数,一般设置1即可

  17. GlobalMins=zeros(1,runtime);   % 适应度最小值初始化

  18. for r=1:runtime
  19.   
  20. % 初始化变量值
  21. Range = repmat((ub-lb),[FoodNumber 1]);       % 最大值
  22. Lower = repmat(lb, [FoodNumber 1]);           % 最小值
  23. Foods = rand(FoodNumber,D) .* Range + Lower;  % 初始化个体

  24. ObjVal=feval(objfun,Foods);                                       % 目标函数值
  25. Fitness=calculateFitness(ObjVal);                                 % 适应度值,取其导数,为最小值

  26. % 设定拖尾矩阵,初始化
  27. trial=zeros(1,FoodNumber);

  28. % 找到最好的食物源
  29. BestInd=find(ObjVal==min(ObjVal));
  30. BestInd=BestInd(end);
  31. GlobalMin=ObjVal(BestInd);                             % 函数值最小
  32. GlobalParams=Foods(BestInd,:);                         % 相应的食物源个体

  33. iter=1;
  34. while ((iter <= maxCycle)),  % 迭代开始

  35. % 采蜜蜂
  36.     for i=1:(FoodNumber)
  37.         % 参数随机可变
  38.         Param2Change=fix(rand*D)+1;
  39.         % 随机选择相连个体
  40.         neighbour=fix(rand*(FoodNumber))+1;
  41.         % 随机选择的个体不等于i
  42.         while(neighbour==i)
  43.             neighbour=fix(rand*(FoodNumber))+1;
  44.         end;
  45.         
  46.        sol=Foods(i,:);  % 个体选择
  47.        %  /*v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) */
  48.        sol(Param2Change)=Foods(i,Param2Change)+(Foods(i,Param2Change)-Foods(neighbour,Param2Change))*(rand-0.5)*2;
  49.         
  50.        % 个体取值范围约束
  51.         ind=find(sol<lb);                                 % 最小值约束
  52.         sol(ind)=lb(ind);
  53.         ind=find(sol>ub);                         % 最大值约束
  54.         sol(ind)=ub(ind);
  55.         
  56.         % 估计新的目标函数值和适应度值
  57.         ObjValSol=feval(objfun,sol);
  58.         FitnessSol=calculateFitness(ObjValSol);
  59.         
  60.        % 更新最优个体值
  61.        if (FitnessSol>Fitness(i))                 % 如果新产生的个体值适应度值越大,则表明函数值越小,则个体最优
  62.             Foods(i,:)=sol;
  63.             Fitness(i)=FitnessSol;
  64.             ObjVal(i)=ObjValSol;
  65.             trial(i)=0;
  66.         else
  67.             trial(i)=trial(i)+1; % /*if the solution i can not be improved, increase its trial counter*/
  68.        end;
  69.     end;
  70.    
  71. % 观察蜂
  72. % 计算概率
  73. % 观察蜂根据与蜜源相关的概率值选择蜜源,概率值计算公式
  74. % prob(i)=a*fitness(i)/max(fitness)+b*/
  75. prob=(0.9.*Fitness./max(Fitness))+0.1;  
  76. i=1;
  77. t=0;
  78. while(t<FoodNumber)
  79.     if(rand<prob(i))
  80.         t=t+1;
  81.         % 继续随机选择个体
  82.         Param2Change=fix(rand*D)+1;
  83.         % 随机选择相连个体
  84.         neighbour=fix(rand*(FoodNumber))+1;
  85.         % 随机选择的个体不等于i      
  86.         while(neighbour==i)
  87.             neighbour=fix(rand*(FoodNumber))+1;
  88.         end;
  89.        sol=Foods(i,:);                                  % 个体选择
  90.        %  /*v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) */
  91.        sol(Param2Change)=Foods(i,Param2Change)+(Foods(i,Param2Change)-Foods(neighbour,Param2Change))*(rand-0.5)*2;
  92.         
  93.        % 个体取值范围约束
  94.        ind=find(sol<lb);                                 % 最小值约束
  95.        sol(ind)=lb(ind);
  96.        ind=find(sol>ub);                                 % 最大值约束
  97.        sol(ind)=ub(ind);
  98.         
  99.        % 估计新的目标函数值和适应度值
  100.        ObjValSol=feval(objfun,sol);
  101.        FitnessSol=calculateFitness(ObjValSol);
  102.         
  103.        % 更新最优个体值
  104.        if (FitnessSol>Fitness(i))                 %如果新产生的个体值适应度值越大,则表明函数值越小,则个体最优
  105.             Foods(i,:)=sol;
  106.             Fitness(i)=FitnessSol;
  107.             ObjVal(i)=ObjValSol;
  108.             trial(i)=0;
  109.         else
  110.             trial(i)=trial(i)+1; % /*if the solution i can not be improved, increase its trial counter*/
  111.        end;
  112.     end;
  113.    
  114.     i=i+1;
  115.     if (i==(FoodNumber)+1)
  116.         i=1;
  117.     end;   
  118. end;

  119.     % 记录最好的目标函数值
  120.     ind=find(ObjVal==min(ObjVal));
  121.     ind=ind(end);
  122.     if (ObjVal(ind)<GlobalMin)
  123.         GlobalMin=ObjVal(ind);                      % 最优目标函数值
  124.         GlobalParams=Foods(ind,:);                  % 最优个体
  125.     end;
  126.          
  127. % 侦察蜂
  128. % 如果某一次循环拖尾次数大于设定limit,则重新更新个体,重新计算
  129. ind=find(trial==max(trial));
  130. ind=ind(end);
  131. if (trial(ind)>limit)
  132.     Bas(ind)=0;
  133.     sol=(ub-lb).*rand(1,D)+lb;
  134.     ObjValSol=feval(objfun,sol);
  135.     FitnessSol=calculateFitness(ObjValSol);
  136.     Foods(ind,:)=sol;
  137.     Fitness(ind)=FitnessSol;
  138.     ObjVal(ind)=ObjValSol;
  139. end;

  140. fprintf('iter=%d ObjVal=%g\n',iter,GlobalMin);
  141. iter=iter+1;

  142. end % End of ABC

  143. GlobalMins(r)=GlobalMin;
  144. end; % end of runs
  145. toc
  146. % save all
  147. disp('最优解为:')
  148. GlobalParams
  149. disp('最优目标函数值为:')
  150. GlobalMin
复制代码
简化的代码如下:
  1. % 人工蜂群算法函数寻优
  2. % ABC算法
  3. clc,clear,close all
  4. warning off
  5. format longG

  6. % ABC 参数初始化
  7. maxiter = 20;  % 迭代次数
  8. sizepop = 10;  % 种群数量
  9. popmin1 = -1;  popmax1 = 1; % x1
  10. popmin2 = -1;  popmax2 = 1; % x2
  11. trail(1:sizepop,1) = 0;     % 未找到更优解的迭代次数
  12. limit = sizepop;            % 拖尾最大次数

  13. % 初始化种群
  14. for i=1:sizepop
  15.     x1 = popmin1+(popmax1-popmin1)*rand;
  16.     x2 = popmin2+(popmax2-popmin2)*rand;
  17.     pop(i,:) = [x1, x2];
  18.     fitness(i) = fun([x1,x2]);  % 适应度函数值--目标函数值--最小目标函数值
  19. end

  20. % 记录一组最优值
  21. [bestfitness,bestindex]=min(fitness);
  22. zbest=pop(bestindex,:);   %全局最佳
  23. fitnesszbest=bestfitness; %全局最佳适应度值

  24. % 迭代寻优
  25. for i=1:maxiter
  26.    
  27.     % 采蜜峰开始工作
  28.     for j=1:sizepop
  29.         % 选择采蜜的个体
  30.         x2y = randi(2);   % 两个未知数
  31.         % 选择相连的种群
  32.         neighbour = randi(sizepop);  
  33.         % neighbour != j
  34.         while( neighbour==j  )
  35.             neighbour = randi(sizepop);
  36.         end
  37.         
  38.         % 种群更新(解)
  39.         tempx = pop(j,:);  % 当前的解
  40.         tempx(x2y) = pop(j,x2y) + (pop(j,x2y)-pop(neighbour,x2y))*(rand-0.5)*2;
  41. %         tempx(x2y) = pop(j,x2y) + (pop(j,x2y)-pop(neighbour,x2y))*rand;
  42.         
  43.         % x1  越界限制
  44.         if tempx(1)>popmax1
  45.             tempx(1)=popmax1;
  46.         end
  47.         if tempx(1)<popmin1
  48.             tempx(1)=popmin1;
  49.         end
  50.         % x2  越界限制
  51.         if tempx(2)>popmax2
  52.             tempx(2)=popmax2;
  53.         end
  54.         if tempx(2)<popmin2
  55.             tempx(2)=popmin2;
  56.         end
  57.         
  58.         % 适应度更新
  59.         temp_fitness = fun( tempx );  % 当前的适应度函数值--目标函数值--最小目标函数值
  60.         % 比较  个体间比较
  61.         if temp_fitness<fitness(j)
  62.             fitness(j) = temp_fitness;
  63.             pop(j,:) = tempx;
  64.         end
  65.         if temp_fitness<bestfitness
  66.             bestfitness = temp_fitness;
  67.             zbest =  tempx;
  68.         end
  69.     end
  70.    
  71.     % 观察峰
  72.     % 计算概率
  73.     prob = 0.9*fitness./max(fitness) + 0.1;
  74.     for j=1:sizepop
  75.         if(rand<prob(j))
  76.             
  77.             % 选择采蜜的个体
  78.             x2y = randi(2);   % 两个未知数
  79.             % 选择相连的种群
  80.             neighbour = randi(sizepop);  
  81.             % neighbour != j
  82.             while( neighbour==j  )
  83.                 neighbour = randi(sizepop);
  84.             end

  85.             % 种群更新(解)
  86.             tempx = pop(j,:);  % 当前的解
  87.             tempx(x2y) = pop(j,x2y) + (pop(j,x2y)-pop(neighbour,x2y))*(rand-0.5)*2;
  88. %             tempx(x2y) = pop(j,x2y) + (pop(j,x2y)-pop(neighbour,x2y))*rand;

  89.             % x1  越界限制
  90.             if tempx(1)>popmax1
  91.                 tempx(1)=popmax1;
  92.             end
  93.             if tempx(1)<popmin1
  94.                 tempx(1)=popmin1;
  95.             end
  96.             % x2  越界限制
  97.             if tempx(2)>popmax2
  98.                 tempx(2)=popmax2;
  99.             end
  100.             if tempx(2)<popmin2
  101.                 tempx(2)=popmin2;
  102.             end

  103.             % 适应度更新
  104.             temp_fitness = fun( tempx );  % 当前的适应度函数值--目标函数值--最小目标函数值
  105.             % 比较  个体间比较
  106.             if temp_fitness<fitness(j)
  107.                 fitness(j) = temp_fitness;
  108.                 pop(j,:) = tempx;
  109.             end
  110.             if temp_fitness<bestfitness
  111.                 bestfitness = temp_fitness;
  112.                 zbest =  tempx;
  113.             else
  114.                 trail(j) = trail(j)+1;
  115.             end
  116.         end
  117.     end
  118.    
  119.     % 侦察峰开始工作
  120.     [maxTrial, index] = max(trail);
  121.     index = index(1);
  122.     if(maxTrial(1)>limit)
  123.         x1 = popmin1+(popmax1-popmin1)*rand;
  124.         x2 = popmin2+(popmax2-popmin2)*rand;
  125.         pop(index,:) = [x1, x2];
  126.         fitness(index) = fun([x1,x2]);  % 适应度函数值--目标函数值--最小目标函数值
  127.     end
  128.    
  129.     fitness_iter(i) = bestfitness;
  130. end

  131. disp('最优解')
  132. disp(zbest)
  133. fprintf('\n')

  134. figure('color',[1,1,1])
  135. plot(fitness_iter,'ro-','linewidth',2)

  136. figure('color',[1,1,1])
  137. loglog(fitness_iter,'ro-','linewidth',2)
  138. axis tight
复制代码






回复

使用道具 举报

0

主题

7

帖子

1

金钱

新手上路

Rank: 1

积分
8
发表于 2017-2-19 20:09:59 | 显示全部楼层
谢谢楼主,刚开始学习,多多交流
回复 支持 反对

使用道具 举报

0

主题

12

帖子

1

金钱

新手上路

Rank: 1

积分
13
发表于 2017-2-26 18:18:52 | 显示全部楼层
呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜
回复 支持 反对

使用道具 举报

0

主题

5

帖子

1

金钱

新手上路

Rank: 1

积分
6
发表于 2017-3-19 21:39:32 | 显示全部楼层
非常好,谢谢分享
回复 支持 反对

使用道具 举报

0

主题

50

帖子

0

金钱

注册会员

Rank: 2

积分
50
发表于 2017-3-23 22:55:45 | 显示全部楼层
感谢分享,学习ABC算法。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

1

金钱

新手上路

Rank: 1

积分
3
发表于 2017-4-4 15:29:08 来自手机 | 显示全部楼层
想学人工蜂群算法,谢谢分享
回复 支持 反对

使用道具 举报

0

主题

33

帖子

1

金钱

新手上路

Rank: 1

积分
37
发表于 2017-5-8 11:39:23 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

0

主题

4

帖子

12

金钱

新手上路

Rank: 1

积分
16
发表于 2017-5-10 22:05:15 | 显示全部楼层
感谢楼主!
回复

使用道具 举报

0

主题

59

帖子

1

金钱

注册会员

Rank: 2

积分
72
发表于 2017-5-14 09:34:19 | 显示全部楼层
非常好的代码,谢谢
回复 支持 反对

使用道具 举报

0

主题

4

帖子

11

金钱

新手上路

Rank: 1

积分
15
发表于 2017-7-4 12:29:56 | 显示全部楼层
谢谢分享,好好学习,天天巡航上
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-3-29 08:19 , Processed in 0.237062 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表