基于蚁群算法的PID控制参数优化Matlab源码(2009-07-2612:31:02)除了蚁群算法,可用于PID参数优化的智能算法还有很多,比如遗传算法、模拟退火算法、粒子群算法、人工鱼群算法,等等。function[BESTX,BESTY,ALLX,ALLY]=ACOUCP(K,N,Rho,Q,Lambda,LB,UB,Num,Den,Delay,ts,StepNum,SigType,PIDLB,PIDUB)%%此函数实现蚁群算法,用于PID控制参数优化%GreenSim团队原创作品,转载请注明%Email:greensim@163.com%GreenSim团队主页:[color=red]欢迎访问GreenSim——算法仿真团队→[url=][/url][/color]%%输入参数列表%K迭代次数%N蚁群规模%Rho信息素蒸发系数,取值0~1之间,推荐取值0.7~0.95%Q信息素增加强度,大于0,推荐取值1左右%Lambda蚂蚁爬行速度,取值0~1之间,推荐取值0.1~0.5%LB决策变量的下界,M×1的向量%UB决策变量的上界,M×1的向量%Num被控制对象传递函数的分子系数向量%Den被控制对象传递函数的分母系数向量%Delay时间延迟%ts仿真时间步长%StepNum仿真总步数%SigType信号类型,1为阶跃信号,2为方波信号,3为正弦波信号%PIDLBPID控制输出信号限幅的下限%PIDUBPID控制输出信号限幅的上限%%输出参数列表%BESTXK×1细胞结构,每一个元素是M×1向量,记录每一代的最优蚂蚁%BESTYK×1矩阵,记录每一代的最优蚂蚁的评价函数值%ALLXK×1细胞结构,每一个元素是M×N矩阵,记录每一代蚂蚁的位置%ALLYK×N矩阵,记录每一代蚂蚁的评价函数值%%第一步:初始化M=length(LB);%决策变量的个数%蚁群位置初始化X=zeros(M,N);fori=1:Mx=unifrnd(LB(i),UB(i),1,N);X(i,:)=x;end%输出变量初始化ALLX=cell(K,1);%细胞结构,每一个元素是M×N矩阵,记录每一代的个体ALLY=zeros(K,N);%K×N矩阵,记录每一代评价函数值BESTX=cell(K,1);%细胞结构,每一个元素是M×1向量,记录每一代的最优个体BESTY=zeros(K,1);%K×1矩阵,记录每一代的最优个体的评价函数值k=1;%迭代计数器初始化Tau=ones(1,N);%信息素初始化Y=zeros(1,N);%适应值初始化%%第二步:迭代过程whilek=KYY=zeros(1,N);forn=1:Nx=X(:,n);[J,u,yout,error]=PIDOBJ(x(1),x(2),x(3),Num,Den,Delay,ts,StepNum,SigType,PIDLB,PIDUB);YY(n)=J;endmaxYY=max(YY);temppos=find(YY==maxYY);POS=temppos(1);%蚂蚁随机探路forn=1:Nifn~=POSx=X(:,n);[J,u,yout,error]=PIDOBJ(x(1),x(2),x(3),Num,Den,Delay,ts,StepNum,SigType,PIDLB,PIDUB);Fx=J;mx=GaussMutation(x,LB,UB);[J,u,yout,error]=PIDOBJ(mx(1),mx(2),mx(3),Num,Den,Delay,ts,StepNum,SigType,PIDLB,PIDUB);Fmx=J;ifFmxFxX(:,n)=mx;Y(n)=Fmx;elseifrand1-(1/(sqrt(k)))Y(n)=Fmx;elseX(:,n)=x;Y(n)=Fx;endendendforn=1:Nifn~=POSx=X(:,n);[J,u,yout,error]=PIDOBJ(x(1),x(2),x(3),Num,Den,Delay,ts,StepNum,SigType,PIDLB,PIDUB);Fx=J;mx=GaussMutation(x,LB,UB);[J,u,yout,error]=PIDOBJ(mx(1),mx(2),mx(3),Num,Den,Delay,ts,StepNum,SigType,PIDLB,PIDUB);Fmx=J;ifFmxFxY(n)=Fmx;elseifrand1-(1/(sqrt(k)))X(:,n)=mx;Y(n)=Fmx;elseX(:,n)=x;Y(n)=Fx;endendend%朝信息素最大的地方移动forn=1:Nifn~=POSx=X(:,n);r=(K+k)/(K+K);p=randperm(N);t=ceil(r*N);pos=p(1:t);TempTau=Tau(pos);maxTempTau=max(TempTau);pos2=find(TempTau==maxTempTau);pos3=pos(pos2(1));x2=X(:,pos3(1));x3=(1-Lambda)*x+Lambda*x2;[J,u,yout,error]=PIDOBJ(x(1),x(2),x(3),Num,Den,Delay,ts,StepNum,SigType,PIDLB,PIDUB);Fx=J;[J,u,yout,error]=PIDOBJ(x(1),x(2),x(3),Num,Den,Delay,ts,StepNum,SigType,PIDLB,PIDUB);Fx3=J;ifFx3FxX(:,n)=x3;Y(n)=Fx3;elseifrand1-(1/(sqrt(k)))X(:,n)=x3;Y(n)=Fx3;elseX(:,n)=x;Y(n)=Fx;endendend%更新信息素并记录Tau=Tau*(1-Rho);maxY=max(Y);minY=min(Y);DeltaTau=(maxY-Y)/(maxY-minY);Tau=Tau+Q*DeltaTau;ALLX{k}=X;ALLY(k,:)=Y;minY=min(Y);pos4=find(Y==minY);BESTX{k}=X(:,pos4(1));BESTY(k)=minY;disp(k);k=k+1;end