%% 清空环境
clear
clc
%% 参数设置
w = 0.729; %惯性因子
c1 = 1.49445; %加速常数
c2 = 1.49445; %加速常数
Dim = 5; %维数
SwarmSize = 30; %粒子群规模
ObjFun = @PSO_LQR; %待优化函数句柄
MaxIter =50; %最大迭代次数
Vmax = 0.01; %速度范围上限
Vmin = -0.01; %速度范围下限
Ub = [1e15 1e15 1e15 1e15 1.5]; %待优化参数范围上限
Lb = [1e10 1e10 1e10 1e10 0.5]; %待优化参数范围下限
%% 粒子群初始化
Range = ones(SwarmSize,1)*(Ub-Lb);
Swarm = rand(SwarmSize,Dim).*Range + ones(SwarmSize,1)*Lb; %初始化粒子群
Vstep = rand(SwarmSize,Dim)*(Vmax-Vmin) + Vmin; %初始化速度
fSwarm = zeros(SwarmSize,1);
for i = 1:SwarmSize
fSwarm(i,:) = feval(ObjFun,Swarm(i,:)); %粒子群适应值计算
end
%% 个体极值和群体极值
[bestf,bestindex] = min(fSwarm);
zbest = Swarm(bestindex,:); %全局最佳
fzbest = bestf; %全局最佳适应值
gbest = Swarm; %个体最佳
fgbest = fSwarm; %个体最佳适应值
%% 迭代寻优
iter = 0;
y_fitness = zeros(1,MaxIter);
for iter=1:MaxIter
for j = 1:SwarmSize
%速度更新
Vstep(j,:) = w*Vstep(j,:) + c1*rand*(gbest(j,:)-Swarm(j,:)) + c2*rand*(zbest-Swarm(j,:));
if Vstep(j,:)>Vmax
Vstep(j,:) = Vmax;
end
if Vstep(j,:)<Vmin
Vstep(j,:) = Vmin;
end
%位置更新
Swarm(j,:) = Swarm(j,:) + Vstep(j,:);
for k = 1:Dim
if Swarm(j,k)>Ub(k)
Swarm(j,k) = Ub(k);
end
if Swarm(j,k)<Lb(k)
Swarm(j,k) = Lb(k);
end
end
%适应值
fSwarm(j,:) = feval(ObjFun,Swarm(j,:));
%个体最优更新
if fSwarm(j)<fgbest(j)
gbest(j,:) = Swarm(j,:);
fgbest(j) = fSwarm(j);
end
%群体最优更新
if fSwarm(j)<fzbest
zbest = Swarm(j,:);
fzbest = fSwarm(j);
end
end
y_fitness(1,iter) = fzbest;
iter = iter + 1; %迭代次数更新
end
%% 绘图输出
figure(1); %绘制性能指标ITAE变化曲线
plot(y_fitness,'LineWidth',2)
title('最优个体适应值','fontsize',18);
xlabel('迭代次数','fontsize',18);
ylabel('适应值','fontsize',18);