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

📄 aga.m

📁 自己写的,加速遗传算法程序,可能很多有待改进的地方,有待改为fortran
💻 M
字号:

n=300;
p=3;
e=10;
bb=[3 3 5];
aa=[-3 -3 -3];

cishu=0;
for z=1:100
    cishu=cishu+1

%函数
for i=1:30
    x(i)=i;
    y(i)=1+2*x(i)+3*x(i)^2;
end

%生成随机变量
    u=rand(n,p);
 
%求出各变量的取值区间:
    for i=1:p
        d(i)=(bb(i)-aa(i))/(2^e-1);
    end
    
%求出各随机数所对应的函数值
    for i=1:n

        for j=1:p
            r(i,j)=fix(u(i,j)*2^e);
            c(i,j)=aa(j)+r(i,j)*d(j);
        end
       
   end


   for i=1:n
        f(i)=0;
        for k=1:30
            f(i)=f(i)+abs(c(i,1)+c(i,2)*x(k)+c(i,3)*x(k)^2-y(k));
        end
   end
 
   
   
 ww=0;  
for w=1:2
    ww=ww+1;
   
    
 %排序
 
 for i=1:n-1
     for j=i+1:n
         if f(i)>f(j)
             t=f(j);
             f(j)=f(i);
             f(i)=t;
             for k=1:3
                 t=r(j,k);
                 r(j,k)=r(i,k);
                 r(i,k)=t;
             end
             
         end
     end
 end
 

 %适应问题
 fff=0;
 for i=1:n
     ff(i)=1/(f(i)^2+0.001);
     fff=fff+ff(i);
 end
 
  %pp(i)--每个样本的选择概率;p1(i)--累加的概率 
 
  for i=1:n
     pp(i)=ff(i)/fff;
 end
    p1(1)=pp(1);
 for i=2:n
     p1(i)=p1(i-1)+pp(i);
 end

 %以概率pp(i)选择第个个体,组成含有n个个体的组
 for i=1:n
     xx=rand;
     if xx>0&xx<=p1(1)
         for j=1:p
             xuan1(i,j)=r(1,j);
         end
     elseif xx>p1(1)
         for k=2:n
             if xx>p1(k-1)&xx<=p1(k)
                 for l=1:p
                     xuan1(i,l)=r(k,l);
                 end
             end
         end
     end
 end
 
 %生成另一个组
  for i=1:n
     xx=rand;
     if xx>0&xx<=p1(1)
         for j=1:p
             xuan2(i,j)=r(1,j);
         end
     elseif xx>p1(1)
         for k=2:n
             if xx>p1(k-1)&xx<=p1(k)
                 for l=1:p
                     xuan2(i,l)=r(k,l);
                 end
             end
         end
     end
 end
 


%杂交

pm=1;

for i=1:n
    for j=1:p
        a=dec2bin(xuan1(i,j));
        b=dec2bin(xuan2(i,j));
        
   %若a,b的长度小于e,则在其前面加上0     
        if length(a)<e
            e1=e-length(a);
            for k=1:e1
                a=strcat('0',a);
            end
        end
        if length(b)<e
            e1=e-length(b);
            for k=1:e1
                b=strcat('0',b);
            end
        end
                
        
        u1=rand;
        u2=rand;
        iu1=fix(u1*e);
        iu2=fix(u2*e);
        
    %对iu1,iu2进行排序    
        if iu1>iu2
            t=iu2;
            iu2=iu1;
            iu1=t;
        end
        
    %iu1,iu2不能为零,为零时取1    
        if iu2==0
            iu1=1;
            iu2=1;
        end
        if iu1==0
            iu1=1;
        end
        
        
        for k=iu1:iu2
            t=a(k);
            a(k)=b(k);
            b(k)=t;
     
        end
        
%变异        
        iuu1=rand;
        iuu4=rand;
              
        if iuu1<=0.5&iuu4<=pm
            cc=a;
            
           iuu2=fix(rand*e);
           iuu3=fix(rand*e); 
            if iuu2==0
               iuu2=1;
            end
            if  iuu3==0
                iuu3=1;
            end
                        
         elseif iuu1>0.5&iuu4<=pm
            cc=b;
           iuu2=fix(rand*e);
           iuu3=fix(rand*e); 
            if iuu2==0
               iuu2=1;
            end
            
            if  iuu3==0
                iuu3=1;
            end
            
      end
        
      
        if cc(iuu2)=='0'
             cc(iuu2)='1';
         else 
             cc(iuu2)='0';
        end
        
        
        if cc(iuu3)=='0'
             cc(iuu3)='1';
         else 
             cc(iuu3)='0';
        end
             
      r(i,j)=0;
      for l=1:e
          r(i,j)=r(i,j)+2^(e-l)*str2num(cc(l));
       end
     end
 end

         
            
     for i=1:n
         for j=1:p
            c(i,j)=aa(j)+r(i,j)*d(j);
        end
    end
    for i=1:n
        f(i)=0;
        for k=1:30
            f(i)=f(i)+abs(c(i,1)+c(i,2)*x(k)+c(i,3)*x(k)^2-y(k));
        end
    end          
 
 %排序
   for i=1:n-1
     for j=i+1:n
         if f(i)>f(j)
             t=f(j);
             f(j)=f(i);
             f(i)=t;
             for k=1:3
                 t=c(j,k);
                 c(j,k)=c(i,k);
                 c(i,k)=t;
             end
             
         end
     end
 end    
  if ww==1
     for j=1:3
          aaa(j)=c(1,j);
          bbb(j)=c(1,j);
          for i=2:10
              if aaa(j)>c(i,j)
                 aaa(j)=c(i,j);
              end
              if bbb(j)<c(i,j)
                 bbb(j)=c(i,j);
              end
          end
      
      end
 end  
 if ww==2        
    for j=1:3
        for i=1:10
            if aaa(j)>c(i,j)
               aaa(j)=c(i,j);
            end
            if bbb(j)<c(i,j)
               bbb(j)=c(i,j);
            end
       end
   end
end
      

end     

      
 for j=1:3
     aa(j)=aaa(j);
     bb(j)=bbb(j);
 end 


     if f(1)<=0.1
         break;
     end
     
     
 end
                
  f(1)          
c(1,1)
c(1,2)
c(1,3)

⌨️ 快捷键说明

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