-
Notifications
You must be signed in to change notification settings - Fork 0
/
Individual.java
137 lines (106 loc) · 3.54 KB
/
Individual.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
136
137
package intjuba;
import java.util.LinkedList;
import java.util.Random;
public class Individual implements Comparable<Individual> {
private LinkedList<Integer> chromosome = new LinkedList<Integer>();
Random rand_generator = new Random();
static int chromosome_length;
private int fitness = 0;
// These are the starting points that had no pebbles in the pocket
private LinkedList<Integer> junk_dna = new LinkedList<Integer>();
// Whether the individual is a solution or not. Initialized as false
private boolean solution = false;
public void generateIndividual(int length) {
chromosome_length = length;
for (int i = 0; i < chromosome_length; i++) {
int gene = rand_generator.nextInt(10);
while (gene == 0) {
gene = rand_generator.nextInt(10);
}
chromosome.add(gene);
}
}
public int size() {
return chromosome.size();
}
public boolean isSolution() {
return solution;
}
public void markAsSolution() {
solution = true;
}
public int getGene(int index) {
return chromosome.get(index);
}
public void setGene(int index, int value) {
chromosome.add(index, value);
fitness = 0;
}
public void replaceGene(int index, int value) {
chromosome.set(index, value);
}
public LinkedList<Integer> getChromosome() {
return chromosome;
}
public int getFitness() {
if (fitness == 0) {
fitness = Fitness.getFitness(this);
}
return fitness;
}
public void setFitness(int fitness){
this.fitness = fitness;
}
public void setJunkDNA(LinkedList<Integer> dna) {
junk_dna = dna;
}
public void removeJunkDNA() {
if (junk_dna.size() == 0) {
return;
}
LinkedList<Integer> new_chromosome = new LinkedList<Integer>();
for (Integer index : junk_dna) {
replaceGene(index, -1);
}
for (Integer gene : chromosome) {
if (gene != -1) {
new_chromosome.add(gene);
}
}
chromosome = new_chromosome;
chromosome_length = chromosome.size();
}
public LinkedList<Integer> getJunkDna() {
return junk_dna;
}
public void adjustLength(int length) {
chromosome_length = chromosome.size();
if (chromosome_length > length) {
// Remove last few genes to make chromosome long enough
for (int i = chromosome_length - 1; i > length; i--) {
chromosome.remove(i);
}
} else if (chromosome_length < length) {
// Add some randomly generated genes to make the chromosome long enough
while (chromosome_length < length) {
int gene = rand_generator.nextInt(Parameters.board_height * Parameters.board_width);
while (gene == Parameters.home) {
gene = rand_generator.nextInt(Parameters.board_height * Parameters.board_width);
}
chromosome.add(gene);
chromosome_length++;
}
}
// The fitness of the individuals is most likely different from what it was earlier so it needs to be reset
fitness = 0;
}
@Override
public String toString() {
return chromosome.toString();
}
@Override
public int compareTo(Individual individual) {
// Ascending order
return individual.getFitness() - this.getFitness();
}
}