?? gen2.asv
字號(hào):
%a,b,c為KP,KI,KD的變化范圍;popsize為群體規(guī)模;lchrom為表示(KP,KI,KD)的染色體串長(zhǎng)度;maxgen為進(jìn)化的最大代數(shù)
%pcross為交叉概率;pmutation為變異概率;min為上一代最小適應(yīng)度;max為最大適應(yīng)度;minpp為適應(yīng)度最小個(gè)體的序號(hào);
%maxpp為適應(yīng)度最大個(gè)體的序號(hào);
function sys=gen2
global a b oldpop newpop popsize lchrom maxgen pcross pmutation fitu;
global min max minpp maxpp k lc gen s;
% %******************************參數(shù)初始化************************************
a=[0 0 0];
b=[10 10 10];
popsize=6;
lchrom=18;
lc=lchrom/3;
% maxgen=10;
pcross=[0.6 0.6 0.6];
pmutation=0.02;
gen=0;
k=1;
% %********************************群體的初始化*******************************%
for s=1:popsize
oldpop{s}.chrom=randint(1,18);
oldpop{s}.dvalue=decode(oldpop{s}.chrom);
kp=oldpop{s}.dvalue(1);
ki=oldpop{s}.dvalue(2);
kd=oldpop{s}.dvalue(3);
oldpop{s}.fitness=1; %計(jì)算每個(gè)個(gè)體的適應(yīng)度%
oldpop{s}.parent1=0;
oldpop{s}.parent2=0;
oldpop{s}.xsite=0;
% aa=oldpop{k}.fitness;
end
statistics(oldpop)
% %**************************************************************************
% %***************************遺傳操作***************************
% function generation(u)
% global oldpop popsize newpop jcross
% j=1;
% while(j<popsize)
mate1=select;
mate2=select;
% crossover(oldpop{mate1}.chrom,oldpop{mate2}.chrom,j);
%*********************交叉操作*****************************
% function crossover(parent1,parent2,k)
% global pcross lchrom jcross newpop;
%*******************判斷是否交叉***************************
for i=1:3
pp=rand;
%************************確定交叉位置************************
if (pp<pcross(i))
jcross(i)=randint(1,1,[lc*(i-1)+1,lc*i]);
else
jcross(i)=lchrom/(4-i);
end
%**********************進(jìn)行交叉與變異操作*********************
if(jcross(i) ~= lchrom/(4-i))
for j=(lc*(i-1)+1):jcross(i)
newpop{k}.chrom(j)=mutation(oldpop{mate1}.chrom(j));
newpop{k+1}.chrom(j)=mutation(oldpop{mate2}.chrom(j));
end
for j=jcross(i):lc*i
newpop{k}.chrom(j)=mutation(oldpop{mate2}.chrom(j));
newpop{k+1}.chrom(j)=mutation(oldpop{mate1}.chrom(j));
end
else
for j=(lc*(i-1)+1):lc*i
newpop{k}.chrom(j)=mutation(oldpop{mate1}.chrom(j));
newpop{k+1}.chrom(j)=mutation(oldpop{mate2}.chrom(j));
end
end
%*************************************************************
end
%*************************************************************
newpop{k}.dvalue=decode(newpop{k}.chrom);
newpop{k}.fitness=objfunc(u(2));
newpop{k}.parent1=mate1;
% disp('aaa');
% a=newpop{j}.parent1
newpop{k}.parent2=mate2;
newpop{k}.xsite=jcross;
newpop{k+1}.dvalue=decode(newpop{k+1}.chrom);
newpop{k+1}.fitness=objfunc(u(2));
newpop{k+1}.parent1=mate1;
newpop{k+1}.parent2=mate2;
newpop{k+1}.xsite=jcross;
disp('kp=');
sys(1)=(newpop{k}.dvalue(1)+ newpop{k+1}.dvalue(1))/2;
disp('ki=')
sys(2)=(newpop{k}.dvalue(2)+ newpop{k+1}.dvalue(2))/2;
disp('kd=')
sys(3)=(newpop{k}.dvalue(3)+ newpop{k+1}.dvalue(3))/2;
k=k+2
%***************************************************************
if mod(k,51)==0
k=1;
% while(gen<maxgen)
gen=gen+1
oldmax=max;
oldmaxpp=maxpp;
statistics(newpop);
% disp('aaaaaaaaaaa')
% max
% maxpp
if(max<oldmax)
newpop{minpp}.chrom=oldpop{oldmaxpp}.chrom;
newpop{minpp}.dvalue=oldpop{oldmaxpp}.dvalue;
newpop{minpp}.fitness=oldpop{oldmaxpp}.fitness;
statistics(newpop);
end
for s=1:popsize
oldpop{s}.chrom=newpop{s}.chrom;
end
end
else
sys=[];
end
end
%*********************譯碼*************************************
function dval=decode(x)
global a b;
m=[0 0 0];
for i=1:3
for j=1:6
m(i)=m(i)+x((i-1)*6+j)*(2^(6-j));
end
end
for i=1:3
dval(i)=a(i)+m(i)*(b(i)-a(i))/(2^6-1);
end
end
%**************************************************************
%***************************適應(yīng)度函數(shù)**************************
function fit=objfunc(c)
if c~=0
fit=1/c;
else
fit=0;
end
end
%***************************適應(yīng)度函數(shù)**************************
%***************************選擇操作****************************
function rs=select
global oldpop popsize;
index(1)=randint(1,1,[1,popsize]);
index(2)=randint(1,1,[1,popsize]);
if (oldpop{index(1)}.fitness > oldpop{index(2)}.fitness)
rs=index(1);
else
rs=index(2);
end
end
%***************************************************************
%*******************群體適應(yīng)度計(jì)算******************************
function statistics(pop)
global newpop oldpop popsize min max maxpp minpp;
sumfitness=pop{1}.fitness;
min=pop{1}.fitness;
max=pop{1}.fitness;
maxpp=1;
minpp=1;
for j=1:popsize
sumfitness=sumfitness+pop{j}.fitness;
if (pop{j}.fitness>max)
max=pop{j}.fitness;
maxpp=j;
end
if(pop{j}.fitness<min)
min=pop{j}.fitness;
minpp=j;
end
end
avg=sumfitness/popsize;
end
%************************************************************
%*****************************變異操作***********************
function vmut=mutation(ch)
global pmutation
pp1=rand;
if (pp1<pmutation)
ch=~ch;
end
vmut=ch;
end
%************************************************************
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -