📄 ga.m
字号:
clc;
clear;
T=200;%代数
for k=1:T
m=80;%一次选择个体数目
Pc=0.6;%交叉概率
Pm=0.005;%变异概率
x1l=1 ;x1r=3; %k
x2l=4; x2r=7;%T1
x3l=9; x3r=11;%T2
for i=1:m %产生初始种群
pop1(i)=rand(1)*(x1r-x1l)+x1l;
pop2(i)=rand(1)*(x2r-x2l)+x2l;
pop3(i)=rand(1)*(x3r-x3l)+x3l;
end
%按照误差的平方的最小值计算目标函数
%
for i=1:m
k=pop1(i);
T1=pop2(i);
T2=pop3(i);
ts=2;%采样周期
global timef yout yout0 r
r=1.0;%阶越输入
x0=[0,0];
x=[0,0];
yout0=0;
yout=0;
error=0;
p=200;
Q=0;
for i=1:p
timef(i)=i*ts;
x(1)=x(1)+ts*(k/T1*r-1/T1*x(1));
x(2)=x(2)+ts*(1/T2*x(1)-1/T2*x(2));
yout(i)=x(2);
x0(1)=x0(1)+ts*(2/6*r-1/6*x0(1));
x0(2)=x0(2)+ts*(1/10*x0(1)-1/10*x0(2));
yout0(i)=x0(2);
error(i)=yout(i)-yout0(i);
Q=Q+(error(i)^2);
end
QQ(i)=Q;
end
%计算适应度, 由于直接是求最小值问题,所以直接将Q取为个体的适应度
sumQQ=sum(QQ);
cfitness=QQ/sumQQ;
for i=1:m
cfitness(i)=(1-cfitness(i))/(m-1);
end
% 根据适应度大小, 选择下一代(比例选择)
for i=2:m
cfitness(i)=cfitness(i-1)+cfitness(i);
end
for i=1:m %选择运算
p=rand(1);
index=i;
while(p>cfitness(index))
index=index+1;
end
newpop1(i)=pop1(index);
newpop2(i)=pop2(index);
newpop3(i)=pop3(index);
end
for i=1:m%放回原来数组里
pop1(i)=newpop1(i);
pop2(i)=newpop2(i);
pop3(i)=newpop3(i);
end
for i=1:m %交插运算
p=rand(1);
index1(i)=floor(rand(1)*(m-1))+1;
index2(i)=floor(rand(1)*(m-1))+1;
index3(i)=floor(rand(1)*(m-1))+1;
if (p<Pc)
A=rand(1);
pop1(i)=pop1(i)*A+(1-A)*pop1(index1(i));
B=rand(1);
pop2(i)=pop2(i)*B+(1-B)*pop2(index2(i));
C=rand(1);
pop3(i)=pop3(i)*C+(1-C)*pop3(index3(i));
end
end
%变异运算,
Leng1=1;
Leng2=1;
Leng3=1;
for i=1:m
p=rand(1);
if p<Pm
pop1(i)=pop1(i)+Leng1*(rand(1)-0.5)*(x1r-x1l);
pop2(i)=pop2(i)+Leng2*(rand(1)-0.5)*(x2r-x2l);
pop3(i)=pop3(i)+Leng3*(rand(1)-0.5)*(x3r-x3l);
if(pop1(i)>x1r)
pop1(i)=x1r;
end
if(pop1(i)<x1l)
pop1(i)=x1l;
end
if(pop2(i)>x2r)
pop2(i)=x2r;
end
if(pop2(i)<x2l)
pop2(i)=x2l;
end
if(pop3(i)>x3r)
pop3(i)=x3r;
end
if(pop3(i)<x3l)
pop3(i)=x3l;
end
end
end
end
for i=1:m
k=pop1(i);
T1=pop2(i);
T2=pop3(i);
ts=2;%采样周期
global timef yout yout0 r
r=1.0;%阶越输入
x0=[0,0];
x=[0,0];
yout0=0;
yout=0;
error=0;
p=200;
Q=0;
for i=1:p
timef(i)=i*ts;
x(1)=x(1)+ts*(k/T1*r-1/T1*x(1));
x(2)=x(2)+ts*(1/T2*x(1)-1/T2*x(2));
yout(i)=x(2);
x0(1)=x0(1)+ts*(2/6*r-1/6*x0(1));
x0(2)=x0(2)+ts*(1/10*x0(1)-1/10*x0(2));
yout0(i)=x0(2);
error(i)=yout(i)-yout0(i);
Q=Q+(error(i)^2);
end
%循环结束,求出最优个体.
QQ(i)=Q;
end
[f,I]=min(QQ);
k_s=pop1(I)
T1_s=pop2(I)
T2_s=pop3(I)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -