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
|
package jcgp.population;
import jcgp.CGP.Parameters;
import jcgp.CGP.Utilities;
public class Chromosome {
private Input[] inputs;
private Node[][] nodes;
private Output[] outputs;
private int fitness = 0;
/**
* Good citizen.
*
* @param outputs
* @param columns
* @param rows
* @param inputs
*
*/
public Chromosome(int inputCount, int rows, int columns, int outputCount) {
instantiateElements(inputCount, rows, columns, outputCount);
initialiseConnections();
}
/**
* @param inputCount
* @param rows
* @param columns
* @param outputCount
*/
private void instantiateElements(int inputCount, int rows, int columns, int outputCount) {
inputs = new Input[inputCount];
for (int i = 0; i < inputCount; i++) {
inputs[i] = new Input();
}
// rows first
nodes = new Node[Parameters.getRows()][Parameters.getColumns()];
for (int r = 0; r < rows; r++) {
//nodes[r] = new Node[Parameters.getColumns()];
for (int c = 0; c < columns; c++) {
nodes[r][c] = new Node();
}
}
outputs = new Output[outputCount];
for (int o = 0; o < outputCount; o++) {
outputs[o] = new Output();
}
}
private void initialiseConnections() {
// initialise nodes - [rows][columns]
for (int r = 0; r < nodes.length; r++) {
for (int c = 0; c < nodes.length; c++) {
Connection[] connections = new Connection[Utilities.getMaxArity()];
for (int i = 0; i < connections.length; i++) {
connections[i] = Utilities.getRandomConnection(this, c);
}
nodes[r][c].initialise(Utilities.getRandomFunction(), connections);
}
}
for (Output output : outputs) {
output.setConnection(Utilities.getRandomNode(this));
}
}
public int getActiveNodeCount() {
return 0;
}
public Node getNode(int row, int column) {
return nodes[row][column];
}
public Output getOutput(int index) {
return outputs[index];
}
public Input getInput(int index) {
return inputs[index];
}
public int getFitness() {
return fitness;
}
public void setFitness(int newFitness) {
fitness = newFitness;
}
public void setInputs(int ... values) {
// if the values provided dont match the specified number of inputs, the user should be warned
if (values.length == inputs.length) {
// set inputs for evaluation
for (int i = 0; i < values.length; i++) {
inputs[i].setValue(values[i]);
}
} else {
System.out.println("Input mismatch: chromosome has a different number of inputs than the truth table.");
}
}
}
|