blob: 3c30e4ccb2bef47d34dac2e10dbca24ef6f433ac (
plain)
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
|
package jcgp.backend.modules.problem;
import jcgp.backend.function.BitwiseLogic;
import jcgp.backend.function.UnsignedInteger;
import jcgp.backend.population.Chromosome;
import jcgp.backend.population.Population;
import jcgp.backend.resources.Resources;
public class DigitalCircuitProblem extends TestCaseProblem<UnsignedInteger> {
public DigitalCircuitProblem(Resources resources) {
super(resources);
functionSet = new BitwiseLogic();
}
@Override
public void evaluate(Population population, Resources resources) {
// set fittest to 0, change it whenever a fitter one is found
population.setFittest(0);
// for every chromosome in the population
for (int i = 0; i < resources.populationSize(); i++) {
// assume an initial fitness of 0
int fitness = 0;
// iterate over every test case
for (int t = 0; t < testCases.size(); t++) {
population.getChromosome(i).setInputs((Object[]) testCases.get(t).getInputs());
// check each output
for (int o = 0; o < resources.outputs(); o++) {
Integer output = ((UnsignedInteger) population.getChromosome(i).getOutput(o).calculate()).get();
Integer matches = ~(output ^ testCases.get(t).getOutput(o).get());
// check only the relevant bits
int bits = (int) Math.pow(2.0, (double) resources.inputs());
for (int b = 0; b < bits; b++) {
if (((matches >>> b) & 1) == 1) {
fitness++;
}
}
}
}
// assign the resulting fitness to the respective individual
population.getChromosome(i).setFitness(fitness);
if (fitness >= population.getFittest().getFitness()) {
population.setFittest(i);
}
}
}
@Override
protected double getMaxFitness() {
double maxFitness = Math.pow(2.0, (double) resources.inputs()) * resources.outputs();
return maxFitness;
}
@Override
public String toString() {
return "Digital circuit";
}
@Override
public void addTestCase(String[] inputs, String[] outputs) {
UnsignedInteger[] inputCases = new UnsignedInteger[inputs.length];
UnsignedInteger[] outputCases = new UnsignedInteger[outputs.length];
for (int i = 0; i < inputCases.length; i++) {
inputCases[i] = new UnsignedInteger(inputs[i]);
}
for (int o = 0; o < outputCases.length; o++) {
outputCases[o] = new UnsignedInteger(outputs[o]);
}
addTestCase(new TestCase<UnsignedInteger>(inputCases, outputCases));
}
@Override
public boolean isPerfectSolution(Chromosome fittest) {
return fittest.getFitness() >= maxFitness.get();
}
@Override
public String getFileExtension() {
return ".plu";
}
}
|