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

📄 binarycross.m

📁 遗传算法的小程序
💻 M
字号:
% binarycross.m
            Atemp=A;
            Btemp=B;
            t_1=zeros(1,n);                                        %t_1,t_2用来计算基因段A,B中各工件编号的数目
            t_2=zeros(1,n);
            for s_1=1:(x2-x1+1)
                for i=1:n
                    if A(s_1)==i
                        t_1(i)=t_1(i)+1;
                    end
                    if B(s_1)==i
                        t_2(i)=t_2(i)+1;
                    end
                end
            end
            if (t_1==t_2)                                         %若A,B中各工件编号数目相等,则直接进行交叉
                A=Btemp;
                B=Atemp;
                                               
            else                                          %若A,B中各工件编号数目不等,则需要在交叉之前对A,B进行调整      
                f_1=find(t_1>t_2);
                f_2=find(t_1<t_2);
                f_3=find(t_1==t_2);
                f_4=find(t_1>t_2&t_2==0);                         %在调整中A基因段中工件编号f_4(i)将全部被替换
                f_5=find(t_2>t_1&t_1==0);                         %在调整中B基因段中工件编号f_5(i)将全部被替换
                f_6=find(t_1>t_2&t_2>0);                          %在调整中A基因段中工件编号f_6(i)将有部份被替换
                f_7=find(t_2>t_1&t_1>0);                          %在调整中B基因段中工件编号f_7(i)将有部份被替换
                deta_1=zeros(1,length(f_1));
                deta_2=zeros(1,length(f_2));
                for i=1:length(f_1)
                   deta_1(i)=t_1(f_1(i))-t_2(f_1(i));
                end
                for i=1:length(f_2)
                   deta_2(i)=t_2(f_2(i))-t_1(f_2(i));
                end
                deta_1sum=sum(deta_1);
                deta_1sumcum=cumsum(deta_1);
                deta_2sum=sum(deta_2);
                deta_2sumcum=cumsum(deta_2);
                
                Adetaset=zeros(1,deta_2sum);                      % Adetaset为所有需要增补的工件号所组成的数组
                if length(f_2)==1
                   for t=1:deta_2(1)
                      Adetaset(t)=f_2(1);
                   end
                else
                   for t=1:deta_2(1)
                      Adetaset(t)=f_2(1);
                   end 
                   for s_1=2:length(f_2)
                       for t=1:deta_2(s_1)
                          Adetaset(t+deta_2sumcum(s_1-1))=f_2(s_1);
                       end
                   end
                end
                Bdetaset=zeros(1,deta_1sum);                      % Bdetaset为所有需要增补的工件号所组成的数组
                if length(f_1)==1
                   for t=1:deta_1(1)
                      Bdetaset(t)=f_1(1);
                   end
                else 
                   for t=1:deta_1(1)
                      Bdetaset(t)=f_1(1);
                   end
                   for s_1=2:length(f_1)
                       for t=1:deta_1(s_1)
                          Bdetaset(t+deta_1sumcum(s_1-1))=f_1(s_1);
                       end
                   end
                end
                %以下为对Atemp进行调整
                if length(f_4)~=0&length(f_6)~=0
                   deta_6=zeros(1,length(f_6));
                   for i=1:length(f_6)
                   deta_6(i)=t_1(f_6(i))-t_2(f_6(i));
                   end
                   changeA1;                                      % 调用脚本文件changeA1--对基因段Atemp进行调整
               elseif length(f_4)==0&length(f_6)~=0
                   deta_6=zeros(1,length(f_6));
                   for i=1:length(f_6)
                   deta_6(i)=t_1(f_6(i))-t_2(f_6(i));
                   end
                   changeA2;                                      % 调用脚本文件changeA2--对基因段Atemp进行调整
               else
                   changeA3;                                       % 调用脚本文件changeA3--对基因段Atemp进行调整                         
                end
                %以下为对Btemp进行调整
                if length(f_5)~=0&length(f_7)~=0
                   deta_7=zeros(1,length(f_7));
                   for i=1:length(f_7)
                   deta_7(i)=t_2(f_7(i))-t_1(f_7(i));
                   end
                   changeB1;                                      %调用脚本文件changeB1--对基因段Btemp进行调整
                elseif length(f_5)==0&length(f_7)~=0
                   deta_7=zeros(1,length(f_7));
                   for i=1:length(f_7)
                   deta_7(i)=t_2(f_7(i))-t_1(f_7(i));
                   end
                   changeB2;                                     %调用脚本文件changeB2--对基因段Btemp进行调整
                else
                  changeB3;                                      %调用脚本文件changeB3--对基因段Btemp进行调整
                end
               
                A=Btemp;                                         %调整完之后进行交叉
                B=Atemp;
            end

⌨️ 快捷键说明

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