diff --git a/GA_PID.m b/GA_PID.m index 7dc4691..3204ef5 100644 --- a/GA_PID.m +++ b/GA_PID.m @@ -2,21 +2,19 @@ clc; clear; close all; - -%%参数设置 +%% 参数设置 ChromosomeSize = 3; %染色体长度,参数的个数,PID有三个参数 PopulationSize = 100; %种群规模 MaxIter = 100; %最大迭代次数 -% MinFitness=0.01; %最小适应值 这里PID适应度函数取的倒数,因此应为最大。 +MinFitness=0.01; %最小适应值 % CrossRate=0.6; %交叉概率 MutateRate=0.2; %变异概率 -NoChangeNo=5; %直接复制的父辈的染色体数量 -UpLimit=30; %基因上限 -%% 全局变量 pid的三个参数 +ObjFun=@PSO_PID; %适应值函数 +NoChangeNo=5; +UpLimit=30; %上限 global Kp; global Ki; global Kd; - %% 初始化种群init.m Population=rand(PopulationSize,ChromosomeSize); %种群,预分配内存 for i=1:PopulationSize @@ -36,18 +34,18 @@ AveFitness=zeros(MaxIter,1); Elite=zeros(MaxIter,ChromosomeSize); %用于记录每一代的最优解 for Iter=1:MaxIter - disp(['迭代次数:',num2str(Iter)]); - % 适应值计算Fitness + disp(['迭代次数:',num2str(Iter)]); %显示迭代进度 + %% 适应值计算Fitness for i=1:PopulationSize Kp=Population(i,1); Ki=Population(i,2); Kd=Population(i,3); - PopulationFitness(i,:) = fitness(Kp,Ki,Kd); + PopulationFitness(i,1) = fitness(Kp,Ki,Kd); end - % 适应值大小排序,并保存最佳 + %% 适应值大小排序,并保存最佳个体和最佳适应度 FitnessSum=sum(PopulationFitness); %种群累加适应度 - AveFitness(Iter,1)=FitnessSum/PopulationSize; + AveFitness(Iter,1)=FitnessSum/PopulationSize; %种群平均适应度 [PopulationFitness,Index]=sort(PopulationFitness); %适应值从小到大排序 BestFitness(Iter,1) = PopulationFitness(MaxIter,1); %最佳适应度 Elite(Iter,:) = Population(Index(MaxIter),:); %记录本代的精英 @@ -73,7 +71,7 @@ for Iter=1:MaxIter r1=rand*FitnessSum; for k=1:PopulationSize m1=m1+PopulationFitness(k); - if r1