#pragma warning disable CS0436 // Type conflicts with imported type /// <summary> /// Perform migration between two populations. /// </summary> /// /// <param name="anotherPopulation">Population to do migration with.</param> /// <param name="numberOfMigrants">Number of chromosomes from each population to migrate.</param> /// <param name="migrantsSelector">Selection algorithm used to select chromosomes to migrate.</param> /// /// <remarks><para>The method performs migration between two populations - current and the /// <paramref name="anotherPopulation">specified one</paramref>. During migration /// <paramref name="numberOfMigrants">specified number</paramref> of chromosomes is choosen from /// each population using <paramref name="migrantsSelector">specified selection algorithms</paramref> /// and put into another population replacing worst members there.</para></remarks> /// public void Migrate(Population anotherPopulation, int numberOfMigrants, ISelectionMethod migrantsSelector) #pragma warning restore CS0436 // Type conflicts with imported type { 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( ); }
/// <summary> /// Perform migration between two populations. /// </summary> /// /// <param name="anotherPopulation">Population to do migration with.</param> /// <param name="numberOfMigrants">Number of chromosomes from each population to migrate.</param> /// <param name="migrantsSelector">Selection algorithm used to select chromosomes to migrate.</param> /// /// <remarks><para>The method performs migration between two populations - current and the /// <paramref name="anotherPopulation">specified one</paramref>. During migration /// <paramref name="numberOfMigrants">specified number</paramref> of chromosomes is choosen from /// each population using <paramref name="migrantsSelector">specified selection algorithms</paramref> /// and put into another population replacing worst members there.</para></remarks> /// 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( ); }