gusucode.com > 十大算法matlab程序说明 > 十大算法matlab程序说明/遗传退火法/migrate.m

    function state = migrate(FitnessFcn,GenomeLength,options,state )
%MIGRATE Migrate members between sub-populations.
%   state = migrate(FitnessFcn,GenomeLength,options,state ); migrates individuals between
%   subpopulations.
%
%   migrationInterval: If the population size property is a vector
%   of scalars, then there will be multiple, independent populations,
%   evolving separately. Every so often, the best individuals
%   from one sub-population will replace the worst individuals in
%   another sub-population. The migration interval controls how
%   many generation pass between migration. If migrationInterval
%   equals 20, for example, migration between subpopulations will
%   take place every 20 generations.
%
%   migrationFraction: When migration occurs between sub-populations
%   this parameter controls how many individuals move between
%   populations. This is the fraction of the lesser of the two populations
%   that moves. If members are migrating from a sub-population
%   of 50 individuals into a population of 100 individuals and the
%   migrationFraction is 0.1, then 5 individuals (0.1 * 50) will move.
%   Individuals that migrate from one sub-population to another are copied. 
%   They are not removed from the source sub-population.
%
%   migrationDirection: Migration can take place in one direction or two.
%   If migration direction is set to "forward" then migration takes place
%   toward the last sub-population. That is the nth sub-population
%   migrates into the (n+1)'th sub-population. If migration direction is
%   both then the nth sub-population migrates into both the (n-1)th
%   and the (n+1)th sub-population. Migration wraps at the ends of
%   the sup-populations. That is, the last sub-population migrates
%   into the first, and the first may migrate into the last. To prevent
%   wrapping, specify a sub-population of size zero.

%   Copyright 2003-2004 The MathWorks, Inc.
%   $Revision: 1.6.4.1 $  $Date: 2004/08/20 19:49:22 $

% is it time for migration to occur?
if((length(options.PopulationSize) == 1) || rem(state.Generation,options.MigrationInterval) ~= 0)
    return
end

populations = options.PopulationSize;
subPops = populationIndicies(populations);

% How many will migrate from each sub-population?
nMigrators = round(populations * options.MigrationFraction);
% the min of the source and destination populations
forward  = min(nMigrators,[nMigrators(2:end),nMigrators(1)]);
backward = forward([end,1:(end-1)]);

% get sorted indicies for each sub-population
indicies = cell(1,length(populations));
newcomers = cell(1,length(populations));

% one pass to find who moves out from each subpopulation
for pop = 1:length(populations)
    p = subPops(:,pop);

    % get a set of indicies into this sub-population sorted by score
    [unused,i] = sort(state.Score(p(1):p(2)));
    sourcePop = i(:) + p(1) - 1;
    
    % where are we migrating to?
    ahead = 1 + mod(pop,length(populations));  
    newcomers{ahead} = [newcomers{ahead};sourcePop(1:forward(pop))]; 
    
    if(strcmpi(options.MigrationDirection,'both'))
        behind = 1 + mod(pop-2,length(populations));
        newcomers{behind} = [newcomers{behind}; sourcePop(1:backward(pop))];
    end
    
    indicies{pop} = sourcePop;
end

% a second pass to move them into each subpopulation.
for i = 1:length(populations)
    from = newcomers{i};
    % who is being replaced
    pop = indicies{i};
    n = length(from);
    to = pop((end-n + 1):end);
    %migrate
    state.Population(to,:) = state.Population(from,:);
    state.Score(to) = state.Score(from);
end