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

Hello Mat

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1400|回复: 8

5-GA_PSO_PID--遗传算法和粒子群PSO的混合算法

[复制链接]

806

主题

951

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
30251
发表于 2019-8-7 22:15:06 | 显示全部楼层 |阅读模式
5-GA_PSO_PID--遗传算法和粒子群PSO的混合算法
百度网盘链接:https://pan.baidu.com/s/1hQWfiEUxfVL0vXKhd1pSaA 提取码:822v
具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1
程序如下:
  1. %% 基于遗传算法GA的PID参数优化
  2. clear all;   % 删除workplace变量
  3. close all;   % 关掉显示图形窗口
  4. warning off  % 消除警告
  5. format short % 数据类型
  6. addpath(genpath('./PID_funtion'))
  7. tic;         % 计时开始
  8. %% 适应度函数,也就是我们的目标函数
  9. %% 适应度函数
  10. choosed = 5;
  11. if choosed==1
  12.     fun = @(x)PID_Fun_1(x);
  13. elseif(choosed==2)
  14.     fun = @(x)PID_Fun_2(x);
  15. elseif(choosed==3)
  16.     fun = @(x)PID_Fun_3(x);
  17. elseif(choosed==4)
  18.     fun = @(x)PID_Fun_4(x);
  19. elseif(choosed==5)
  20.     fun = @(x)PID_controller(x);
  21. end
  22. %% 遗传算法GA的参数初始化
  23. maxgen = 50;        % 最大迭代次数
  24. sizepop = 30;       % 种群规模
  25. N_PAR = 3;          % 未知数个数
  26. pcross = [0.8];     % 交叉概率选择,0和1之间
  27. pmutation = [0.2];  % 变异概率选择,0和1之间
  28. lenchrom = N_PAR;       % 染色体个数 = 未知数个数
  29. Ub = [15 10 5]; % 上限
  30. Lb = [0.5 0 0];  % 下限
  31. bound = [Lb; Ub]';
  32. popmin = [0.5 0 0];
  33. popmax = [15 10 5];
  34. % 变量初始化
  35. individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]);  % 将种群信息定义为一个结构体
  36. bestfitness = [];        % 每一代种群的最佳适应度
  37. bestchrom = [];          % 适应度最好的染色体
  38. %% PSO算法中的两个参数
  39. c1 = 2;       % 加速常数
  40. c2 = 2;       % 加速常数
  41. % 粒子更新速度  
  42. w = 0.6;      % 惯性因子
  43. Vmax = 1;
  44. Vmin = -1;
  45. %% 产生初始染色体个体和速度
  46. for i=1:sizepop
  47.     % 随机产生一个种群
  48.     pop(i,:) = rand(1,N_PAR) .* ( popmax-popmin ) + popmin;  % 初始种群个体
  49.     individuals.chrom(i,:) = pop(i,:);
  50.     % 计算适应度
  51.     individuals.fitness(i) = fun(pop(i,:));  % 染色体的适应度
  52.     VStep(i, :) = rand(1,lenchrom)*(Vmax-Vmin) + Vmin;      % 初始化速度
  53. end

  54. % 找最好的染色体
  55. [bestfitness,bestindex]=min(individuals.fitness); % 求极小值
  56. bestchrom = individuals.chrom(bestindex,:);    % 最好的染色体
  57. trace = [bestfitness];                         % 记录每一代进化中最好的适应度
  58. % PSO算法
  59. pop = individuals.chrom;
  60. fitness = individuals.fitness;
  61. gbest=pop;                              % 个体最佳
  62. fitnessgbest=individuals.fitness;       % 个体最佳适应度值
  63. fitnesszbest=bestfitness;               % 全局最佳适应度值
  64. zbest=individuals.chrom(bestindex,:);   %全局最佳

  65. % PID-Kp、Ki、Kd三参数初始化
  66. Kp(1,1) = zbest(1);
  67. Ki(1,1) = zbest(2);
  68. Kd(1,1) = zbest(3);

  69. %% 迭代寻优
  70. % 进化开始
  71. for i=1:maxgen
  72.     disp(['迭代次数:  ',num2str(i)])
  73.         % 选择
  74.     individuals = Select(individuals,fun,sizepop,popmin,popmax);
  75.     [zbest, fitnesszbest, individuals] = update_zbest(fun, zbest, fitnesszbest, individuals, sizepop);
  76.     % 交叉
  77.     individuals.chrom = Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);
  78.     [zbest, fitnesszbest, individuals] = update_zbest(fun, zbest, fitnesszbest, individuals, sizepop);
  79.     % 变异
  80.     individuals.chrom = Mutation(pmutation,lenchrom,individuals.chrom,sizepop,i,maxgen,bound);
  81.     [zbest, fitnesszbest, individuals] = update_zbest(fun, zbest, fitnesszbest, individuals, sizepop);
  82.     % 找最好的染色体
  83.     pop = individuals.chrom;
  84.     fitness = individuals.fitness;
  85.    
  86.     % 计算适应度
  87.     for j=1:sizepop
  88.         % PSO算法
  89.         % 速度更新
  90.         VStep(j,:) = w*VStep(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
  91.         for k=1:lenchrom
  92.             if VStep(j,k)>Vmax, VStep(j,k)=Vmax; end
  93.             if VStep(j,k)<Vmin, VStep(j,k)=Vmin; end
  94.         end
  95.         % 种群更新
  96.         newpop=  pop(j,:)+0.5*VStep(j,:);
  97.         % 保证每个个体在所在区间
  98.         for k=1:lenchrom
  99.             if newpop(k)>Ub(k), newpop(k)=Ub(k); end
  100.             if newpop(k)<Lb(k), newpop(k)=Lb(k); end
  101.         end
  102.         % 找最好的染色体
  103.         newfitness =fun(newpop);            %染色体的适应度
  104.         if(newfitness<fitness(j))
  105.             fitness(j)=newfitness;
  106.             pop(j,:) = newpop;
  107.         end
  108.         
  109.         %个体最优更新
  110.         if fitness(j) < fitnessgbest(j)
  111.             gbest(j,:) = pop(j,:);
  112.             fitnessgbest(j) = fitness(j);
  113.         end
  114.         
  115.         %群体最优更新
  116.         if fitness(j) < fitnesszbest
  117.             zbest = pop(j,:);
  118.             fitnesszbest = fitness(j);
  119.         end  
  120.         
  121.     end
  122.    
  123.     individuals.chrom = gbest;
  124.     individuals.fitness = fitnessgbest;
  125.    
  126.     trace = [trace;fitnesszbest];    %记录每一代进化中最好的适应度
  127.     Kp = [Kp,zbest(1)]; % Kp参数值
  128.     Ki = [Ki,zbest(2)]; % Ki参数值
  129.     Kd = [Kd,zbest(3)]; % Kd参数值
  130. end
  131. %% 结果分析
  132. figure('color',[1,1,1]),
  133. plot(trace,'Linewidth',2)
  134. title(['适应度曲线  ' '终止代数=' num2str(maxgen)]);
  135. grid on
  136. xlabel('进化代数');ylabel('适应度');

  137. figure('color',[1,1,1]),
  138. plot(Kp,'r','Linewidth',2); hold on;
  139. plot(Ki,'g','Linewidth',2);
  140. plot(Kd,'b','Linewidth',2);
  141. title(['适应度曲线  ' '终止代数=' num2str(maxgen)]);
  142. grid on;legend('Kp参数值变化图','Ki参数值变化图','Kd参数值变化图')
  143. xlabel('进化代数');ylabel('适应度');

  144. %% 结果输出
  145. fitnessbest = trace(end);         % 返回最优函数目标值
  146. time = toc;                       % 返回CPU计算时间
  147. fprintf('\n')
  148. disp(['最优个体值:  ',num2str(bestchrom)])
  149. disp(['函数最优极值:  ',num2str(fitnessbest)])
  150. fprintf('\n')

  151. %% 响应曲线
  152. % PID响应
  153. if choosed==1
  154.     [rint, yout]=PID_Fun_1_response(zbest);
  155. elseif(choosed==2)
  156.     [rint, yout]=PID_Fun_2_response(zbest);
  157. elseif(choosed==3)
  158.     [rint, yout]=PID_Fun_3_response(zbest);
  159. elseif(choosed==4)
  160.     [rint, yout]=PID_Fun_4_response(zbest);
  161. elseif(choosed==5)
  162.     [BSJ, rint, yout]=PID_controller_response(zbest);
  163. end
  164. figure('color',[1,1,1])
  165. plot(rint,'b-','linewidth',2);hold on;
  166. plot(yout,'r.-','linewidth',2);
  167. axis tight;grid on;
  168. hold off;
  169. legend('输入信号','阶跃响应曲线')
  170. xlabel('time(s)');
  171. ylabel('Amp');

  172. rmpath(genpath('./PID_funtion'))
复制代码
update_zbest函数如下:
游客,如果您要查看本帖隐藏内容请回复

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

使用道具 举报

0

主题

15

帖子

129

积分

注册会员

Rank: 2

积分
129
发表于 2020-4-12 17:01:37 | 显示全部楼层
很好的资源
回复 支持 反对

使用道具 举报

0

主题

1

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2020-4-23 20:17:11 | 显示全部楼层
我想知道答案有问题没
回复 支持 反对

使用道具 举报

0

主题

1

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2020-5-1 02:23:50 | 显示全部楼层
阅读权限怎么才能高于20呢
回复 支持 反对

使用道具 举报

0

主题

6

帖子

27

积分

新手上路

Rank: 1

积分
27
发表于 2020-5-3 15:25:44 | 显示全部楼层
很好,想学习
回复 支持 反对

使用道具 举报

1

主题

7

帖子

27

积分

新手上路

Rank: 1

积分
27
发表于 2020-5-5 01:21:42 | 显示全部楼层
非常不错,想好好学习一下
回复 支持 反对

使用道具 举报

1

主题

8

帖子

36

积分

新手上路

Rank: 1

积分
36
发表于 2020-5-7 20:41:52 | 显示全部楼层
楼主分享的很好,加油
回复 支持 反对

使用道具 举报

1

主题

8

帖子

36

积分

新手上路

Rank: 1

积分
36
发表于 2020-5-8 00:10:58 | 显示全部楼层
很棒,值得学习一下
回复 支持 反对

使用道具 举报

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

本版积分规则

Python|Opencv|MATLAB|Halcom.cn  

GMT+8, 2020-6-2 12:57 , Processed in 0.123227 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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