www.gusucode.com > MATLAB仿真技术与应用__的配套例题和习题的matlab源代码 > 第八章/GeneticAlgorithm.m

    %  Genetic algorithm for solving simple optimization problem
% f(x)=x1^2+x2^2, -5≤x1≤5, -5≤x2≤5
%The stategy of optimal maintaince is applied in the algorithm

clear all;
clc;
format long;
Population_Size=100;
String_Length=30;
chromosome=round(rand(Population_Size,String_Length));
chromosome_change=zeros(Population_Size,String_Length);
flag=1;
fitness_function=zeros(1,Population_Size);
selected=zeros(1,Population_Size);
generation=1;
maxsat=100;

while(flag>0)&(generation<50)
    sum_fit=0;
    for i=1:Population_Size
        a1=chromosome(i,1:15);a2=chromosome(i,16:30);
        param=zeros(1,2);
        for j=1:15
            param(1,1)=param(1,1)+a1(1,j)*pow2(j-1);
        end
        for j=1:15
            param(1,2)=param(1,2)+a2(1,j)*pow2(j-1);
        end
        m=pow2(15)-1;
        x1=-5+param(1,1)/m*10;
        x2=-5+param(1,2)/m*10;
        fitness_function(1,i)=x1^2+x2^2;     
        if(fitness_function(1,i)<maxsat)
            maxsat=fitness_function(1,i);
            optimal=[x1 x2 fitness_function(1,i)];
        end 
        if(fitness_function(1,i)<=0.001)
            flag=-1;
            optimal
            generation
            break;
        else
            sum_fit=sum_fit+fitness_function(1,i);
        end
        if (flag<0)
            break;
        end      
    end
    
      
    if(flag>0)
        %the first select
        sum_fit=sum_fit-fitness_function(1,Population_Size);
        for i=1:Population_Size-1
            x=round(rand(1)*32767);
            sum=round(sum_fit);
            rr=rem(x,sum);
            n=1;ba=1;
            partsum=0;             
            while((partsum<rr)&(n<Population_Size-1))
                partsum=partsum+fitness_function(1,n);
                ba=n;
                n=n+1;
            end           
            selected(1,i)=ba;
        end
        %reproduce     
        for i=1:Population_Size-1
            for j=1:String_Length
                chromosome_change(i,j)=chromosome(selected(1,i),j);
            end
            fitness_function(1,i)=fitness_function(1,selected(1,i));
        end  
        
        %select before crossover      
        for i=1:Population_Size-1
            x=round(rand(1)*32767);
            sum=round(sum_fit);
            rr=rem(x,sum)+1;
            n=1;
            partsum=0;
            while((partsum<rr)&(n<=Population_Size-1))
                partsum=partsum+fitness_function(1,n);
                bba=n;
                n=n+1;
            end
            selected(1,i)=bba;   
        end
        %crossover
        maxsw=max(fitness_function);
        for i=1:Population_Size/2-1
            parent1=selected(1,i);
            parent2=selected(1,Population_Size-1-i);
            child1=i;
            child2=Population_Size-1-i;
            pc=0.8;
            randnum=rand(1);
            site1=round(rand(1)*String_Length);
            for j=1:String_Length
                if(j<site1)
                    chromosome(child1,j)=chromosome_change(parent1,j);
                    chromosome(child2,j)=chromosome_change(parent2,j);
                else
                    chromosome(child1,j)=chromosome_change(parent2,j);
                    chromosome(child2,j)=chromosome_change(parent1,j);
                end
            end
        end
        %mutation
        pm=0.05;
        for i=1:Population_Size-1       
            for j=1:String_Length
                randnum=rand(1);
                if(randnum<pm)
                    chromosome(i,j)=~chromosome(i,j);
                end
            end
        end 
    end
    generation=generation+1
end