diff --git a/GA_PID.m b/GA_PID.m new file mode 100644 index 0000000..a868af9 --- /dev/null +++ b/GA_PID.m @@ -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)=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')