/// <summary> /// Realizuje algorytm selekcji. /// </summary> /// <param name="population">Populacja poddawana selekcji.</param> /// <returns>Zbiór osobników populacji, wybranych w wyniku selekcji do następnej generacji.</returns> public IChromosome[] Select(IChromosome[] population) { if (population.Length < 2) { return population; } IChromosome[] subpopulation = population.Where(ch => ch.Evaluate() > 0).ToArray(); Double totalFitness = subpopulation.Sum(ch => ch.Evaluate()); Int32 newPopulationSize = (Int32)PopulationSize.ComputeSize(subpopulation); IChromosome[] result = new IChromosome[newPopulationSize]; for (Int32 i = 0; i < newPopulationSize; i++) { Double ptr = RandomGenerator.NextDouble(); Double sum = 0.0; for (Int32 j = 0; j < subpopulation.Length; ++j) { sum += subpopulation[j].Evaluate() / totalFitness; if (sum > ptr) { result[i] = subpopulation[j]; break; } } } return result; }
/// <summary> /// Realizuje algorytm selekcji. /// </summary> /// <param name="population">Populacja poddawana selekcji.</param> /// <returns>Zbiór osobników populacji, wybranych w wyniku selekcji do następnej generacji.</returns> public IChromosome[] Select(IChromosome[] population) { if (population.Length < 2) { return population; } IChromosome[] subpopulation = population.Where(ch => ch.Evaluate() > 0).ToArray(); Double totalFitness = subpopulation.Sum(ch => ch.Evaluate()); Int32 newPopulationSize = (Int32)PopulationSize.ComputeSize(subpopulation); IChromosome[] result = new IChromosome[newPopulationSize]; Double ptrstep = 1.0 / newPopulationSize; Double ptr = RandomGenerator.NextDouble() * ptrstep; Int32 pos = 0; Double sum = 0.0; for (Int32 i = 0; i < subpopulation.Length; i++) { for (sum += subpopulation[i].Evaluate() / totalFitness; sum > ptr; ptr += ptrstep) { result[pos++] = subpopulation[i]; if (pos == newPopulationSize) { return result; } } } // it shouldn't happen Debug.Assert(false); return result; }