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

📄 yichuansufa.m

📁 主成分分析法计算过程matlab实现软件
💻 M
📖 第 1 页 / 共 2 页
字号:
      ww=[];
     for i=1:pp
        ww(i,:)=zuojie+jiechang*rand(1,getichangdu);              %存放所有权值和阈值放到一行的pp条染色体
     end 
     for L=1:M
       ww;       
       for i=1:pp    
            for j=1:c 
                 L0(:,j)=[ww(i,1:mm);ww(i,mm+1:2*mm);ww(i,2*mm+1:3*mm);ww(i,3*mm+1:4*mm)]*xunlianyangben(:,j+i0-1)-[ww(i,getichangdu-k11:getichangdu-1)]'; % p(:,j+i0-1);                    %=zeros(3,1),; %这步是对隐层的输入
                   LL0(:,j)=(1+exp(-L0(:,j))).^(-1);                                %对隐层的输出
                   LLL0(:,j)=[ww(i,4*mm+1:4*mm+k11)]*LL0(:,j)-ww(i,getichangdu);       %这步是对输出层的输入 
                   LLLL0(:,j)=(1+exp(-LLL0(:,j))).^(-1);                                          %这步是对输出层的输出
                   y(:,j)=LLLL0(:,j);                                            %再加上输出层的阈值,得到最后的          
                   T(:,j)=guiyihua(j+i0-1+c,a0);
             end
             y;
             T;
             Er=y-T;                     
             Er;
             E=(sum(Er.^2));  
             E;
             f(:,i)=1/E;    %第i条染色体的适应度
         end
       %为得到最后结果,下面设置daishu表明是第几代,下面的mmm存放每代最大适应度个体在群体的位置,mmmm存放其最大适应度对应的个体
        f;   %存放一代的所有染色体的适应度,f是一行pp列
        zd1(:,L)=max(f);  %zd1存放每代适应度的最大值
       for i=1:pp
          if max(f)==f(:, i)
              mmm(:,L)=i;     %mmm存放最大适应度个体对应的序号
              mmmm(L,:)=ww(i,:);   %mmmm存放最大适应度对应的个体
          end
       end
       f1=sum(f);
       f1;
      for i=1:pp
          ff(i)=f(i)/f1;  %每个个体的相对适应度,即每个个体在复制中被选中的概率
      end
      ff;       %按顺序存放所有个体的相对适应度
      for i=1:pp
          k(i)=sum(ff(:,1:i));%通过ff的前i列求和计算累计概率
      end
      k;   %按顺序存放所有个体的累计概率
       %w存放复制后得到的个体
       w=zeros(round(pp*p1),getichangdu); 
      %依据pp*p1是几,就循环多少次
      for ii=1:round(pp*p1)
          r=rand(1,1);
         for i=1:pp
            if  k(i)>r  
            l=min(i);  %以一例说明这步的道理。k=(0.1 0.3 0.5 0.8 1),r=0.34,发现k(3)=0.5,k(4)=0.8,k(5)=1都大于r,但应该取第三个个体,所以应该取3,4,5的最小值
            l;
            w(ii,:)=ww(l,:);
              break;
            end
         end
      end
      w;
       %下面选出用于交叉的个体,个数是pppp个,所以需保证pppp是偶数   
       if   mod(round(pp*p2),2)~=0  %若pp*p2取整后是奇数
           pppp=round(pp*p2)-1;     %把奇数减1使成为偶数
       else                          %若pp*p2取整后是偶数,按个数round(pp*p2)给 pppp进行交叉
           pppp=round(pp*p2);            
       end
      %下面产生[1,pp]内pppp个随机数以便决定哪些个个体交叉 
           y1=1+(pp-1)*rand(1,1);%选1到pp内的随机数
           y1;
           y2(:,u)=round(y1);%对随机数y1取整,放到y2(:,u)
           bb(u,:)=ww(y2(:,u),:);   %对y1取整对应的整数是几,就是种群的第几个个体即第几行放入bb
           pp2(:,u)=f(:,y2(:,u));  %已取出的用于交叉但还未交叉的个体的适应度   
       end
       bb ;  %存放取出用于交叉但还未交叉的个体
       pp2;
       %下面对上面产生的bb中的pppp个个体实行交叉
       %,交叉方法是:bb中第u1行即第u1个个体与第(u1+pppp/2)个个体交叉,通过产生两次随机数得到交叉后的两个个体
               %下面依据pppp/2是几就循环多少次
              
%                b1=zeros(2,woo);
%                pj(:,L)=sum(f)/pp ;                    %一代群体适应度的平均值 
               for u1=1:pppp/2
                   b1(1,:)=bb(u1,:);%取出bb中第u1个个体                      
                    b1(2,:)=bb((u1+pppp/2),:);  %取出bb中第(u1+pppp/2)个个体          """""" 把它作为初始解",相当于x0"""""""
                              r1=rand(1,1);
                               if pp2(:,u1)>pp2(:,u1+pppp/2)            
                                          b20(1,:)=b1(1,:)+r1.*(b1(1,:)-b1(2,:));
                                          b20(2,:)=b1(1,:)-r1.*(b1(1,:)-b1(2,:));                
                                              while  1
                                                       b20(1,:);
                                                        s=[];
                                                      for i=1:getichangdu                      
                                                         if b20(1,i)>zuojie & b20(1,i)<youjie
                                                              s(:,i)=0;
                                                         else
                                                                  s(:,i)=1;
                                                           end
                                                      end
                                                        s;
                                                      if  sum(s)==0
                                                           b20(1,:);
                                                              b20(2,:);
                                                           break;
                                                      else
                                                          r2=rand;
                                                          b22(1,:)=b1(1,:)+r2.*(b1(1,:)-b1(2,:));
                                                           b22(2,:)=b1(1,:)-r2.*(b1(1,:)-b1(2,:));             
                                                      end
                                                  b20(1,:)=b22(1,:);
                                                  b20(2,:)=b22(2,:);
                                              end   
                                      b2(1,:)=b20(1,:);
                                     b2(2,:)=b20(2,:);        
                                      else
                                           r3=rand;
                                           b20(2,:)=b1(2,:)+r3.*(b1(2,:)-b1(1,:));
                                           b20(1,:)=b1(2,:)-r3.*(b1(2,:)-b1(1,:));                
                                           while  1
                                               b20(2,:);
                                                 s=[];
                                                for i=1:getichangdu                      
                                                    if b20(2,i)>zuojie & b20(2,i)<youjie
                                                        s(:,i)=0;
                                                    else
                                                         s(:,i)=1;
                                                    end
                                                end
                                                 s;
                                                  if  sum(s)==0
                                                        b20(1,:);
                                                          b20(2,:);
                                                         break;
                                                  else
                                                      r4=rand;
                                                      b22(2,:)=b1(2,:)+r4.*(b1(2,:)-b1(1,:));
                                                      b22(1,:)=b1(2,:)-r4.*(b1(2,:)-b1(1,:)); 
            
                                                  end
                                             b20(1,:)=b22(1,:);
                                              b20(2,:)=b22(2,:);
                                           end
                                      end 
                   b2(1,:)=b20(1,:);
                   b2(2,:)=b20(2,:);  
     
       bbb(u1,:)=b2(1,:);      
       bbb(u1+pppp/2,:)=b2(2,:);
  
  end     %到此,对所有交叉个体过程完毕                                       
  bbb;    
    %下面进行变异
     TL=[];
    baaaa=zeros(round(pp*p3),getichangdu);%存放变异后符合条件的个体
    for ii=1:round(pp*p3)   %用round(pp*p3)可保证当pp*p3是小数时,循环次数也是整数
           y11=1+(pp-1)*rand(1,1);%产生[1,pp]内的随机数
           y111=round(y11); %产生[1,pp]内的随机数后,取整
           aaaa1=ww(y111,:); %从初始ww中取出整数对应的行对应的个体,即变异前的个体                   
              xbest=aaaa1;                        %先假设变异前的最好
              fbest=f(:,y111);                        %先假设变异前的最好             
              pj(:,L)=sum(f)/pp ;   %渴望适应度水平取做要变异个体所在父代的群体适应度平均值
              kw=pj(:,L);%渴望适应度水平取做要变异个体所在父代的群体适应度平均值
               aaaa1;
               for tw0=1:NS  %NS是在一个邻域内的搜索次数
                    xbest;
                    aaaa=aaaa1+(zuojie-aaaa1)+(youjie-aaaa1-(zuojie-aaaa1)).*rand(1,getichangdu);;                 
                   %下面计算变异后的个体的适应度
                    for j=1:c  %c是训练样本个数,;
                      L1(:,j)=[aaaa(1,1:mm);aaaa(1,mm+1:2*mm);aaaa(1,2*mm+1:3*mm);aaaa(1,3*mm+1:4*mm)]*xunlianyangben(:,j+i0-1)-[aaaa(1,getichangdu-k11:getichangdu-1)]';       %LL=zeros(2,1),; %这步是对隐层的输入
                      LL1(:,j)=(1+exp(-L1(:,j))).^(-1);              %L1=zeros(2,1);                   %对隐层的输出
                      LLL1(:,j)=[aaaa(1,4*mm+1:4*mm+k11)]*LL1(:,j)-aaaa(1,getichangdu);       %这步是对输出层的输入 
                      LLLL1(:,j)=(1+exp(-LLL1(:,j))).^(-1);                            %L5=zeros(1,1)              %这步是对输出层的输出
                      y(:,j)=LLLL1(:,j);                               %y(j) =zeros(1,1)              %再加上输出层的阈值,得到最后的输出
                      T(:,j)=guiyihua(j+i0-1+c,a0);%目标输出          %T(j)=zeros(1,1)             %对每个样本的目标输出
                     end
                     y;
                     T;
                     Er=y-T;                     %Er=zeros(1,1);
                     Er;
                     E=(sum(Er.^2));%先求第一个样本的误差,再得所有样本的误差E。
                     E;
                     PP3=1/E;    %变异后染色体的适应度             
                        if PP3>kw %把变异后染色体的适应度与渴望水平比较
                           xbest=aaaa;
                           pp0=xbest;                 
                            fbest=PP3;
                            kw=PP3;
                              sz=size(TL,2);
                              if sz>du %整个迭代中,禁忌表的长度是固定的,所以若长度即列数超过,超过几就把前几列去掉,操作中就设为空阵
                               dd=sz-du;
                               TL(:,1:dd)=[];
                               end
                        %下面判断满足PP3>kw时,PP3是否在禁忌表范围内,若不在,存入禁忌表
                                s3=[];
                                for tz=1:size(TL,2)
                                   if PP3<=TL(1,tz)-10^(-4) | PP3>=TL(1,tz)+10^(-4)
                                     s3(tz)=0;
                                   else
                                     s3(tz)=1;
                                   end
                                end
                                s3;
                                 if sum(s3)==0   %说明aaaa(g1,:)不在禁忌表内
                                  TL=[TL PP3];
                                 end  %到此,判断完毕
                        end
                        if  PP3<=kw
                            s3=[];%s3只是用于存放相对于TL的每一个数的比较,所以当pp1的第一个数与TL的每一个数比较完,即一次循环完后,把它置空,开始下一循环
                            for tz=1:size(TL,2) 
                                 if PP3<=TL(1,tz)-10^(-4) | PP3>=TL(1,tz)+10^(-4)
                                    s3(tz)=0;
                                 else
                                    s3(tz)=1;
                                 end
                            end
                             s3;
                                
                               if sum(s3)==0
                                  xbest=aaaa;
                                    pp0=xbest;               
                                    fbest=PP3;

                                    TL=[TL PP3];                                
                               else
                                   pp0=xbest;
                                end              
                        end             %到此,一个变异个体是否传到下一代,在一个邻域内的一次迭代过程中判断完毕.
              xbest=pp0;          
          end  %到此,一个变异个体是否传到下一代,在一个邻域内的所有迭代过程完毕
          xbest; %代表一个邻域内的最好值
    baaaa(ii,:)=xbest;
   end     %到此,变异过程完毕,遗传的完整一代完毕
  baaaa; 
        K=zeros(pp,getichangdu);
        K=[w;bbb;baaaa]; %K中存放新种群
        u=size(K,1);
       if u<pp
           uu=pp-u;
           for rr=1:uu
             wh(rr,:)=zuojie+jiechang*rand(1,getichangdu);
           end
           ww=[K;wh];           
       elseif u>pp
             uu0=pp-u;
             K(1:uu0,:)=[];
             ww=K;
       else    
             ww=K;
       end
    ww;     
 ll=ll+1      %从此,进入遗传的下一代 
 daishu=[daishu L];
end
 zd1;%存放每代的最大适应度
 mmm; %存放每代的最大适应度对应的个体序号      mmm是(1,L)
 mmmm;  %存放每代的最大适应度对应的个体         mmmm是(L,28)
 uuu=[daishu;mmm;zd1] ;%uuu的第一行为遗传代数,第二行为每代的最大适应度对应的个体序号,第三行是每代的最大适应度对应的个体 
 zd2=max(zd1);
 for L=1:M
     if zd2==zd1(:,L)
          U=mmmm(L,:);%取出mmmm第L行,放入U
          UU=uuu(:,L);%UU存放所有代中的适应度的最大值对应的那一列       
     end
 end
 uuu;
UU;
U;   %  U是最后需要的最优个体,  到此,整个遗传禁忌搜索完毕。%         
     v1=[U(1,1:mm);U(1,mm+1:2*mm);U(1,2*mm+1:3*mm);U(1,3*mm+1:4*mm)] ; %取出 U的1-24个数是输入与隐层的权值                 
     vv1=[U(1,4*mm+1:4*mm+k11)]';              % 第25到28个数作为隐层到输出层的权值      
     t1=[U(1,getichangdu-k11:getichangdu-1)]';  % 第29到32个数作为隐层阈值
     tt1=U(1,getichangdu);                      %最后一个数是输出层阈值
      v1;
      vv1;
     ru1=v1*jianyanyangben(:,i0)-t1;                               
     chu1=(1+exp(-ru1)).^(-1);      
     ru2=vv1'*chu1-tt1;                          
     chu2=(1+exp(-ru2)).^(-1);
     Y=chu2;                        
     TT=guiyihua(i0+c-1+7,a0);
     Y1(:,i0)=(max(quanyangben)-min(quanyangben))*(Y-0.1)./(0.9-0.1)+(min(quanyangben));           %再把y换回x=1/2*(max-min)*y+1/2*(max+min)
     TT1(:,i0)=(max(quanyangben)-min(quanyangben))*(TT-0.1)./(0.9-0.1)+(min(quanyangben));
     t22(:,i0)=(Y1(:,i0)-TT1(:,i0))/Y1(:,i0)*100 ;  
 end 
 Y1
 TT1
 t22
t=toc;

⌨️ 快捷键说明

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