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

📄 cross.m

📁 我自己的遗传算法工具箱
💻 M
字号:
function ret=Cross(pcross,lenchrom,chrom,sizepop,opts,pop,fcode,bound)
%本函数完成交叉操作
% pcorss                input  : 交叉概率
% lenchrom              input  : 染色体的长度
% chrom     input  : 染色体群
% sizepop               input  : 种群规模
% opts                  input  : 交叉方法的选择
% pop                   input  : 当前种群的进化代数和最大的进化代数信息
% ret                   output : 交叉后的染色体
switch opts
    case 'simple'  % 单点交叉
        for i=1:sizepop %每一轮for循环中,可能会进行一次交叉操作,染色体是随机选择的,交叉位置也是随机选择的,
                        %但该轮for循环中是否进行交叉操作则由交叉概率决定(continue控制)
            % 随机选择两个染色体进行交叉
            pick=rand(1,2);
            index=ceil(pick.*sizepop);
            while prod(pick)==0 | index(1)==index(2)
                 pick=rand(1,2);
                 index=ceil(pick.*sizepop);
            end
            % 交叉概率决定该轮循环是否进行交叉
            pick=rand;
            if pick>pcross
               continue;
            end
            flag=0;
            while flag==0
                %随机选择交叉位置
                pick=rand; %随机选择单点交叉位置,交叉开始
                while pick==0
                      pick=rand;
                end
                pos=ceil(pick.*sum(lenchrom));
                tail1=bitand(chrom(index(1),:),2.^pos-1);  %将低pos位转换成十进制数存在tail1里面
                tail2=bitand(chrom(index(2),:),2.^pos-1);  %将低pos位转换成十进制数存在tail2里面
                chrom(index(1),:)=chrom(index(1),:)-tail1+tail2;
                chrom(index(2),:)=chrom(index(2),:)-tail2+tail1;  %将两个染色体的低pos位信息进行互换,交叉结束
                flag1=test(lenchrom,bound,chrom(index(1),:),fcode);  %检验染色体1的可行性
                flag2=test(lenchrom,bound,chrom(index(2),:),fcode);  %检验染色体2的可行性
                if   flag1*flag2==0
                     flag=0;
                else flag=1;
                end  %如果两个染色体不是都可行,则重新交叉
            end
                
        end
        ret=chrom;
       
   case 'uniform' % 均匀交叉
        for i=1:sizepop
            % 随机选择两个染色体进行交叉
            pick=rand(1,2);
            while prod(pick)==0
                 pick=rand(1,2);
            end
            index=ceil(pick.*sizepop);
            % 交叉概率决定是否进行交叉
            pick=rand;
            while pick==0
                 pick=rand;
            end
            if pick>pcross
               continue;
            end
            flag=0;
            while flag==0
                % 随机选择交叉位置
                pick=rand; %随机选择一个交叉位置,交叉开始
                while pick==0
                      pick=rand;
                end
                mask=2^ceil(pick*sum(lenchrom));
                chrom1=chrom(index(1),:);
                chrom2=chrom(index(2),:);
                for j=1:sum(lenchrom)
                    v=bitget(mask,j);  % 从低位到高位找
                    if v==1
                        chrom1=bitset(chrom1,j,bitget(chrom(index(2),:),j));
                        chrom2=bitset(chrom2,j,bitget(chrom(index(1),:),j));  %看来是单点互换
                    end
                end
                chrom(index(1),:)=chrom1;
                chrom(index(2),:)=chrom2;  %交叉结束
                flag1=test(lenchrom,bound,chrom(index(1),:),fcode);  %检验染色体1的可行性
                flag2=test(lenchrom,bound,chrom(index(2),:),fcode);  %检验染色体2的可行性
                if   flag1*flag2==0
                     flag=0;
                else flag=1;
                end    %如果两个染色体不是都可行,则重新交叉
            end          
            
        end
        ret=chrom;
        
   case 'float'
        for i=1:sizepop  %每一轮for循环中,可能会进行一次交叉操作,染色体是随机选择的,交叉位置也是随机选择的,
                        %但该轮for循环中是否进行交叉操作则由交叉概率决定(continue控制)
            % 随机选择两个染色体进行交叉
            pick=rand(1,2);
            while prod(pick)==0
                 pick=rand(1,2);
            end
            index=ceil(pick.*sizepop);
            % 交叉概率决定是否进行交叉
            pick=rand;
            while pick==0
                 pick=rand;
            end
            if pick>pcross
               continue;
            end
            flag=0;
            while flag==0
                % 随机选择交叉位置
                pick=rand;
                while pick==0
                     pick=rand;
                end
                pos=ceil(pick.*sum(lenchrom)); %随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同
                pick=rand; %交叉开始
                v1=chrom(index(1),pos);
                v2=chrom(index(2),pos);
                chrom(index(1),pos)=pick*v2+(1-pick)*v1;
                chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉结束
                flag1=test(lenchrom,bound,chrom(index(1),:),fcode);  %检验染色体1的可行性
                flag2=test(lenchrom,bound,chrom(index(2),:),fcode);  %检验染色体2的可行性
                if   flag1*flag2==0
                     flag=0;
                else flag=1;
                end    %如果两个染色体不是都可行,则重新交叉
            end    
        end
        ret=chrom;
 end

⌨️ 快捷键说明

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