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

📄 genetictsp2.asv

📁 利用遗传算法求解TSP的源代码程序 可以精确求出50城市
💻 ASV
字号:
%SY0707348宗满意 遗传算法求解TSP问题(为选择操作从新设计后程序)
%D是距离矩阵,n为种群个数
%参数a是中国34个城市的坐标(初始给定)
%C为停止代数,遗传到第 C代时程序停止,C的具体取值视问题的规模和耗费的时间而定
%m为适值淘汰加速指数,最好取为1,2,3,4,不宜太大
%交叉概率Pc,变异概率Pm
%R为最短路径,Rlength为路径长度
      
function [R,Rlength]=geneticTSP2(D,a,n,C,m,Pc,Pm)
         [N,NN]=size(D);%(34*34)
         farm=zeros(n,N);%用于存储种群
         for i=1:n
             farm(i,:)=randperm(N);%随机生成初始种群
         end
         R=[farm(1,:) farm(1,1)];%一个随机解(个体)
%在二维图上画出所有点
         scatter(a(:,1),a(:,2),'x');
         hold on        
        pause(1)
%画出随机解得路径图      
       figure;
       plotaiwa(a,R);
       hold on         
       pause(1)
%输出随机的解得路径和总距离
       disp('初始种群中的一个随机值:')
       R
       Rlength=myLength(D,R)
       disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
%计算各个个体总距离和适配置      
                           %farm(1,:)=R;
        len=zeros(n,1);%存储路径长度
        fitness=zeros(n,1);%存储适配值
        counter=0;
        
       while counter<C
            for i=1:n
                len(i,1)=myLength(D,[farm(i,:) farm(i,1)]);%计算路径长度
            end
            %maxlen=max(len);
            minlen=min(len);
           
            %fitness=fit(len,m,maxlen,minlen);%计算适应度
            rr=find(len==minlen);%返回的是在len中路径最短的路径坐标(i,1)
            
            R=[farm(rr(1,1),:) farm(rr(1,1),:)];%更新最短路径
                                                   %disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
            FARM=farm;%优胜劣汰,nn记录了复制的个数
%选择,  
          K=30;
          [aa,bb]=size(FARM);
          FARM2=FARM;
          len2=len;
          [len]=sort(len);
          for i=1:aa
              tt= find(len2==len(i,1));
              FARM(i,:)=FARM2(tt(1,1),:);
          end   
          for i=1:K
              j=aa+1-i;
              FARM(j,:)=FARM(i,:);
              
          end
  
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
 %                交叉操作
              [aa,bb]=size(FARM);
               FARM2=FARM;
             
               for i=1:2:aa
                    
                       if Pc>rand&&i<aa %交叉概率Pc
                            A=FARM(i,:);
                            B=FARM(i+1,:);
                            [A,B]=intercross(A,B);
                            FARM(i,:)=A;
                            FARM(i+1,:)=B;
                       end  
                      
               end
              %交叉检验  (可省去)             
               for i=1:aa
                   if myLength(D,[FARM(i,:) FARM(i,1)])>myLength(D,[FARM2(i,:) FARM2(i,:)])
                       FARM(i,:)=FARM2(i,:);
                   end
               end
               clear FARM2
               
               
               
               
               
               
      
          
             [aa,bb]=size(FARM); %aa=nn2
   
%       变异   
            FARM2=FARM;
            for i=1:aa
                if Pm>=rand                    
                  FARM(i,:)=mutate(FARM(i,:));
                end
            end
             %变异检验(可省略)  
               for i=1:aa
                   if myLength(D,[FARM(i,:) FARM(i,1)])>myLength(D,[FARM2(i,:) FARM2(i,:)])
                       FARM(i,:)=FARM2(i,:);
                   end
               end
               clear FARM2
%群体的更新
           %FARM2=zeros(n-aa+1,N);
           %if n-aa>=1             
           %    for i=1:n-aa
           %       FARM2(i,:)=randperm(N);%随机生成n-aa种群
           %     end
           % end
           [FARM FARM(1,:)]=[R;[FARM FARM(1,:)]];%将随机产生的n-aa个体加入从后面种群,将上次迭代的最优解从前面加入种群
           [aa,bb]=size(FARM);
                                                   %disp('~~~~~~~~~~~~~~~~4~~~~~~~验证zong~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
             %保持种群规模为n                                         
            if aa>n
                FARM=FARM(1:n,:);
            end   
     
    
                                                    %disp('~~~~~~~~~~~~~~~~~~~5~~~~验证zong~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
            %更新farm
            farm=FARM;
            clear FARM
            %更新迭代次数
            counter=counter+1 ; 
            
       end
 %结果输出
        
        Rlength=myLength(D,R)    
        figure
        plotaiwa(a,R)%画图
        disp('迭代次数c');        
        disp(C);
        disp('迭代后结果'); 
        R
        Rlength=myLength(D,R)%结果输出

⌨️ 快捷键说明

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