-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathPopulation.java
135 lines (121 loc) · 3.65 KB
/
Population.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package tsp;
import java.util.Arrays;
import java.util.Comparator;
public class Population {
private Individual population[];
private double avgFitness = -1;
/**
* Initializes blank population of individuals
*
* @param populationSize The size of the population
*/
public Population(int populationSize){
// Initial population
this.population = new Individual[populationSize];
}
/**
* Initializes population of individuals
*
* @param populationSize The size of the population
* @param chromosomeLength The length of the individuals chromosome
*/
public Population(int populationSize, int chromosomeLength){
// Initial population
this.population = new Individual[populationSize];
// Loop over population size
for (int individualCount = 0; individualCount < populationSize; individualCount++) {
// Create individual
Individual individual = new Individual(chromosomeLength);
// Add individual to population
this.population[individualCount] = individual;
}
}
/**
* Get individuals from the population
*
* @return individuals Individuals in population
*/
public Individual[] getIndividuals(){
return this.population;
}
/**
* Find fittest individual in the population
*
* @param offset
* @return individual Fittest individual at offset
*/
public Individual getFittest(int offset){
// Order population by fitness
Arrays.sort(this.population, new Comparator<Individual>() {
@Override
public int compare(Individual o1, Individual o2) {
if (o1.getFitness() > o2.getFitness()) {
return -1;
}
else if (o1.getFitness() < o2.getFitness()) {
return 1;
}
return 0;
}
});
// Return the fittest individual
return this.population[offset];
}
/**
* Randomly order individuals in the population
*/
public void shuffle(){
// Run through each individual
for (int individualIndex=0; this.size() > individualIndex; individualIndex++) {
// Get new, random, index for individual
int index = (int) (Math.random() * this.size());
// Swap individuals
Individual tempIndividual = this.population[index];
this.population[index] = this.population[individualIndex];
this.population[individualIndex] = tempIndividual;
}
}
/**
* Sets the average population's fitness
*
* @param fitness The population's average fitness
*/
public void setAvgFitness(double fitness){
this.avgFitness = fitness;
}
/**
* Get the population's average fitness
*
* @return avgFitness The population's average fitness
*/
public double getPopulationFitness(){
return this.avgFitness;
}
/**
* Get population's size
*
* @return size The population's size
*/
public int size(){
return this.population.length;
}
/**
* Set individual at offset
*
* @param individual
* @param offset
* @return individual
*/
public Individual setIndividual(Individual individual, int offset){
return population[offset] = individual;
}
/**
* Get individual at offset
*
* @param offset
* @return individual
*/
public Individual getIndividual(int offset){
return population[offset];
}
}