/ benchmark / genetics / Population.java
Population.java
 1  package genetics;
 2  
 3  import java.util.Collection;
 4  import java.util.HashMap;
 5  
 6  /**
 7   * A Population maintains an array of individuals, and a generation number
 8   */
 9  public class Population {
10  
11      private int generation;
12      private Individual[] individuals;
13  
14      /**
15       * Creates an empty population of size 'size'
16       */
17      public Population(int size, int generation){
18          individuals = new Individual[size];
19          this.generation = generation;
20      }
21  
22      /**
23       * Generates a population of size 'size'
24       * Uses 'genes' to generate a chromosome for each individual
25       */
26      public Population(int size, int generation, Collection<Gene> genes){
27          individuals = new Individual[size];
28          this.generation = generation;
29          for (int i = 0; i < size(); i++) {
30              Individual newIndividual = new Individual(generateChromosome(genes));
31              setIndividual(i, newIndividual);
32          }
33      }
34  
35      private HashMap<String, Double> generateChromosome(Collection<Gene> genes){
36          HashMap<String, Double> chromosome = new HashMap<>();
37          for (Gene gene : genes){
38              chromosome.put(gene.getName(), gene.generateAllele());
39          }
40          return chromosome;
41      }
42  
43      public Individual[] getIndividuals() {
44          return individuals;
45      }
46  
47      public Individual getIndividual(int index) {
48          return individuals[index];
49      }
50  
51      public void setIndividual(int index, Individual individual) {
52          individuals[index] = individual;
53      }
54  
55      public Individual getFittest() {
56          Individual fittest = individuals[0];
57          for (int i = 1; i < size(); i++) {
58              if (fittest.getFitness() < getIndividual(i).getFitness()) {
59                  fittest = getIndividual(i);
60              }
61          }
62          return fittest;
63      }
64  
65      public double getAverageFitness() {
66          double total = 0.0;
67          for (Individual ind : individuals){
68              total += ind.getFitness();
69          }
70          double average = total / individuals.length;
71          average = Math.floor(average * 1000) / 1000;
72          return average;
73      }
74  
75      public int getGeneration() {
76          return generation;
77      }
78  
79      public int size() {
80          return individuals.length;
81      }
82  }