|
8-改进PSO的三阶系统PID整定
百度网盘视频链接:https://pan.baidu.com/s/1GE72YSMENrHLcAJLx8rirg 提取码:nn5n
录制的视频是算法底层原理讲解,底层代码实现,方便大家真正掌握算法实质,开发出更加出色的算法。录制视频的初衷是:避免读者朋友利用大把时间学习已有常见算法,本系列视频旨在让读者朋友快速深入了解这些常见算法原理,有更多的时间去研究更加高大上算法(价值)。
具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1
1.约束因子的改进
带压缩因子的PSO优化算法,Clerc和Kennedy提出的带压缩因子的PSO优化算法通过选取合适参数,可确保PSO算法的收敛性,并可取消对速度的边界限制。速度和位置更新公式如下:
v_(i,j) (k+1)=χ[v_(i,j) (k)+c_1 r_1 (p_(i,j) (k)-x_(i,j) (k))+c_2 r_2 (p_(g,j) (k)-x_(i,j) (k))]
x_(i,j) (k+1)=x_(i,j) (k)+v_(i,j) (k+1),j=1,⋯,n
χ=2/|2-C-√(C^2-4C)|
C=c_1+c_2,C>4
2.学习因子的更新
粒子在迭代初期应该有较强的学习能力,所以学习因子应该随迭代次数的增加而逐渐减小,更新公式如下:
c=c_s-(c_s-c_e )*〖(iter/Maxiter)〗^2
在上述公式中,cs和ce分别是学习因子的上限和下限,学习因子的大小随迭代次数的增加呈抛物线式下降。
3.引入模拟退火算法思想
通过将模拟退火算法的机制融合,采用2轮盘赌输策略,从所有粒子中选取一个全局最优的某个粒子,来替代 Pg,记作 P'g. 计算当前温度T下,当前粒子 Pi和 P'g目标函数值之差 ΔE,exp(-ΔE /T) 即跳突概率.
引入模拟退火算法的概率判断 Metropolis 准则:
P=exp⁡(-∆E/T)
P 为接受差解的概率; ∆E为前后2代目标函数的差值;T为模拟退火算法中的温度参数,其随迭代次数的增加而不断下降。
速度更新公式如下:
v_(i,j) (k+1)=χ[v_(i,j) (k)+c_1 r_1 (p_(i,j) (k)-x_(i,j) (k))+c_2 r_2 (〖p'〗_(g,j) (k)-x_(i,j) (k))]
x_(i,j) (k+1)=x_(i,j) (k)+v_(i,j) (k+1),j=1,⋯,n
4.引入跳跃算子思想
提出一种自适应跳跃算子,通过比较pbest与gbest的相似程度,赋予粒子不同的跳跃概率。在t时刻,第i个粒子跳出当前位置的概率公式为:
P_m=exp⁡(f(〖gbest〗^t )-f(〖pbest_i〗^t))
跳跃公式为:
x_i^t=x_i^t+rand∙(Ub-Lb)
其中:D为搜索空间的维数;rand为[0,1]之间的随机数;Ub和Lb为问题的上下限。从公式中可以看出当粒子的pbest与种群gbest越接近时,粒子产生跳跃的概率较大,也就是说可以使停止更新的粒子,以较大的概率跳出极值点,对于距离种群 gbest 较远的粒子,跳跃算子对其的作用较小。
主程序如下:- %% 清空环境
- clc,clear,close all
- warning off
- format longG
- addpath(genpath('./PID_funtion'))
- %% 参数设置
- w = 0.6; % 惯性因子
- % PSO 参数
- c1 = 2.4995;
- c2 = 2.4995;
- C = c1+c2;
- if C<=4
- msgbox('c1+c2<=4!!!!')
- return;
- end
- xgima = 2/abs( 2-C - sqrt(C^2-4*C+eps) );
- Cs = 8; % C的上限
- Ce = 4; % C的下限
- Dim = 3; % 维数
- sizepop = 20; % 粒子群规模
- maxiter = 30; % 最大迭代次数
- MinFit = 0.1; % 最小适应值
- Vmax = 1; % 速度最大值
- Vmin = -1; % 速度最小值
- % P I D
- Ub = [100 100 100]; % PID取值 最大值
- Lb = [0.00 0.00 0.00]; % PID取值 最小值
- %% 模拟退火算法
- T = 500; % initiation temperature
- q = 0.5; % 降温ratio
- %% 适应度函数
- choosed = 5;
- if choosed==1
- fun = @(x)PID_Fun_1(x);
- elseif(choosed==2)
- fun = @(x)PID_Fun_2(x);
- elseif(choosed==3)
- fun = @(x)PID_Fun_3(x);
- elseif(choosed==4)
- fun = @(x)PID_Fun_4(x);
- elseif(choosed==5)
- fun = @(x)PID_Fun_5(x);
- end
- %% 粒子群初始化
- Range = ones(sizepop,1)*(Ub-Lb);
- pop = rand(sizepop,Dim).*Range + ones(sizepop,1)*Lb; % 初始化粒子群
- V = rand(sizepop,Dim)*(Vmax-Vmin) + Vmin; % 初始化速度
- fitness = zeros(sizepop,1);
- for i=1:sizepop
- % [fitness(i,:), fitB(i)] = fun(pop(i,:)); % 粒子群的适应值
- fitness(i,:) = fun(pop(i,:)); % 粒子群的适应值
- end
- %% 个体极值和群体极值
- [bestf, bestindex]=min(fitness);
- zbest=pop(bestindex,:); % 全局最佳
- gbest=pop; % 个体最佳
- fitnessgbest=fitness; % 个体最佳适应值
- fitnesszbest=bestf; % 全局最佳适应值
- %% 迭代寻优
- iter = 0;
- y_fitness = zeros(1,maxiter ); % 预先产生4个空矩阵
- K_p = zeros(1,maxiter );
- K_i = zeros(1,maxiter );
- K_d = zeros(1,maxiter );
- while( (iter < maxiter ) && (fitnesszbest > MinFit) )
- disp(['当前迭代次数: ', num2str(iter) ])
- for j=1:sizepop
- % 速度更新
- % 引入模拟退火算法思想
- [minF,minindex] = min(fitness);
- Pg = pop(minindex,:); % 从所有粒子中选取一个全局最优的某个粒子
- deltaE = fitness(j) - minF;
- if exp(-deltaE/T)>rand % 以exp(-dC/T)概率接受新个体
- V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
- else
- V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(Pg - pop(j,:));
- end
- % 速度越界限制
- if V(j,:)>Vmax,
- V(j,:)=Vmax;
- end
- if V(j,:)<Vmin,
- V(j,:)=Vmin;
- end
-
- % 位置更新
- pop(j,:)=pop(j,:)+w*V(j,:);
- pop(j,:) = lb_ub(pop(j,:),Lb,Ub);
- % 适应值
- % [fitness(j), fitB(j) ]=fun(pop(j,:));
- fitness(j) = fun(pop(j,:));
-
- % 压缩因子
- C = Cs - (Cs-Ce)*(iter/maxiter)^2;
- xgima = 2/abs( 2-C - sqrt(C^2-4*C+eps) );
- newpop = pop(j,:)+xgima*V(j,:);
- newpop = lb_ub(newpop,Lb,Ub);
- % [newfitness, newfitB ]= fun(newpop);
- newfitness = fun(newpop);
- if(newfitness<fitness(j))
- pop(j,:) = newpop;
- fitness(j) = newfitness;
- % fitB(j) = newfitB;
- end
- % 个体最优更新
- if fitness(j) < fitnessgbest(j)
- gbest(j,:) = pop(j,:);
- fitnessgbest(j) = fitness(j);
- end
- % 群体最优更新
- if fitness(j) < fitnesszbest
- zbest = pop(j,:);
- fitnesszbest = fitness(j);
- % fitBzbest = fitB(j);
- end
-
- % 引入跳跃算子思想
- Pm = exp( -(fitnessgbest(j)-fitnesszbest)/T );
- if(Pm>rand)
- newpop = pop(j,:) + 0.5*rand*(Ub-Lb);
- end
- newpop = lb_ub(newpop,Lb,Ub);
- % [newfitness, newfitB ]= fun(newpop);
- newfitness = fun(newpop);
- if(newfitness<fitnesszbest)
- pop(j,:) = newpop;
- fitness(j) = newfitness;
- zbest = newpop;
- fitnesszbest = newfitness;
- % fitBzbest = newfitB;
- end
-
- end
- iter = iter+1; % 迭代次数更新
- y_fitness(1,iter) = fitnesszbest; % 为绘图做准备
- K_p(1,iter) = zbest(1);
- K_i(1,iter) = zbest(2);
- K_d(1,iter) = zbest(3);
- T = q*T; % 更新当前温度
- end
- %% 绘图
- disp(['IPSO最优解', num2str(zbest)])
- disp(['IPSO最优解对应的目标值', num2str(fitnesszbest)])
- fprintf('\n')
- figure(1) % 绘制性能指标ITAE的变化曲线
- plot(y_fitness,'LineWidth',3)
- title('最优个体适应值','fontsize',10);
- xlabel('迭代次数','fontsize',10);ylabel('适应值','fontsize',10);
- set(gca,'Fontsize',10);
- grid on
- figure(2) % 绘制PID控制器参数变化曲线
- plot(K_p,'b-','LineWidth',2); hold on
- plot(K_i,'k-.','LineWidth',2)
- plot(K_d,'r--','LineWidth',2)
- title('Kp、Ki、Kd 优化曲线','fontsize',10);
- xlabel('迭代次数','fontsize',10); ylabel('参数值','fontsize',10);
- set(gca,'Fontsize',10);
- legend('Kp','Ki','Kd',1);
- grid on;hold off;
- % PID响应
- if choosed==1
- [rint, yout]=PID_Fun_1_response(zbest);
- elseif(choosed==2)
- [rint, yout]=PID_Fun_2_response(zbest);
- elseif(choosed==3)
- [rint, yout]=PID_Fun_3_response(zbest);
- elseif(choosed==4)
- [rint, yout]=PID_Fun_4_response(zbest);
- elseif(choosed==5)
- [timef, rint, yout]=PID_Fun_5_response(zbest);
- end
- figure('color',[1,1,1])
- plot(timef, rint,'b-','linewidth',2);hold on;
- plot(timef, yout,'r.-','linewidth',2);
- axis tight;grid on;
- hold off;
- save IPSO.mat
- rmpath(genpath('./PID_funtion'))
- % rmpath(genpath('./test_function'))
复制代码 取值范围约束
- function pop = lb_ub(pop,popmin,popmax)
- j=1;
- for i=1:length(popmin)
- if pop(j,i)>popmax(i)
- pop(j,i)=popmax(i);
- end
- if pop(j,i)<popmin(i)
- pop(j,i)=popmin(i);
- end
- end
- end
复制代码 对比画图:
- clc,clear,close all
- warning off
- format longG
- load('PSO.mat')
- figure(1) % 绘制性能指标ITAE的变化曲线
- plot(y_fitness,'b-', 'LineWidth',3); hold on;
- clear
- load('IPSO.mat')
- plot(y_fitness,'r-', 'LineWidth',3)
- legend('PSO', '改进的PSO')
- title('最优个体适应值','fontsize',10);
- xlabel('迭代次数','fontsize',10);ylabel('适应值','fontsize',10);
- grid on
- clear
- load('PSO.mat')
- figure('color',[1,1,1])
- plot(timef, yout,'b.-','linewidth',2);hold on;
- axis tight;grid on;
- clear
- load('IPSO.mat')
- plot(timef, yout,'r.-','linewidth',2);
- plot(timef, rint,'g-','linewidth',2);
- legend('PSO', '改进的PSO')
- title('阶跃响应曲线')
- xlabel('(s)'); ylabel('响应值')
- hold off;
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|