/** * 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; }