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

📄 mutation.m

📁 我自己的遗传算法工具箱
💻 M
字号:
function ret=Mutation(pmutation,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;
                while pick==0
                    pick=rand;
                end
                index=ceil(pick*sizepop); %随机选择一个染色体进行变异
              % 变异概率决定该轮循环是否进行变异
                pick=rand;
                if pick>pmutation
                   continue;  %如果pick大于变异概率,则跳出该轮for循环,不进行以下的变异操作
                end
                flag=0;
                while flag==0
                    % 变异位置
                    pick=rand; %随机选择一个要变异的位置,变异开始
                    while pick==0
                          pick=rand;
                    end
                    pos=ceil(pick*sum(lenchrom));
                    v=bitget(chrom(index,:),pos);
                    v=~v;
                    chrom(index,:)=bitset(chrom(index,:),pos,v); %变异结束
                    flag=test(lenchrom,bound,chrom(index,:),fcode);     %检验染色体的可行性
                end
            end            
        ret=chrom;
        
    case 'float'  % 浮点法变异
        for i=1:sizepop   %每一轮for循环中,可能会进行一次变异操作,染色体是随机选择的,变异位置也是随机选择的,
                          %但该轮for循环中是否进行变异操作则由变异概率决定(continue控制)
               % 随机选择一个染色体进行变异
                pick=rand;
                while pick==0
                    pick=rand;
                end
                index=ceil(pick*sizepop);
              % 变异概率决定该轮循环是否进行变异
                pick=rand;
                if pick>pmutation
                   continue;
                end
                flag=0;
                while flag==0
                    % 变异位置
                    pick=rand;
                    while pick==0
                         pick=rand;
                    end
                    pos=ceil(pick*sum(lenchrom));  %随机选择了染色体变异的位置,即选择了第pos个变量进行变异
                    v=chrom(i,pos); 
                    v1=v-bound(pos,1);
                    v2=bound(pos,2)-v;
                    pick=rand; %变异开始
                    if pick>0.5
                       delta=v2*(1-pick^((1-pop(1)/pop(2))^2));
                       chrom(i,pos)=v+delta;
                    else
                       delta=v1*(1-pick^((1-pop(1)/pop(2))^2));
                       chrom(i,pos)=v-delta;
                    end   %变异结束
                    flag=test(lenchrom,bound,chrom(i,:),fcode);     %检验染色体的可行性
                end
        end
        ret=chrom;
end

⌨️ 快捷键说明

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