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.java85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/jcgp/backend/modules/problem/DigitalCircuitProblem.java b/src/jcgp/backend/modules/problem/DigitalCircuitProblem.java
new file mode 100644
index 0000000..e92989e
--- /dev/null
+++ b/src/jcgp/backend/modules/problem/DigitalCircuitProblem.java
@@ -0,0 +1,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 int getMaxFitness() {
+ int maxFitness = (int) 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";
+ }
+}