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

📄 ga_new.m

📁 遗传算法和神经网络联合用于数据融合
💻 M
字号:
function [a,b,d]=GA_new(x,D,Wnum,NIND,chrom,WmaX,a,b,d,ec2)

%  x D:神经网络训练信号  Wnum:权值总数(含阀值)    NIND:个体数目
%  chrom: 个体集合  

%  a=zeros(2,6);   %隶属函数中心值和宽度
%  b=zeros(2,6);             
%  d=zeros(6,6);   %输出层权值 

%  ec2:遗传算法修正权值的误差限(目标), 达到则退出遗传算法  net1:返回的网络
%  maxI:最差个体编号    %%权值最大范围[-WmaX WmaX]
%%%%%%%%遗传算法代码%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

G=20000;
for g=1:G     %%设置遗传10000代
  %%%%%%%%%%%%%%%%%遗传算法第一步(选择算法应用轮盘选择算子)
    
    %W=zeros(NIND,Wnum);  %%权值矩阵
    f=zeros(NIND,1);     %%适应函数
    e=zeros(NIND,1);     %%网络误差函数
    Onorm2=0;            %%目标值二范数误差
    
    F=0;%%适应度总和
    
    %%%%% 计算这一代种群的适应度
    for i=1:NIND
        a(1,1:6)=chrom(i,1:6);                              %%遗传算法为神经网络赋值  
        a(2,1:6)=chrom(i,7:12);
        
        b(1,1:6)=chrom(i,13:18);                            %%遗传算法为神经网络赋值 
        b(2,1:6)=chrom(i,19:24); 
        
        for ii=1:6
            for jj=1:6
                d(ii,jj)=chrom(i,24+(ii-1)*6+jj);
            end
        end
        
        y=net_new(x,a,b,d);                                  %%神经网络计算出结果
        ee=D-y;
        Onorm2=0.0;
        for j=1:20
            f(i,1)=f(i,1)+ee(j,1)*ee(j,1);
            Onorm2=Onorm2+D(j,1)*D(j,1);
        end
        f(i,1)=f(i,1)/Onorm2;
        e(i,1)=f(i,1);
        f(i,1)=1/(f(i,1)+0.01);
        F=F+ f(i,1);
    end 

    
    maxI=1;      %%得到误差最大的个体,即适应度最差的个体
    Wmax=e(1,1);
    for i=1:NIND
        if e(i,1)>Wmax
            Wmax=e(i,1);
            maxI=i;
        else
        end
    end
    
        
    k=1;      %%得到误差最小的个体,即适应度最好的个体
    Wmin=e(1,1);
    for i=1:NIND
        if e(i,1)<Wmin
            Wmin=e(i,1);
            k=i;
        else
        end
    end
    
    %%用适应度最好的个体为神经网络赋值
    a(1,1:6)=chrom(k,1:6);                              %%遗传算法为神经网络赋值  
    a(2,1:6)=chrom(k,7:12);
        
    b(1,1:6)=chrom(k,13:18);                            %%遗传算法为神经网络赋值 
    b(2,1:6)=chrom(k,19:24); 
        
     for ii=1:6
         for jj=1:6
             d(ii,jj)=chrom(k,24+(ii-1)*6+jj);
          end
     end
      
    
     %%计算神经网络的误差,若满足<=ec2则退出遗传算法
     y=net_new(x,a,b,d);                                  %%神经网络计算出结果
     ee=D-y;
     etemp=0.0;
     Onorm2=0.0;
     for j=1:20
          etemp=etemp+ee(j,1)*ee(j,1);
          Onorm2=Onorm2+D(j,1)*D(j,1);
      end
      etemp=etemp/Onorm2; 
      if etemp<=ec2
          disp('etemp<=ec2,退出');
          return;
      else
      end
      
      disp('误差');
      etemp
    
      
    %%用于计算个体的交叉概率Pc和变异概率Pm
    f_max=max(f);
    f_min=min(f);
    f_ave=F/NIND;
    k1=0.9;
    k2=0.9;
    k3=0.1;
    k4=0.1;
    
    
    %%%%%计算每个染色体被选择的概率%%%%%%%%%%%%%%%%%
    Pp=zeros(NIND,1);
    Pp=f/F;

    %%%%%%计算每个染色体的累计概率
    Q=zeros(NIND,1);
    for i=1:NIND
        for j=i:NIND
            Q(j)=Q(j)+Pp(i,1);
        end
    end
    
    %%%%转动轮盘NIND次,产生NIND个[0 1]之间的随机数**********************
    R=rand(NIND,1);
    %%%%%%%%%%%%%应用轮盘算子选择新一代个体%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    chrom_temp=zeros(NIND,Wnum);
    for m=1:NIND-1
        for n=1:NIND
            if R(m)<=Q(n)
                chrom_temp(m,1:Wnum)=chrom(n,1:Wnum);
                break;
            else
            end
        end
    end
    chrom_temp(NIND,1:Wnum)=chrom(k,1:Wnum);
    chrom=chrom_temp;
    
%%%%%%%%%%%%%%%%%遗传算法第二步,单点交叉%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   R=rand(NIND,1);
   kc=0;%%要交叉的个体的数目
   km=zeros(NIND,1);%%记录下需要交叉的个体编号
   
   for t=1:NIND
       %%计算Pc
          if f(t,1)>=f_ave
            Pc=k1*(f_max-f(t,1))/(f_max-f_ave)+0.05*k1;
          else
            Pc=k2;
          end
       
       if R(t)<=Pc
         kc=kc+1;
         km(kc,1)=t;
       else
       end
   end
   if (int8(kc/2)-kc/2)==0
      for s=1:kc/2
          kgene=int8((Wnum-1)*rand);%%交叉点的位置
          kgene=kgene+1;
          if kgene>Wnum
              kgene=Wnum;
          else
          end
          if km(kc/2+s,1)>NIND
              km(kc/2+s,1)=NIND;
          else
          end
         
          gene=chrom(km(s,1),int8(kgene):int8(Wnum)); %%
          gene2=chrom(km(kc/2+s,1),int8(kgene):int8(Wnum)); 
          randdd=rand;
          chrom(km(s,1),int8(kgene):int8(Wnum))=randdd*gene+(1-randdd)*gene2;
          chrom(km(kc/2+s,1),int8(kgene):int8(Wnum))=randdd*gene2+(1-randdd)*gene;
      end
   else if(int8(kc/2)-kc/2)~=0
      for s=1:((kc-1)/2)
          kgene=int8((Wnum-1)*rand);%%交叉点的位置
          kgene=kgene+1;
          if kgene>Wnum
              kgene=Wnum;
          else
          end
          if km((kc-1)/2+s,1)>NIND
              km((kc-1)/2+s,1)=NIND;
          else
          end  
          
          gene=chrom(km(s,1),int8(kgene):int8(Wnum));
          gene2=chrom(km((kc-1)/2+s,1),int8(kgene):int8(Wnum));
          randdd=rand;
          chrom(km(s,1),int8(kgene):int8(Wnum))=randdd*gene+(1-randdd)*gene2;
          chrom(km((kc-1)/2+s,1),int8(kgene):int8(Wnum))=randdd*gene2+(1-randdd)*gene;
          
       end
   end

%%%%%%%%%%%%%%%%%%遗传算法第三步,变异运算%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

   R=rand(NIND,1);
   for t=1:NIND
       %%计算Pm
          if f(t,1)>=f_ave
            Pm=k3*(f_max-f(t,1))/(f_max-f_ave)+0.05*k3;
          else
            Pm=k4;
          end
       if R(t)<=Pm
            kmut=int8((NIND-1)*rand(1));%%产生要进行变异的个体编号
            kmut=kmut+1;
            if kmut>NIND
                kmut=NIND;
            else
            end
            kmutgene=int8((Wnum-1)*rand(1));%%产生要进行变异的基因的编号
            kmutgene=kmutgene+1;
            if kmutgene>Wnum
                kmutgene=Wnum;
            else
            end
            tempp=chrom(kmut,kmutgene);
            if rand>0.5
               tempss=rand;
               %fff=1-tempss.^((1.0-g/G).^2.0);
               chrom(kmut,kmutgene)=tempp+(max(chrom(kmut,1:Wnum))-tempp)*tempss;
            else
                tempss=rand;
                %fff=1-tempss.^((1.0-g/G).^2.0);
                chrom(kmut,kmutgene)=tempp+(min(chrom(kmut,1:Wnum))-tempp)*tempss;        
            end       
       end
   end
    disp('个体计算完成,g=');
    g
end  

if g==G
    disp(['遗传算法达到次,未满足ec2误差限值']);
end

end
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -