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

📄 yichuansuanfa1.m

📁 自己编的遗传算法程序
💻 M
字号:
a=zeros(20,9);          %存染色体20个
aby=zeros(20,9);        %起缓冲作用
x=0.25:0.25:5;          %存x
xb=floor(511/5*x);      %存变换后的x

%产生第一代染色体
for i=1:20
    for j=9:-1:1
        a(i,j)=mod(xb(i),2);
        xb(i)=floor(xb(i)/2);
    end
end

%产生后代
for k=1:1000
    fsum =0;             %适值之和
    for i=1:20
        xb(i)=2^8*a(i,1)+2^7*a(i,2)+2^6*a(i,3)+2^5*a(i,4)+2^4*a(i,5)+2^3*a(i,6)+2^2*a(i,7)+2*a(i,8)+a(i,9);
        x(i)=5/511*xb(i);
        f(i)=x(i)^3;  %适值
        fsum=fsum+f(i);
    end
    count=0;
    nsum=0;
    for i=1:20
        n(i)=round(f(i)/fsum*20) ;  %根据适值计算第i个染色体的后代数
        if n(i)<0.7
            n(i)=0;
        end
        nsum=nsum+n(i);
    end
    if nsum==20
         for i=1:20    
              if n(i)>0
                  for m=(count+1):(count+n(i))
                      for j=1:9
                         aby(m,j)=a(i,j);
                      end
                  end
               end
               count=count+n(i);
          end
    elseif nsum<20
         while nsum<20
             z=ceil(rand()*20);
             while n(z)==0
                 z=ceil(rand()*20);
             end
             n(z)=n(z)+1;
             nsum=nsum+1;
          end
          for i=1:20    
              if n(i)>0
                  for m=(count+1):(count+n(i))
                      for j=1:9
                         aby(m,j)=a(i,j);
                      end
                  end
               end
               count=count+n(i);
           end
    elseif nsum>20
         while nsum>20
             z=ceil(rand()*20);
                  while n(z)<1
                      z=ceil(rand()*20);
                  end
             n(z)=n(z)-1;
             nsum=nsum-1;
          end
          for i=1:20    
              if n(i)>0
                  for m=(count+1):(count+n(i))
                      for j=1:9
                         aby(m,j)=a(i,j);
                      end
                  end
               end
               count=count+n(i);
          end
    end
    a=aby;
    
    %产生交换,有两组交换
    %产生要交换的4组染色体
    ihh=ceil(rand(4,1)*20);
    while ihh(2)==ihh(1)
        ihh(2)=ceil(rand()*20);
    end
    while ihh(3)==ihh(1)||ihh(3)==ihh(2)
        ihh(3)=ceil(rand()*20);
    end
    while ihh(4)==ihh(1)||ihh(4)==ihh(2)||ihh(4)==ihh(3)
        ihh(4)=ceil(rand()*20);
    end
    %产生从第几个数交换
    ihl=ceil(rand(2,1)*9);
    %进行交换
    jh=0;
    for j=ihl(1):9
        jh=a(ihh(1),j);
        a(ihh(1),j)=a(ihh(2),j);
        a(ihh(2),j)=jh;
    end
    for j=ihl(2):9
        jh=a(ihh(3),j);
        a(ihh(3),j)=a(ihh(4),j);
        a(ihh(4),j)=jh;
    end
    %进行变异
    l=ceil(rand()*100);
    if l==1              % 1%的概率变异
        byh=ceil(rand()*20);
        byl=ceil(rand()*9);
        if a(byh,byl)==1
            a(byh,byl)=0;
        else
            a(byh,byl)=1;
        end
    end
end
for i=1:20
    xb(i)=2^8*a(i,1)+2^7*a(i,2)+2^6*a(i,3)+2^5*a(i,4)+2^4*a(i,5)+2^3*a(i,6)+2^2*a(i,7)+2*a(i,8)+a(i,9);
    x(i)=5/511*xb(i);
    f(i)=x(i)^3;
end
fmax=f(1);
xmax=x(1);
for i=2:20
    if f(i)>fmax
        fmax=f(i);
        xmax=x(i);
    end
end
fmax=round(fmax*10)/10;   %保留小数点后一位
xmax=round(xmax*10)/10;   %保留小数点后一位

⌨️ 快捷键说明

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