⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ga.m

📁 热能工程专业硕士研究生毕业课题:遗传算法目标函数优化
💻 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 + -