aboutsummaryrefslogtreecommitdiffstats
path: root/src/jcgp/backend/modules/problem/DigitalCircuitProblem.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jcgp/backend/modules/problem/DigitalCircuitProblem.java')
-rw-r--r--src/jcgp/backend/modules/problem/DigitalCircuitProblem.java43
1 files changed, 34 insertions, 9 deletions
diff --git a/src/jcgp/backend/modules/problem/DigitalCircuitProblem.java b/src/jcgp/backend/modules/problem/DigitalCircuitProblem.java
index 099f527..6654928 100644
--- a/src/jcgp/backend/modules/problem/DigitalCircuitProblem.java
+++ b/src/jcgp/backend/modules/problem/DigitalCircuitProblem.java
@@ -6,12 +6,28 @@ import jcgp.backend.population.Chromosome;
import jcgp.backend.population.Population;
import jcgp.backend.resources.Resources;
+/**
+ * Digital circuit problem
+ * <br><br>
+ * Using this problem type, digital logic circuits can be evolved.
+ * {@code parseData()} must be used to load the desired circuit
+ * truth table in the standard CGP .plu format.
+ *
+ * @see DigitalCircuitFunctions
+ * @author Eduardo Pedroni
+ *
+ */
public class DigitalCircuitProblem extends TestCaseProblem<UnsignedInteger> {
+ /**
+ * Construct a new instance of DigitalCircuitProblem.
+ *
+ * @param resources a reference to the experiment's resources.
+ */
public DigitalCircuitProblem(Resources resources) {
super(resources);
- functionSet = new DigitalCircuitFunctions();
- setProblemName("Symbolic regression");
+ setFunctionSet(new DigitalCircuitFunctions());
+ setName("Digital circuit");
setFileExtension(".plu");
}
@@ -49,17 +65,14 @@ public class DigitalCircuitProblem extends TestCaseProblem<UnsignedInteger> {
@Override
protected double getMaxFitness() {
+ // calculate the fitness by looking at inputs, not number of test cases
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) {
+ public TestCase<UnsignedInteger> parseTestCase(String[] inputs, String[] outputs) {
+ // cast the test case values to UnsignedInteger
UnsignedInteger[] inputCases = new UnsignedInteger[inputs.length];
UnsignedInteger[] outputCases = new UnsignedInteger[outputs.length];
for (int i = 0; i < inputCases.length; i++) {
@@ -69,11 +82,23 @@ public class DigitalCircuitProblem extends TestCaseProblem<UnsignedInteger> {
outputCases[o] = new UnsignedInteger(outputs[o]);
}
- addTestCase(new TestCase<UnsignedInteger>(inputCases, outputCases));
+ return new TestCase<UnsignedInteger>(inputCases, outputCases);
}
@Override
public boolean isPerfectSolution(Chromosome fittest) {
+ // higher fitness is better
return fittest.getFitness() >= maxFitness.get();
}
+
+ @Override
+ public boolean isImprovement(Chromosome fittest) {
+ // higher fitness is better
+ if (fittest.getFitness() > bestFitness.get()) {
+ bestFitness.set(fittest.getFitness());
+ return true;
+ } else {
+ return false;
+ }
+ }
}