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 }