Hello Mat

 找回密码
 立即注册
查看: 6070|回复: 4

23-基于BFO的临界水深优化和PID优化

[复制链接]

1323

主题

1551

帖子

0

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22647
发表于 2019-4-14 22:56:57 | 显示全部楼层 |阅读模式
23-基于BFO的临界水深优化和PID优化、改进的BFO算法、PSO算法优化的BFO算法优化的PID参数整定
百度网盘链接:https://pan.baidu.com/s/12Zs78YjBZGa_37u70dzY9w 提取码:o4yh

具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1

代码如下:
  1. function fitness = PID_Fun(Kpid)
  2. ts=0.001;
  3. sys = tf( [1.6], [1,1.5,1.6] );
  4. dsys = c2d(sys, ts, 'z');
  5. [num,den] = tfdata( dsys, 'v' );
  6. u_1 = 0; u_2=0;
  7. y_1 = 0; y_2=0;
  8. error_1 = 0;
  9. x = [0,0,0]';
  10. for k=1:300
  11.     timef(k) = k*ts;
  12.     r(k) = 1;
  13.     u(k) = Kpid(1)*x(1)+Kpid(2)*x(2)+Kpid(3)*x(3);
  14.     yout(k) = -den(2)*y_1 -den(3)*y_2 + num(2)*u_1 + num(3)*u_2;
  15.     error(k) = r(k) - yout(k);
  16.     % PID参数返回值
  17.     u_2 = u_1;
  18.     u_1 = u(k);
  19.     y_2 = y_1;
  20.     y_1 = yout(k);
  21.    
  22.     x(1) = error(k);              % Kp
  23.     x(2) = x(2) + error(k)*ts;    % KI
  24.     x(3) = (error(k)-error_1)/ts; % KD
  25.    
  26.     error_1 = error(k);
  27. end
  28. fitness = sum( abs(error) ) + 300*min( abs( error ) );
复制代码
主函数如下:
  1. clc,clear,close all
  2. warning off
  3. format longG
  4. % BFO优化算法 参数
  5. sizepop = 10;              % 种群数量
  6. Nc = 10;                   % 趋化次数
  7. Ns = 2;                    % 游动次数
  8. Nre = 2;                   % 复制次数
  9. Ned = 2;                   % 驱散(迁移)次数
  10. Sr = ceil( sizepop/2 );    % 复制(分裂)次数
  11. Ped = 0.25;                             % 细菌驱散(迁移)概率
  12. wmax = 0.9;
  13. wmin = 0.1;
  14. %% PID参数优化问题
  15. nvar = 3;   % 3个未知量
  16. popmin = -5;  popmax = 15; % x
  17. Cmin = -1;  % 最小步长
  18. Cmax = 1;   % 最大步长
  19. C(:,:) = 0.1*ones(sizepop,nvar);            % 翻转选定方向后,单个细菌前进的步长
  20. Vmin = -1;
  21. Vmax = 1;
  22. c1 = 1.49;
  23. c2 = 1.49;
  24. % 目标函数
  25. fun = @(x)PID_Fun(x);
  26. %% 初始化种群
  27. for i=1:sizepop
  28.     pop(i,:) = popmin + (popmax-popmin).*rand(1,nvar);    % 初始化个体
  29.     fitness(i) = fun(  pop(i,:) );              % 适应度值
  30.     C(i,:) = Cmin + (Cmax-Cmin).*rand(1,nvar);  % 步长
  31.     V(i,:) = Vmin + (Vmax-Vmin).*rand(1,nvar);  % 速度
  32. end
  33. %% 记录一组最优值
  34. [bestfitness,bestindex]=min(fitness);
  35. zbest=pop(bestindex,:);   % 全局最佳
  36. fitnesszbest=bestfitness; % 全局最佳适应度值
  37. gbest =  pop;
  38. fitnessgbest = fitness;
  39. NcSizepop = 0;            % 记录最优适应度值(函数值)
  40. %% 迭代寻优
  41. for i = 1:Ned                   % 驱散(迁移)次数
  42.     for k = 1:Nre               % 复制次数
  43.         
  44.         for m = 1:Nc            % 趋化次数
  45.             for j=1:sizepop     % 种群

  46.                 favg = mean(fitness);
  47.                 fmin = min(fitness);
  48.                 if(fitness(j)<=favg)
  49.                     w=wmin+(wmax-wmin)*(fitness(j)-fmin)./(favg-fmin+eps);
  50.                 else
  51.                     w = wmax;
  52.                 end
  53.                
  54.                 % 翻转
  55.                 V(j,:) = w*V(j,:)+c1*rand*(gbest(j,:)-pop(j,:))+c2*rand*(zbest-pop(j,:));
  56.                 for ij=1:nvar
  57.                     if V(j,ij)>Vmax
  58.                         V(j,ij)=Vmax;
  59.                     end
  60.                     if V(j,ij)<Vmin
  61.                         V(j,ij)=Vmin;
  62.                     end
  63.                 end
  64.                 pop(j,:) = pop(j,:) + w*V(j,:);
  65.                
  66.                 % x
  67.                 for ij=1:nvar
  68.                     if pop(j,ij)>popmax
  69.                         pop(j,ij)=popmax;
  70.                     end
  71.                     if pop(j,ij)<popmin
  72.                         pop(j,ij)=popmin;
  73.                     end
  74.                 end
  75.                
  76.                 % 更新当前适应度值
  77.                 fitness(j) = fun(pop(j,:));
  78.                 % 游动
  79.                 if(fitness(j)<fitnessgbest(j))
  80.                     gbest(j,:) = pop(j,:);
  81.                     fitnessgbest(j) = fitness(j);
  82.                 end
  83.                 if(fitness(j)<bestfitness)
  84.                     zbest = pop(j,:);
  85.                     bestfitness = fitness(j);
  86.                 end
  87.                
  88.             end   % sizepop  种群数量
  89.             
  90.             % 记录最优适应度值
  91.             NcSizepop = NcSizepop+1;
  92.             fitness_iter(NcSizepop) = bestfitness;
  93.         end       % Nc       趋化次数
  94.         
  95.         % 复制操作
  96.         [maxF,index] = sort(fitness,'descend');  % 降序排列
  97.         for Nre2 = 1:Sr   % 将最大适应度值的Sr个种群,进行更新
  98.             pop(index(Nre2),:) = popmin + (popmax-popmin).*rand(1,nvar);
  99.             fitness(index(Nre2)) = fun(pop(index(Nre2),:));
  100.             C(index(Nre2),:) = Cmin + (Cmax-Cmin).*rand(1,nvar);  % 步长
  101.             % 比较 个体间比较
  102.             if fitness(index(Nre2))<bestfitness
  103.                 bestfitness = fitness(index(Nre2));
  104.                 zbest =  pop(index(Nre2),:);
  105.             end
  106.         end
  107.     end   % Nre  复制操作
  108.    
  109.     for j=1:sizepop     % 种群
  110.         if Ped>rand
  111.             pop(j,:) = popmin + (popmax-popmin).*rand(1,nvar);
  112.             fitness(j) = fun(pop(j,:));
  113.             % 比较 个体间比较
  114.             if fitness(j)<bestfitness
  115.                 bestfitness = fitness(j);
  116.                 zbest =  pop(j,:);
  117.             end
  118.         end
  119.     end
  120.    
  121. end       % Ned   驱散(迁移)次数
  122. %% 显示
  123. disp('最优解')
  124. disp(['最优解: ', num2str( zbest )])
  125. fprintf('\n')
  126. disp(['最优解对应的目标函数值: ', num2str( bestfitness )])
  127. %% 画图适应度
  128. figure('color',[1,1,1])
  129. plot(fitness_iter,'ro-','linewidth',2)
  130. % loglog(fitness_iter,'ro-','linewidth',2)
  131. axis tight
  132. grid on

  133. %% 响应曲线
  134. [rint_BFO, yout_BFO] = PID_Fun_response(zbest);
  135. figure;hold on;
  136. plot(rint_BFO,'r-','linewidth',2);
  137. plot(yout_BFO,'b.-','linewidth',2);
  138. legend('阶跃控制信号','BFO算法优化的PID控制')
  139. axis([0,300,0,1.2])
  140. hold off
复制代码


参考文献:
【1】粒子群优化在临界水深计算中的应用
【2】基于人群搜索算法的PID控制器参数优化


算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 21:57 , Processed in 0.210121 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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