Hello Mat

 找回密码
 立即注册
查看: 5830|回复: 2

3-BFO_PSO_PID--细菌觅食算法和粒子群算法的混合算法

[复制链接]

1323

主题

1551

帖子

0

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22647
发表于 2019-8-7 22:10:29 | 显示全部楼层 |阅读模式
3-BFO_PSO_PID--细菌觅食算法和粒子群算法的混合算法
百度网盘链接:https://pan.baidu.com/s/1S6cq5LqSl3PujfUFPhIzTQ 提取码:u1sj
具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1
程序如下:
  1. clc,clear,close all
  2. warning off
  3. format longG
  4. addpath(genpath('./PID_funtion'))
  5. % BFO优化算法 参数
  6. Nc = 5;                   % 趋化次数
  7. Ns = 4;                    % 游动次数
  8. Nre = 4;                   % 复制次数
  9. Ned = 4;                   % 驱散(迁移)次数
  10. sizepop = 10;              % 种群数量
  11. Sr = ceil( sizepop/2 );    % 复制(分裂)次数
  12. Ped = 0.25;                             % 细菌驱散(迁移)概率
  13. nvar = 3;              % 3个未知量
  14. popmin = [0,0,0];      % x min
  15. popmax = [30,30,30];   % x max
  16. Cmin = [-2,-2,-2];     % 最小步长
  17. Cmax = [2,2,2];        % 最大步长
  18. C(:,:) = 0.001*ones(sizepop,nvar);            % 翻转选定方向后,单个细菌前进的步长
  19. %% PSO参数
  20. c1 = 1.4995;
  21. c2 = 1.4995;
  22. Vmin = -1;
  23. Vmax = 1;
  24. %% 适应度函数,也就是我们的目标函数
  25. %% 适应度函数
  26. choosed = 4;
  27. if choosed==1
  28.     fun = @(x)PID_Fun_1(x);
  29. elseif(choosed==2)
  30.     fun = @(x)PID_Fun_2(x);
  31. elseif(choosed==3)
  32.     fun = @(x)PID_Fun_3(x);
  33. elseif(choosed==4)
  34.     fun = @(x)PID_Fun_4(x);
  35. end
  36. %% 初始化种群
  37. for i=1:sizepop
  38.     pop(i,:) = popmin + (popmax-popmin).*rand(1,nvar);   % 初始化个体
  39.     fitness(i) = fun(  pop(i,:) );              % 适应度值
  40.     C(i,:) = Cmin + (Cmax-Cmin).*rand(1,nvar);  % 步长
  41.     V(i,1:nvar) = 0;            % 粒子群速度
  42. end
  43. %% 记录一组最优值
  44. [bestfitness,bestindex]=min(fitness);  % 目标值越小越好
  45. zbest=pop(bestindex,:);   % 全局最佳
  46. fitnesszbest=bestfitness; % 全局最佳适应度值
  47. gbest=pop;                %个体最佳
  48. fitnessgbest=fitness;     %个体最佳适应度值
  49. NcSizepop = 0;            % 记录最优适应度值(函数值)
  50. %% 迭代寻优
  51. for i = 1:Ned                   % 驱散(迁移)次数
  52.     disp(['当前驱散(迁移)次数 i=', num2str(i), ' , 驱散(迁移)次数 Ned=', num2str(Ned)])
  53.     for k = 1:Nre               % 复制次数
  54.         disp(['复制次数 k=', num2str(k), ' , 复制次数 Nre=', num2str(Nre)])
  55.         for m = 1:Nc            % 趋化次数
  56.             disp(['趋化次数 m=', num2str(m), ' , 趋化次数 Nc=', num2str(Nc)])
  57.             for j=1:sizepop     % 种群
  58.       
  59.                 % 翻转
  60. %                 PSO+BFO
  61.                 % 速度更新
  62.                 V(j,:) = 0.5*V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
  63.                 % 越界约束
  64.                 for ij = 1:nvar
  65.                     if V(j,ij)>Vmax,
  66.                         V(j,ij)=Vmax;
  67.                     end
  68.                     if V(j,ij)<Vmin,
  69.                         V(j,ij)=Vmin;
  70.                     end
  71.                 end
  72.                 pop(j,:) = pop(j,:) + C(j,:).*V(j,:);
  73.                
  74.                 % 取值范围约束
  75.                 pop(j,:) = lb_ub(pop(j,:), popmin, popmax);
  76.                
  77.                 % 更新当前适应度值
  78.                 fitness(j) = fun(pop(j,:));

  79.                 % 游动
  80.                 n=0;
  81.                 while(n<Ns)     % 游动次数
  82.                     delta = 2*rand(1,nvar)-0.5;
  83.                     newpop = pop(j,:) + C(j,:).*delta./(sqrt( delta*delta' ));
  84.                     newpop = lb_ub(newpop,popmin,popmax);
  85.                     newfitness = fun(newpop);
  86.                     if(newfitness<fitness(j))
  87.                         fitness(j) = newfitness;
  88.                         pop(j,:) = newpop;
  89.                     end
  90.                     
  91.                     if fitness(j)<fitnessgbest(j)
  92.                         fitnessgbest(j) = fitness(j);
  93.                         gbest(j,:) = pop(j,:);
  94.                     else        % 不更新适应度值
  95.                         n=Ns;
  96.                     end
  97.                 end
  98.                
  99.                 % 适应度更新
  100.                 % 比较 个体间比较
  101.                 if fitness(j)<fitnesszbest
  102.                     fitnesszbest = fitness(j);
  103.                     zbest =  pop(j,:);
  104.                 end
  105.             end   % sizepop  种群数量
  106.             
  107.             % 移动步长更新
  108.             C(j,:) = C(j,:).*exp(-j./sizepop).*sin(pi/Ns);
  109.             
  110.             % 记录最优适应度值
  111.             NcSizepop = NcSizepop+1;
  112.             fitness_iter(NcSizepop) = fitnesszbest;
  113.             
  114.             K_p(1,NcSizepop) = zbest(1);
  115.             K_i(1,NcSizepop) = zbest(2);
  116.             K_d(1,NcSizepop) = zbest(3);
  117.             
  118.         end       % Nc       趋化次数
  119.         
  120.         % 复制操作
  121.         [maxF,index] = sort(fitness,'descend');  % 降序排列
  122.         for Nre2 = 1:Sr   % 将最大适应度值的Sr个种群,进行更新
  123.             pop(index(Nre2),:) = popmin + (popmax-popmin).*rand(1,nvar);
  124.             fitness(index(Nre2)) = fun(pop(index(Nre2),:));
  125.             C(index(Nre2),:) = Cmin + (Cmax-Cmin).*rand(1,nvar);  % 步长
  126.             % 比较 个体间比较
  127.             if fitness(index(Nre2))<fitnesszbest
  128.                 fitnesszbest = fitness(index(Nre2));
  129.                 zbest =  pop(index(Nre2),:);
  130.             end
  131.         end
  132.     end   % Nre  复制操作
  133.    
  134.     for j=1:sizepop     % 种群
  135.         if Ped>rand
  136.             pop(j,:) = popmin + (popmax-popmin).*rand(1,nvar);
  137.             fitness(j) = fun(pop(j,:));
  138.             % 比较 个体间比较
  139.             if fitness(j)<fitnesszbest
  140.                 fitnesszbest = fitness(j);
  141.                 zbest =  pop(j,:);
  142.             end
  143.         end
  144.     end
  145.    
  146. end       % Ned   驱散(迁移)次数
  147. %% 显示最优解
  148. disp('最优解')
  149. disp(zbest)
  150. fprintf('\n')
  151. disp(['最优解Kp=', num2str(zbest(1))])
  152. disp(['最优解Ki=', num2str(zbest(2))])
  153. disp(['最优解Kd=', num2str(zbest(3))])

  154. figure('color',[1,1,1])
  155. plot(fitness_iter,'ro-','linewidth',2)
  156. % loglog(fitness_iter,'ro-','linewidth',2)
  157. axis tight
  158. grid on

  159. figure('color',[1,1,1])     % 绘制PID控制器参数变化曲线
  160. plot(K_p,'b-','LineWidth',2); hold on
  161. plot(K_i,'k-.','LineWidth',2)
  162. plot(K_d,'r--','LineWidth',2)
  163. title('Kp、Ki、Kd 优化曲线','fontsize',10);
  164. xlabel('迭代次数','fontsize',10);   ylabel('参数值','fontsize',10);
  165. set(gca,'Fontsize',10);
  166. legend('Kp','Ki','Kd',1);
  167. grid on;hold off;

  168. %% 响应曲线
  169. % PID响应
  170. if choosed==1
  171.     [rint, yout]=PID_Fun_1_response(zbest);
  172. elseif(choosed==2)
  173.     [rint, yout]=PID_Fun_2_response(zbest);
  174. elseif(choosed==3)
  175.     [rint, yout]=PID_Fun_3_response(zbest);
  176. elseif(choosed==4)
  177.     [rint, yout]=PID_Fun_4_response(zbest);
  178. end
  179. figure('color',[1,1,1])
  180. plot(rint,'b-','linewidth',2);hold on;
  181. plot(yout,'r.-','linewidth',2);
  182. axis tight;grid on;
  183. hold off;
  184. legend('输入信号','阶跃响应曲线')
  185. xlabel('time(s)');
  186. ylabel('Amp');

  187. rmpath(genpath('./PID_funtion'))
复制代码
参考:http://halcom.cn/forum.php?mod=viewthread&tid=3614&extra=page%3D1
算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

0

主题

11

帖子

1

金钱

新手上路

Rank: 1

积分
12
发表于 2020-6-9 09:55:31 | 显示全部楼层
很优秀的代码
回复 支持 反对

使用道具 举报

0

主题

4

帖子

13

金钱

新手上路

Rank: 1

积分
17
发表于 2020-6-15 16:17:04 | 显示全部楼层
不能用啊,没有适应度函数
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 08:28 , Processed in 0.211878 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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