提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、SSA优点
  • 二、使用步骤
  • 三.主函数 main.m
  • 四.实验结果

前言

SSA优化PID控制
(博客借鉴了很多大佬的文章和代码,学生仅是以此学习,若有错误请您海涵。)


提示:以下是本篇文章正文内容,下面案例可供参考

一、SSA优点

麻雀搜索算法(SSA)是由薛建凯在2020年首次提出,该算法依据麻雀种群的觅食行为和反捕食行为的生物学群体特征提出,通过利用麻雀种群特征和个体特征建立数学模型,在寻找资源过程中,体现了群体搜索的优势,充分模拟了麻雀种群在自然界中的行为模式。相较于其它群体智能优化算法,麻雀搜索算法具有求解精度、效率高等特点。麻雀搜索算法及其优化改进方案目前已应用到了多个工程领域 。

二、使用步骤


SSA和传统的优化算法相似, 也是基于种群特征和个体特征建立的数学模型。调用方式和传统的优化算法相同,需要设置好SSA的一些种群数量、迭代次数、参数维度等参数。

fobj = @(X) PID_controller(X,S);%适应度函数
% 之后用上述语句来调用对应的你所需要的优化的适应度函数(fitness)

fitness代码如下(示例):

function [BsJ,r,yout,error]=PID_controller(Kpidi,S)
% PID控制误差--适应度函数
% 输入:Kp、Ki、Kd三个控制参数
% S = 1为单位阶跃响应。S = 2为正弦输入
% 输出: BsJ---控制累计误差
%% 二阶控制系统
ts=0.001;                   % 采样周期
%设一被控对象G(s)=50/(0.125s^2+7s),
sys=tf(50,[0.125,7, 0]); %tf是传递函数  即被控对象函数G();  可修改'
dsys=c2d(sys,ts,'z');
[num,den]=tfdata(dsys,'v'); % z变换后的分子分母系数
%%PID控制器
u_1=0.0;u_2=0.0;    % 初始化
y_1=0.0;y_2=0.0;    % 初始化
x=[0,0,0]';         % 初始化
BsJ=0;              % 初始化
error_1=0;          % 初始化
P=1000;              % 控制反馈次数
for k=1:Ptimef(k)=k*ts;if(S == 1)r(k)=1;        % 控制量1,单位阶跃响应1elser(k)=0.5*sin(2*pi*k*ts);endu(k)=Kpidi(1)*x(1)+Kpidi(2)*x(2)+Kpidi(3)*x(3);% 控制量越界控制if u(k)>=10u(k)=10;endif u(k)<=-10u(k)=-10;endyout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;error(k)=r(k)-yout(k);% PID控制参数u_2=u_1;u_1=u(k);y_2=y_1;y_1=yout(k);x(1)=error(k);                % P控制量x(2)=x(2)+error(k)*ts;        % I控制量 x(3)=(error(k)-error_1)/ts;   % D控制量 error_1=error(k);   Ji(k)=0.999*abs(error(k))+0.001*u(k)^2;BsJ=BsJ+Ji(k);if k>1erry(k)=yout(k)-yout(k-1);if erry(k)<0BsJ=BsJ+100*abs(erry(k));endend
end
end

三.主函数 main.m

代码如下(示例):

clear all
clcSearchAgents_no=50; % Number of search agents 种群数量
Max_iteration=100; % Maximum numbef of iterations 设定最大迭代次数
lb = [-5,2,2]; %下边界
ub = [5,5,5];  %上边界
dim = 3; %维度pid3个参数
S = 1;% 1为单位阶跃响应,其他为正弦输入
fobj = @(X) PID_controller(X,S);%适应度函数
[Best_pos,Best_score,SSA_curve]=SSA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj); %开始优化
figure
plot(SSA_curve,'Color','r','linewidth',2)
hold on
title('单位阶跃响应收敛曲线')
xlabel('迭代次数');
ylabel('最优适应度值');
axis tight
grid on
box on
legend('SSA')
[Bsu,rin,yout,error]=PID_controller(Best_pos,1);S=1时
figure('color',[1,1,1]),
plot(rin,'r--','Linewidth',2);
hold on;
plot(yout,'b-','Linewidth',2)
legend('rin','SSA-PID')
xlabel('时间');ylabel('PID控制输出量');
grid on;
title('单位阶跃响应')
disp(['PID值为:',num2str(Best_pos)]);S = 2;%正弦输入
fobj = @(X) PID_controller(X,S);%适应度函数
[Best_pos,Best_score,SSA_curve]=SSA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj); %开始优化
figure
plot(SSA_curve,'Color','r','linewidth',2)
hold on
title('正弦输入响应收敛曲线')
xlabel('迭代次数');
ylabel('最优适应度值');
axis tight
grid on
box on
legend('SSA')
[Bsu,rin,yout,error]=PID_controller(Best_pos,S); %S=2
figure('color',[1,1,1]),
plot(rin,'r--','Linewidth',2);
hold on;
plot(yout,'b-','Linewidth',2)
legend('rin','SSA-PID')
xlabel('时间');ylabel('PID控制输出量');
grid on;
title('正弦输入响应')
disp(['PID值为:',num2str(Best_pos)]);
% 麻雀优化算法             %
function [Best_pos,Best_score,curve]=SSA(pop,Max_iter,lb,ub,dim,fobj)ST = 0.6;%预警值
PD = 0.7;%发现者的比列,剩下的是加入者
SD = 0.2;%意识到有危险麻雀的比重PDNumber = pop*PD; %发现者数量
SDNumber = pop - pop*PD;%意识到有危险麻雀数量
if(max(size(ub)) == 1)ub = ub.*ones(1,dim);lb = lb.*ones(1,dim);
end%种群初始化
X0=initialization(pop,dim,ub,lb);
X = X0;
%计算初始适应度值
fitness = zeros(1,pop);
for i = 1:popfitness(i) =  fobj(X(i,:));
end[fitness, index]= sort(fitness);%排序
BestF = fitness(1);
WorstF = fitness(end);
GBestF = fitness(1);%全局最优适应度值
for i = 1:popX(i,:) = X0(index(i),:);
end
curve=zeros(1,Max_iter);
GBestX = X(1,:);%全局最优位置
X_new = X;
for i = 1: Max_iterBestF = fitness(1);WorstF = fitness(end);R2 = rand(1);for j = 1:PDNumberif(R2<ST)X_new(j,:) = X(j,:).*exp(-j/(rand(1)*Max_iter));elseX_new(j,:) = X(j,:) + randn()*ones(1,dim);end     endfor j = PDNumber+1:pop
%        if(j>(pop/2))if(j>(pop - PDNumber)/2 + PDNumber)X_new(j,:)= randn().*exp((X(end,:) - X(j,:))/j^2);else%产生-1,1的随机数A = ones(1,dim);for a = 1:dimif(rand()>0.5)A(a) = -1;endend AA = A'*inv(A*A');     X_new(j,:)= X(1,:) + abs(X(j,:) - X(1,:)).*AA';endendTemp = randperm(pop);SDchooseIndex = Temp(1:SDNumber); for j = 1:SDNumberif(fitness(SDchooseIndex(j))>BestF)X_new(SDchooseIndex(j),:) = X(1,:) + randn().*abs(X(SDchooseIndex(j),:) - X(1,:));elseif(fitness(SDchooseIndex(j))== BestF)K = 2*rand() -1;X_new(SDchooseIndex(j),:) = X(SDchooseIndex(j),:) + K.*(abs( X(SDchooseIndex(j),:) - X(end,:))./(fitness(SDchooseIndex(j)) - fitness(end) + 10^-8));endend%边界控制for j = 1:popfor a = 1: dimif(X_new(j,a)>ub)X_new(j,a) =ub(a);endif(X_new(j,a)<lb)X_new(j,a) =lb(a);endendend %更新位置for j=1:popfitness_new(j) = fobj(X_new(j,:));endfor j = 1:popif(fitness_new(j) < GBestF)GBestF = fitness_new(j);GBestX = X_new(j,:);   endendX = X_new;fitness = fitness_new;%排序更新[fitness, index]= sort(fitness);%排序BestF = fitness(1);WorstF = fitness(end);for j = 1:popX(j,:) = X(index(j),:);endcurve(i) = GBestF;
end
Best_pos =GBestX;
Best_score = curve(end);
endfunction Positions=initialization(SearchAgents_no,dim,ub,lb)Boundary_no= size(ub,2); % numnber of boundaries% If the boundaries of all variables are equal and user enter a signle
% number for both ub and lb
if Boundary_no==1Positions=rand(SearchAgents_no,dim).*(ub-lb)+lb;
end% If each variable has a different lb and ub
if Boundary_no>1for i=1:dimub_i=ub(i);lb_i=lb(i);Positions(:,i)=rand(SearchAgents_no,1).*(ub_i-lb_i)+lb_i;end
end

四.实验结果

以一个二阶系统传递函数为例:

结合上述的二阶系统传递函数,并利用麻雀搜索算法的寻优性能对其进行优化,以下分别用单位阶跃响应与正弦响应为例,探究麻雀搜索算法优化后的结果。如图2所示为单位阶跃激励下的响应,如图3为其SSA优化迭代过程;如图4所示为正弦激励下的响应,如图5为其SSA优化迭代过程;经过SSA优化后的PID参数值如表2所示。单位阶跃的PID跟踪效果:

正弦输入的PID跟踪效果


SSA迭代曲线对PID控制器的优化效果效果较好,迭代曲线精度随着迭代次数逐渐提升

SSA优化章:SSA优化PID相关推荐

  1. 基于MATLAB樽海鞘算法SSA(麻雀算法(十一)也简称SSA)的Eggholeer函数优化,测试函数的100种优化方法之十二

    樽海鞘算法优化 Eggholder测试函数 樽海鞘算法SSA(麻雀算法也简称SSA,如果想了解麻雀算法,看方法十一)模拟了樽海鞘的聚集成链的生活习性而提出的优化算法,是近几年刚推出的新算法之一.算法将 ...

  2. 第六章-Hadoop优化与发展

    第六章-Hadoop优化与发展 文章目录 第六章-Hadoop优化与发展 Hadoop探讨 HDFS HA HDFS Federation 资源调度框架YARN MapReduce1.0的缺陷 YAR ...

  3. 构建高性能ASP.NET站点 第七章 如何解决内存的问题(后篇)—托管资源优化—监常用优化措施...

    构建高性能ASP.NET站点 第七章 如何解决内存的问题(后篇)-托管资源优化-监常用优化措施   前言:有段时间没有写这个系列了,希望大家见谅,本篇主要将会介绍一些常用的CLR优化措施. 本篇的议题 ...

  4. 第 2 章 索引优化分析

    第 2 章 索引优化分析 1.慢 SQL 性能下降. SQL 慢.执行时间长.等待时间长的原因分析 查询语句写的烂 索引失效: 单值索引:在user表中给name属性建个索引,create index ...

  5. 《MATLAB 神经网络43个案例分析》:第3章 遗传算法优化BP神经网络——非线性函数拟合

    <MATLAB 神经网络43个案例分析>:第3章 遗传算法优化BP神经网络--非线性函数拟合 1. 前言 2. MATLAB 仿真示例 3. 小结 1. 前言 <MATLAB 神经网 ...

  6. 《MATLAB智能算法30个案例》:第12章 免疫优化算法在物流配送中心选址中的应用

    <MATLAB智能算法30个案例>:第12章 免疫优化算法在物流配送中心选址中的应用 1. 前言 2. MATLAB 仿真示例 3. 小结 1. 前言 <MATLAB智能算法30个案 ...

  7. 第一章:unity性能优化之内存优化

    目录 前言 unity性能优化之内存的优化 一.unity Analysis工具的使用. 二.内存优化方法 1.设置和压缩图片 2.图片格式 3.动画文件 4.模型 5.RenderTexture(R ...

  8. 第2章 索引优化分析

    第2章 索引优化分析 1 慢SQL 性能下降.SQL慢.执行时间长.等待时间长的原因分析 查询语句写的烂 索引失效: 单值索引:在user表中给name属性建个索引,create index idx_ ...

  9. 电子商务应用课程知识整理 第五章-搜索引擎优化(SEO)

    文章目录 一.认识SEO SEO概述 SEO相关术语 SEO黑帽 SEO白帽 PV(Page View) 跳出率 沙盒效应 SPAM 快照 二.SEO常用技术 1. 网页title的优化 要点: 2. ...

  10. 提高篇 第五部分 动态规划 第6章 斜率优化动态规划

    例1 任务安排(TYVJ1098) [tyvj1098]任务安排(dp)_薇小薇-CSDN博客 Tyvj1098 任务安排_Monster__Yi的博客-CSDN博客 P2365 任务安排 任务安排 ...

最新文章

  1. Android学习笔记之使用百度地图实现地图控制
  2. UP_DOWN_REQUEST
  3. 和Leo一起做爱字符串的好孩子量子纠缠
  4. C++ 高级篇(五)—— 预处理指令
  5. 关于规划修编标准的问题
  6. java中的多态与继承_【Java学习笔记之十六】浅谈Java中的继承与多态
  7. 上海师范大学计算机技术考研分数线,上海师范大学2019年考研复试分数线已公布...
  8. 为什么Python 4.0不会像Python 3.0
  9. 【算法】剑指 Offer 56 - II. 数组中数字出现的次数 II 【重刷】
  10. java 获取路径_java 获取当前类的路径
  11. 2018/12/06 eclipse 快速加载需要的包
  12. Ubuntu使用谷歌浏览器登录账号时崩溃
  13. textarea 在 Chrome Safari FireFox 浏览器中禁用拖动和固定大小
  14. java程序开发的简历_Java程序开发工作简历
  15. BLE蓝牙应用生成Android/iOS APP以及小程序
  16. 计算机u盘驱动坏了如何的修复,u盘损坏怎么修复 u盘损坏再次使用
  17. 推荐5款小众实用神器软件,功能强大,值得你去收藏
  18. 搜狗输入法低版本导致谷歌浏览器上传下载时崩溃
  19. 测试篇(二): 如何合理的创建bug、bug的级别、bug的生命周期、跟开发产生争执怎么办
  20. 计算机多媒体对语文教学的提高,【原创论文】多媒体技术在中学语文教学中的应用...

热门文章

  1. 永硕E盘 - ys168.com 免费网盘右侧广告关闭方法
  2. C#操作.exe文件
  3. 如何利用CustomFont+PS制作字体
  4. 数据挖掘常用算法整理
  5. 游戏美术设计中,最难的角色人物如何设计才能吸睛?
  6. gateway中的局部过滤器_GateWay过滤器
  7. 阿里云服务器租用测试
  8. let与var的区别(重点看例子)
  9. JavaScript进阶(8)-ES6简介及新增let和const关键字
  10. springboot--入门程序实现CRUD操作