TianZhendong
6 years ago
committed by
GitHub
1 changed files with 148 additions and 0 deletions
@ -0,0 +1,148 @@ |
|||||
|
%%清空环境 |
||||
|
clc; |
||||
|
clear; |
||||
|
close all; |
||||
|
|
||||
|
%%参数设置 |
||||
|
ChromosomeSize = 3; %染色体长度,参数的个数,PID有三个参数 |
||||
|
PopulationSize = 100; %种群规模 |
||||
|
MaxIter = 100; %最大迭代次数 |
||||
|
% MinFitness=0.01; %最小适应值 这里PID适应度函数取的倒数,因此应为最大。 |
||||
|
% CrossRate=0.6; %交叉概率 |
||||
|
MutateRate=0.2; %变异概率 |
||||
|
NoChangeNo=5; %直接复制的父辈的染色体数量 |
||||
|
UpLimit=30; %基因上限 |
||||
|
%% 全局变量 pid的三个参数 |
||||
|
global Kp; |
||||
|
global Ki; |
||||
|
global Kd; |
||||
|
|
||||
|
%% 初始化种群init.m |
||||
|
Population=rand(PopulationSize,ChromosomeSize); %种群,预分配内存 |
||||
|
for i=1:PopulationSize |
||||
|
disp(['正在初始化种群',num2str(i)]); |
||||
|
for j=1:ChromosomeSize |
||||
|
Population(i,j)=rand*30; %产生0-30之间的随机数用来初始化种群,30表示每个值不超过30 |
||||
|
end |
||||
|
end |
||||
|
clear i; |
||||
|
clear j; |
||||
|
|
||||
|
%% 开始循环 |
||||
|
%Iter =1; |
||||
|
PopulationFitness=zeros(PopulationSize,1); %种群适应度值,预分配内存 |
||||
|
BestFitness=zeros(MaxIter,1); %初始化每一代的最佳适应度 |
||||
|
AveFitness=zeros(MaxIter,1); |
||||
|
Elite=zeros(MaxIter,ChromosomeSize); %用于记录每一代的最优解 |
||||
|
|
||||
|
for Iter=1:MaxIter |
||||
|
disp(['迭代次数:',num2str(Iter)]); |
||||
|
% 适应值计算Fitness |
||||
|
for i=1:PopulationSize |
||||
|
Kp=Population(i,1); |
||||
|
Ki=Population(i,2); |
||||
|
Kd=Population(i,3); |
||||
|
PopulationFitness(i,:) = PSO_PID(Kp,Ki,Kd); |
||||
|
end |
||||
|
|
||||
|
% 适应值大小排序,并保存最佳 |
||||
|
FitnessSum=sum(PopulationFitness); %种群累加适应度 |
||||
|
AveFitness(Iter,1)=FitnessSum/PopulationSize; |
||||
|
[PopulationFitness,Index]=sort(PopulationFitness); %适应值从小到大排序 |
||||
|
BestFitness(Iter,1) = PopulationFitness(MaxIter,1); %最佳适应度 |
||||
|
Elite(Iter,:) = Population(Index(MaxIter),:); %记录本代的精英 |
||||
|
% if(BestFitness(Iter,1)<MinFitness) %判断是否达到要求的适应值 |
||||
|
% break; |
||||
|
% end |
||||
|
|
||||
|
% FitnessCumsum=cumsum(PopulationFitness); %累加适应度数组 |
||||
|
|
||||
|
|
||||
|
%复制适应值最大的不变的种群 |
||||
|
PopulationNew=zeros(PopulationSize,ChromosomeSize); |
||||
|
for i=1:NoChangeNo |
||||
|
PopulationNew(i,:)=Population(Index(MaxIter-i+1),:); |
||||
|
end |
||||
|
|
||||
|
%轮盘赌法 选择selection要交叉的父母 |
||||
|
for i=(NoChangeNo+1):2:PopulationSize |
||||
|
%确定要交叉的父亲染色体序号 |
||||
|
idx1=0; |
||||
|
idx2=0; |
||||
|
m1=0; |
||||
|
r1=rand*FitnessSum; |
||||
|
for k=1:PopulationSize |
||||
|
m1=m1+PopulationFitness(k); |
||||
|
if r1<m1 |
||||
|
idx1=Index(k); |
||||
|
break; |
||||
|
end |
||||
|
end |
||||
|
%确定要交叉的母亲染色体序号 |
||||
|
m2=0; |
||||
|
r2=rand*FitnessSum; |
||||
|
for k=1:PopulationSize |
||||
|
m2=m2+PopulationFitness(k); |
||||
|
if r2<m2 |
||||
|
idx2=Index(k); |
||||
|
break; |
||||
|
end |
||||
|
end |
||||
|
acr_position = floor(ChromosomeSize*rand+1); %要交叉的节点 |
||||
|
%交叉 |
||||
|
for j=1:acr_position |
||||
|
temp = Population(idx1,j); |
||||
|
Population(idx1,j) = Population(idx2,j); |
||||
|
Population(idx2,j) = temp; |
||||
|
end |
||||
|
%将产生的两个子代添加到新的种群中 |
||||
|
PopulationNew(i,:)=Population(idx1,:); |
||||
|
PopulationNew(i+1,:)=Population(idx2,:); |
||||
|
end |
||||
|
|
||||
|
%变异 mutation |
||||
|
for i=(NoChangeNo+1):PopulationSize |
||||
|
for j=1:ChromosomeSize |
||||
|
mut_rand = rand; %是否变异 |
||||
|
if mut_rand < MutateRate |
||||
|
mut_pm = rand; %增加还是减少 |
||||
|
mut_num = rand*(1-AveFitness(Iter)/BestFitness(Iter))^2; |
||||
|
if PopulationNew(i, j)>=UpLimit |
||||
|
PopulationNew(i, j)= PopulationNew(i, j)*(1-mut_num); |
||||
|
elseif mut_pm<=0.5 |
||||
|
PopulationNew(i, j)= PopulationNew(i, j)*(1-mut_num); |
||||
|
else |
||||
|
PopulationNew(i, j)= PopulationNew(i, j)*(1+mut_num); |
||||
|
end |
||||
|
if PopulationNew(i, j)>=UpLimit |
||||
|
PopulationNew(i, j)=UpLimit; |
||||
|
end |
||||
|
end |
||||
|
end |
||||
|
end |
||||
|
parfor i=1:PopulationSize |
||||
|
for j=1:ChromosomeSize |
||||
|
Population(i,j)=PopulationNew(i,j); |
||||
|
end |
||||
|
end |
||||
|
clear i; |
||||
|
clear j; |
||||
|
clear first; |
||||
|
clear last; |
||||
|
clear idx; |
||||
|
clear mid; |
||||
|
clear i; |
||||
|
clear j; |
||||
|
|
||||
|
K_p(1,Iter)=Elite(Iter,1); |
||||
|
K_i(1,Iter)=Elite(Iter,2); |
||||
|
K_d(1,Iter)=Elite(Iter,3); |
||||
|
end |
||||
|
figure(1) |
||||
|
plot(BestFitness,'LineWidth',2); |
||||
|
|
||||
|
figure(2) |
||||
|
plot(K_p) |
||||
|
hold on |
||||
|
plot(K_i,'k','LineWidth',3) |
||||
|
plot(K_d,'--r') |
Loading…
Reference in new issue