public void Migrate( Population anotherPopulation, int numberOfMigrants, ISelectionMethod migrantsSelector )
{
int currentSize = this.size;
int anotherSize = anotherPopulation.Size;
// create copy of current population
List<IChromosome> currentCopy = new List<IChromosome>( );
for ( int i = 0; i < currentSize; i++ )
{
currentCopy.Add( population[i].Clone( ) );
}
// create copy of another population
List<IChromosome> anotherCopy = new List<IChromosome>( );
for ( int i = 0; i < anotherSize; i++ )
{
anotherCopy.Add( anotherPopulation.population[i].Clone( ) );
}
// apply selection to both populations' copies - select members to migrate
migrantsSelector.ApplySelection( currentCopy, numberOfMigrants );
migrantsSelector.ApplySelection( anotherCopy, numberOfMigrants );
// sort original populations, so the best chromosomes are in the beginning
population.Sort( );
anotherPopulation.population.Sort( );
// remove worst chromosomes from both populations to free space for new members
population.RemoveRange( currentSize - numberOfMigrants, numberOfMigrants );
anotherPopulation.population.RemoveRange( anotherSize - numberOfMigrants, numberOfMigrants );
// put migrants to corresponding populations
population.AddRange( anotherCopy );
anotherPopulation.population.AddRange( currentCopy );
// find best chromosomes in each population
FindBestChromosome( );
anotherPopulation.FindBestChromosome( );
}