Roulette.java

package progen.kernel.evolution.selector;

import java.util.ArrayList;
import java.util.List;

import progen.kernel.population.Individual;
import progen.kernel.population.Population;

/**
 * Clase que implementa el comportamiento del selector de ruleta.
 * 
 * @author jirsis
 * @since 1.0
 * 
 */
public class Roulette extends Selector {

  @Override
  public List<Individual> select(Population pop, int howMany) {
    final List<Individual> selection = new ArrayList<Individual>();

    double totalAdjustedFitness = 0;

    double fitnessSelected;
    boolean rouletteSelected = false;
    double currentFitness;

    for (Individual individual : pop.getIndividuals()) {
      totalAdjustedFitness += individual.getAdjustedFitness();
    }

    for (int i = 0; i < howMany; i++) {
      fitnessSelected = Math.random();
      currentFitness = 0;
      rouletteSelected = false;
      for (int j = 0; !rouletteSelected && j < pop.getIndividuals().size(); j++) {
        currentFitness += pop.getIndividual(j).getAdjustedFitness() / totalAdjustedFitness;
        if (currentFitness >= fitnessSelected) {
          rouletteSelected = true;
          selection.add(pop.getIndividual(j).clone());
        }
      }
    }

    return selection;
  }

}