www.gusucode.com > 数据挖掘工具箱 - mitmatlab源码程序 > mitmatlab\Genetic_Algorithm.m

    function D = Genetic_Algorithm(train_features, train_targets, params, region);

% Classify using a basic genetic algorithm
% Inputs:
% 	features	- Train features
%	targets	- Train targets
%	Params  - [Type, TargetErr, Nchrome, Pco, Pmut], where:
%               Type:       Type of weak learner (Can be any that doesn't use a parameter: LS, ML, MLdiag, Pocket, Perceptron
%               TargetErr:  Target error on the train set for the GA
%               Nchrome:    Number of chromosomes to use
%               Pco:        Probability of recombination
%               Pmut:       Probability of mutation
%	region	- Decision region vector: [-x x -y y number_of_points]
%
% Outputs
%	D			- Decision sufrace

[type, TargetErr, Nchrome, Pco, Pmut] = process_params(params);
[D,L]     = size(train_features);
iter      = 0;

%Build the chromosomes
%The mapping in this realization is wheather or not to use a given example for building the classifier
chromosomes = rand(Nchrome, L)>0.5;
ranking     = ones(1,Nchrome);

while 1,    
    %Determine the fit of each chromosome
    for i = 1:Nchrome,
        if (ranking(i) == 1),
            %Build a classifier and test it
            index   = find(chromosomes(i,:) == 1);
            D       = feval(type, train_features(:,index), train_targets(index), [], region);
            scores  = calculate_error (D, train_features, train_targets, [], [], region, length(unique(train_targets)));
            ranking(i) = scores(3);
        end
    end
    
    if ((min(ranking) < TargetErr)),
        break
    end

    iter = iter + 1;
    if (iter/10 == floor(iter/10)),
        disp(['Iteration number ' num2stR(iter) ': Best classifier so far has an error of ' num2str(min(ranking)*100) '%'])
    end

    %Rank the chromosomes
    [m, rating] = sort(ranking);
    
    for i = 1:floor(Nchrome/2),
        %Select the two chromosomes with the highest score
        c1  = rating(i*2-1);
        c2  = rating(i*2);
        
        %If rand[0,1]<Pco then 
        if (rand(1) < Pco),
            %Crossover each pair at a random bit
            crossover = randperm(L-2);  %This is to avoid edges
            temp1     = chromosomes(c1,:);
            temp2     = chromosomes(c2,:);
            chromosomes(c1,1:crossover(1)+1)    = temp2(1:crossover(1)+1);
            chromosomes(c2,crossover(1)+2:end)  = temp1(crossover(1)+2:end);
            ranking(c1) = 1;
            ranking(c2) = 1;
        else
            %Change each bit with probability Pmut
            chromosomes(c1,:) = xor(chromosomes(c1,:),(rand(1,L)>(1-Pmut)));
            chromosomes(c2,:) = xor(chromosomes(c2,:),(rand(1,L)>(1-Pmut)));
            ranking(c1) = 1;
            ranking(c2) = 1;
        end
    end
    
end

best     = find(ranking == min(ranking));
best     = best(1);
index    = find(chromosomes(best,:) == 1);
D        = feval(type, train_features(:,index), train_targets(index), [], region);