Beispiel #1
0
  /**
   * Method to select individuals from population. Selects the best N individuals.
   *
   * <p>Roulette wheel selection: If Fi is the fitness of individual i in the population, its
   * probability of being selected is Pi = (Fi/sum of all the fitness in population)
   *
   * @param count The number of individuals to be selected
   * @return List of selected individuals
   */
  public List<AbstractIndividual> selectIndividuals(int count) {
    ArrayList<AbstractIndividual> selected = new ArrayList<>();

    Random r = new Random();
    // find best individual and calculate the sum of individuals' fitnesses
    AbstractIndividual best = this.individuals[0];
    double totalFitness = 0.0;
    for (AbstractIndividual individual : this.individuals) {
      totalFitness += individual.getFitness();
      if (individual.getFitness() > best.getFitness()) {
        best = individual;
      }
    }

    int index;
    while (selected.size() < count) {
      while (true) {
        index = (r.nextInt(individuals.length));
        if (r.nextDouble() < (individuals[index].getFitness() / totalFitness)) {
          break;
        }
      }
      selected.add(individuals[index]);
    }

    /**
     * Tournament selection. we split the population into N groups of individuals and we pick the
     * best one out of each group.
     */
    /*
    int split = individuals.length / count;
    for(int i = 0; i < count; i++) {
    AbstractIndividual best = this.individuals[split * i];
    for (int j = (split * i); j < (split * (i + 1)); j++) {
    if (individuals[j].getFitness() > best.getFitness() && !selected.contains(individuals[j])) {
    best = individuals[j];
    }
    }
    selected.add(best);
    }
    */
    /**
     * elitism: select the best N individuals.
     *
     * <p>Doesn't work well, leads to premature convergence.
     */
    /*
    while (selected.size() < count) {
    AbstractIndividual best = this.individuals[0];
    for (AbstractIndividual individual : this.individuals) {
    if (individual.getFitness() > best.getFitness() && !selected.contains(individual)) {
    best = individual;
    }
    }
    selected.add(best);
    }
    */
    /** Random selection. Primitive, doesn't work well */
    /*
    Random r = new Random();
    AbstractIndividual individual = individuals[r.nextInt(individuals.length)];
    while (selected.size() < count) {
    selected.add(individual);
    individual = individuals[r.nextInt(individuals.length)];
    }
    */
    return selected;
  }