遗传算法

前言:

      放假前偷偷跑到杭州玩了几天,虽然没有预料中那么美丽,不过还是很开心,感谢老严的热情款待。回到南京后,距离完成任务就剩3天时间,而且师兄逼的很紧,于是夜以继日,实现了对比算法《Multimodal Sparse Representation-Based Classification for Lung Needle Biopsy Images》(Google学术搜索)。

      遗传算法虽然如雷贯耳,但是一直未有接触,此次从零开始,看算法、看论文,对了,还要招待从云南回来的基友。时间虽然很紧,但是最后还是圆满完成任务,得以回家过年,感觉很充实。

      网上有很多GA的参考文章,我就不画蛇添足了,但大多数文章只是给出的很简单函数的例子,浅尝辄止,目标函数太过简单,感觉很不过瘾。于是乎我将我实现的本篇文章的matlab代码记录于此,写的很乱,轻喷。

 

      文章的大意是通过肺细胞的形状、颜色和纹理,利用SRC学习构造3个子字典(代码中是4个模态),然后分别对测试样本做预测,最后通过mSRC进行分类。

主函数:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Copyright (c) 2014 七年之后. All rights reserved.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



%Name: main.m

%省略数据集预处理



for loop = 1:20 %循环20次,得到20个结果取平均值

    

    n=train_num*class_num; %beta字符串长度,即训练样本个数

    

    beta1=round(rand(K,n)); %随机01字符串,K为种群大小

    beta2=round(rand(K,n)); 

    beta3=round(rand(K,n)); 

    beta4=round(rand(K,n)); 

    

    %产生初始群体

    Dict=tr_dat(:,:,:);

    for g=1:G %G为迭代次数

        g

        kappa=[0.001];

        lambda=0.1;

        

        %更新beta

        newbeta1=beta1;

        newbeta2=beta2;

        newbeta3=beta3;

        newbeta4=beta4;

        

        newtrls1=[];

        newtrls2=[];

        newtrls3=[];

        newtrls4=[];

        

        %%%%%   更新子字典   %%%%%%

        Dict1=[];

        Dict2=[];

        Dict3=[];

        Dict4=[];

        

        fit=[]; %适应值

        

        for i=1:K %K个种群

            %Dict为样本集,分别构造4个模态下的子字典

            for j=1:n %n个样本

                if(newbeta1(i,j)==1)

                    Dict1=[Dict1,Dict(:,j,1)];

                    newtrls1=[newtrls1,trls(j)]; %训练样本标记

                end

                if(newbeta2(i,j)==1)

                    Dict2=[Dict2,Dict(:,j,2)];

                    newtrls2=[newtrls2,trls(j)];

                end

                if(newbeta3(i,j)==1)

                    Dict3=[Dict3,Dict(:,j,3)];

                    newtrls3=[newtrls3,trls(j)];

                end

                if(newbeta4(i,j)==1)

                    Dict4=[Dict4,Dict(:,j,4)];

                    newtrls4=[newtrls4,trls(j)];

                end

            end

            

            %%%%%% 稀疏编码,计算fitness %%%%%

            count1=0;

            count2=0;     

            

            for j=1:n %n训练样本个数

                %稀疏编码分类,此处省略,id分别为预测值

                if(id1==trls(j)||id2==trls(j)||id3==trls(j)||id4==trls(j))

                    count1=count1+1;

                end

                if(id1==id2||id1==id3||id1==id4||id2==id3||id2==id4||id3==id4)

                    count2=count2+1;

                end

            end

            fitvalue=1/n*count1+1/n*lambda*(4-count2);

            fit=[fit,fitvalue];

        end

        

        if(g~=G) %最后一次跳出循环

            newbeta1=[];

            newbeta2=[];

            newbeta3=[];

            newbeta4=[];

            

            %newbeta增加一列,然后按照fitness排序

            newbeta1=[beta1(:,:),fit'];

            newbeta2=[beta2(:,:),fit'];

            newbeta3=[beta3(:,:),fit'];

            newbeta4=[beta4(:,:),fit'];

            

            newbeta1=sortrows(newbeta1,n+1);

            newbeta2=sortrows(newbeta2,n+1);

            newbeta3=sortrows(newbeta3,n+1);

            newbeta4=sortrows(newbeta4,n+1);

            

            %去掉fitness

            newbeta1(:,n+1)=[];

            newbeta2(:,n+1)=[];

            newbeta3(:,n+1)=[];

            newbeta4(:,n+1)=[];

            

            %去掉fitness小的种群

            newbeta1(K/2+1:K,:)=[];

            newbeta2(K/2+1:K,:)=[];

            newbeta3(K/2+1:K,:)=[];

            newbeta4(K/2+1:K,:)=[];

            

            %交叉变异

            [newbeta1]=crossover(newbeta1,pc);%交叉

            [newbeta1]=mutation(newbeta1,pm);%变异

            [newbeta2]=crossover(newbeta2,pc);%交叉

            [newbeta2]=mutation(newbeta2,pm);%变异

            [newbeta3]=crossover(newbeta3,pc);%交叉

            [newbeta3]=mutation(newbeta3,pm);%变异

            [newbeta4]=crossover(newbeta4,pc);%交叉

            [newbeta4]=mutation(newbeta4,pm);%变异

            

            %随机增加K/2个染色体

            add_beta1=round(rand(K/2,n));

            add_beta2=round(rand(K/2,n));

            add_beta3=round(rand(K/2,n));

            add_beta4=round(rand(K/2,n));

            

            newbeta1=[newbeta1;add_beta1];

            newbeta2=[newbeta2;add_beta2];

            newbeta3=[newbeta3;add_beta3];

            newbeta4=[newbeta4;add_beta4];

        end

    end

    

    

    %选一个最大的beta构造最终子字典

    maxindex=find(fit==max(fit)); %最大fitness下标

    lastbeta1=newbeta1(maxindex,:);

    lastbeta2=newbeta2(maxindex,:);

    lastbeta3=newbeta3(maxindex,:);

    lastbeta4=newbeta4(maxindex,:);

    

    %%%%%% 最终子字典 %%%%%%

    Dict1=[];

    Dict2=[];

    Dict3=[];

    Dict4=[];

    

    %样本标记

    Drls1=[];

    Drls2=[];

    Drls3=[];

    Drls4=[];

    for j=1:n %样本       

        if(lastbeta1(j)==1)

            Dict1=[Dict1,Dict(:,j,1)];

            Drls1=[Drls1,floor(j/train_num)+1];

        end

        if(lastbeta2(j)==1)

            Dict2=[Dict2,Dict(:,j,2)];

            Drls2=[Drls2,floor(j/train_num)+1];

        end

        if(lastbeta3(j)==1)

            Dict3=[Dict3,Dict(:,j,3)];

            Drls3=[Drls3,floor(j/train_num)+1];

        end

        if(lastbeta4(j)==1)

            Dict4=[Dict4,Dict(:,j,4)];

            Drls4=[Drls4,floor(j/train_num)+1];

        end

    end

        

    count=0; %统计分类正确个数

    % mSRC分类,此处省略

    right_num=[right_num,count/length(ttls)]

end

交叉函数:

%Name: crossover.m  %交叉

function [newpop]=crossover(pop,pc) %pc是交叉概率

[rows,cols]=size(pop);

newpop=pop(:,:);

for i=1:2:rows-1

    if(rand<pc)

        cpoint=round(rand*cols);

        newpop(i,:)=[pop(i,1:cpoint),pop(i+1,cpoint+1:cols)];

        newpop(i+1,:)=[pop(i+1,1:cpoint),pop(i,cpoint+1:cols)];    

    end

end

变异函数:

%Name: mutation.m  %变异

function [newpop]=mutation(pop,pm) %pm是变异概率

[rows,cols]=size(pop);

newpop=pop(:,:);

for i=1:rows  

    if(rand<pm)

        mpoint=round(rand*cols);

        if mpoint<=0

            mpoint=1;

        end

        newpop(i)=pop(i);

        if any(newpop(i,mpoint))==0

            newpop(i,mpoint)=1;

        else

            newpop(i,mpoint)=0;

        end

    end

end

 

  

 

  

 

  

 

你可能感兴趣的:(算法)