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

📄 crossover.m

📁 一个遗传算法实现TSP问题的基本演示程序
💻 M
字号:
function popnew=crossover(pop,pcro,popsize,ncity)
%交叉函数
%pcro为交叉概率
n=1;
i=0;
while (n<=popsize)
    rk=rand();
     if rk<pcro
       b(i+1)=n;
       i=i+1;
    end
    n=n+1;
    if i==2
       pos1=fix(rand()*ncity)+1; %随机产生交叉点
       pos2=fix(rand()*ncity)+1;
       if pos1>pos2
           temp=pos1;
           pos1=pos2;
           pos2=temp;
       end    
       if pos1~=pos2
          s(1,:)=pop(b(1),:);
          s(2,:)=pop(b(2),:);
          j=1;
         for k=pos1+1:pos2-1     %保存交叉位置
             w(1,j)=pop(b(2),k);
             w(2,j)=pop(b(1),k);
             j=j+1;
         end        
       for k=1:2                 %将原序列逆序
          for i=1:ncity-pos2+1
               c=s(k,ncity);
               for j=ncity:-1:2
                   s(k,j)=s(k,j-1);
               end
               s(k,1)=c;
          end
       end  
       for k=1:2                   %在逆序中去掉交叉中的点
           for j=1:pos2-pos1-1
               for i=1:ncity
                   if s(k,i)==w(k,j)
                     for l=i:ncity-1
                        s(k,l)=s(k,l+1);
                     end   
                   end 
               end 
           end
       end
      for k=1:2               %产生交叉结果
          for i=1:pos1
              newpop(k,i)=s(k,ncity-pos2+1+i);
          end
          l=1;
          for i=pos1+1:pos2-1
              newpop(k,i)=w(k,l);
              l=l+1;
          end
          m=1;
          for i=pos2:ncity
              newpop(k,i)=s(k,m);
              m=m+1;
          end
      end
       pop(b(1),:)=newpop(1,:);  %保存交叉结果
       pop(b(2),:)=newpop(2,:);
       end
     i=0;
    end
end
popnew=pop;
clear i;
clear j;
clear c;
clear temp;
clear l;
clear m;
clear l;
clear pos1;
clear pos2;

⌨️ 快捷键说明

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