-
Notifications
You must be signed in to change notification settings - Fork 3
/
Population.java
101 lines (64 loc) · 2.11 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
package ea;
// Population class.
public class Population {
protected Individual[] pop;
protected Individual[] pop_temp;
protected int popsize;
protected int gen;
protected double maxFit;
protected double avgFit;
protected int bestIndiv;
// Constructor takes an array of Individuals
// as an initial population. Please make all
// the elements in the Individuals array the
// same class type; otherwise, the algorithm
// will attempt to do inter-species breeding
// and a runtime error will most likely occur.
public Population(Individual[] population) {
popsize = population.length;
gen = 0;
pop = new Individual[popsize];
pop_temp = new Individual[popsize];
for (int i = 0; i < popsize; i++) pop[i] = population[i];
updateStats();
}
// Simulates one generation using the parent
// selection mechanism specificed by selector.
public void runGeneration(Selector selector) {
selector.update(this);
repopulate(selector);
updateStats();
gen++;
}
public Individual at(int index) { return pop[index]; }
public int size() { return popsize; }
public int generation() { return gen; }
public double maxFitness() { return maxFit; }
public double avgFitness() { return avgFit; }
public Individual getBestIndividual() { return pop[bestIndiv]; }
protected void repopulate(Selector selector) {
pop_temp[0] = getBestIndividual();
for (int i = 1; i < popsize; i++) {
int parent1_idx = selector.select();
int parent2_idx = selector.select();
pop_temp[i] = pop[parent1_idx].crossover(pop[parent2_idx]);
}
Individual[] temp = pop;
pop = pop_temp;
pop_temp = temp;
for (int i = 1; i < popsize; i++) pop[i].mutate();
}
protected void updateStats() {
maxFit = pop[0].fitness();
avgFit = 0.0;
bestIndiv = 0;
for (int i = 1; i < popsize; i++) {
if (pop[i].fitness() > maxFit) {
maxFit = pop[i].fitness();
bestIndiv = i;
}
avgFit += pop[i].fitness();
}
avgFit /= (double)popsize;
}
}