aboutsummaryrefslogtreecommitdiffstats
path: root/src/jcgp/JCGP.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jcgp/JCGP.java')
-rw-r--r--src/jcgp/JCGP.java170
1 files changed, 121 insertions, 49 deletions
diff --git a/src/jcgp/JCGP.java b/src/jcgp/JCGP.java
index 807739f..7451d4f 100644
--- a/src/jcgp/JCGP.java
+++ b/src/jcgp/JCGP.java
@@ -6,24 +6,27 @@ import java.util.Map.Entry;
import java.util.Random;
import javafx.beans.property.SimpleIntegerProperty;
-import jcgp.function.Arithmetic;
-import jcgp.function.BitwiseLogic;
-import jcgp.function.BooleanLogic;
-import jcgp.function.Function;
-import jcgp.function.FunctionSet;
-import jcgp.modules.ea.EvolutionaryAlgorithm;
-import jcgp.modules.ea.MuPlusLambda;
-import jcgp.modules.ea.TournamentSelection;
-import jcgp.modules.fitness.FitnessFunction;
-import jcgp.modules.fitness.TestCase;
-import jcgp.modules.fitness.TestCaseEvaluator;
-import jcgp.modules.mutator.Mutator;
-import jcgp.modules.mutator.PointMutator;
-import jcgp.parameters.BooleanParameter;
-import jcgp.parameters.DoubleParameter;
-import jcgp.parameters.IntegerParameter;
-import jcgp.parameters.Parameter;
-import jcgp.population.Population;
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import jcgp.backend.function.Arithmetic;
+import jcgp.backend.function.BitwiseLogic;
+import jcgp.backend.function.BooleanLogic;
+import jcgp.backend.function.Function;
+import jcgp.backend.function.FunctionSet;
+import jcgp.backend.modules.ea.EvolutionaryAlgorithm;
+import jcgp.backend.modules.ea.MuPlusLambda;
+import jcgp.backend.modules.ea.TournamentSelection;
+import jcgp.backend.modules.fitness.FitnessFunction;
+import jcgp.backend.modules.fitness.TestCase;
+import jcgp.backend.modules.fitness.TestCaseEvaluator;
+import jcgp.backend.modules.mutator.Mutator;
+import jcgp.backend.modules.mutator.PointMutator;
+import jcgp.backend.parameters.BooleanParameter;
+import jcgp.backend.parameters.DoubleParameter;
+import jcgp.backend.parameters.IntegerParameter;
+import jcgp.backend.parameters.Parameter;
+import jcgp.backend.population.Population;
+import jcgp.gui.console.Console;
/**
* @author Eduardo Pedroni
@@ -33,6 +36,9 @@ public class JCGP {
/**
*
+ * The resources class encapsulates all of the resources based on which the program operates.
+ * Each instance of JCGP contains a single instance of Resources, which gets passed to the selected
+ * modules as the program executes.
*
* @author Eduardo Pedroni
*
@@ -51,8 +57,11 @@ public class JCGP {
new BooleanLogic() };
private FunctionSet functionSet = functionSets[0];
+ // GUI console
+ private Console console;
+
public Resources() {
- createCoreParameters();
+ createBaseParameters();
numberGenerator = new Random(getInt("seed"));
set("arity", functionSet.getMaxArity());
@@ -104,7 +113,7 @@ public class JCGP {
return parameters.containsKey(key);
}
- private void createCoreParameters() {
+ private void createBaseParameters() {
parameters.put("rows", new IntegerParameter(8, "Rows"));
parameters.put("columns", new IntegerParameter(9, "Columns"));
parameters.put("inputs", new IntegerParameter(3, "Inputs"));
@@ -112,21 +121,73 @@ public class JCGP {
parameters.put("popSize", new IntegerParameter(5, "Population"));
parameters.put("levelsBack", new IntegerParameter(2, "Levels back"));
- IntegerParameter nodes = new IntegerParameter(1, "Nodes", false, true);
+ IntegerParameter nodes = new IntegerParameter(1, "Nodes", true, true, false);
nodes.valueProperty().bind(((SimpleIntegerProperty) ((IntegerParameter) parameters.get("rows")).valueProperty()).multiply((SimpleIntegerProperty) ((IntegerParameter) parameters.get("columns")).valueProperty()));
parameters.put("nodes", nodes);
parameters.put("generations", new IntegerParameter(1000000, "Generations"));
- parameters.put("currentGen", new IntegerParameter(1, "Generation", false, false));
+ parameters.put("currentGen", new IntegerParameter(1, "Generation", true, false, false));
parameters.put("runs", new IntegerParameter(5, "Runs"));
- parameters.put("currentRun", new IntegerParameter(1, "Run", false, false));
+ parameters.put("currentRun", new IntegerParameter(1, "Run", true, false, false));
- parameters.put("arity", new IntegerParameter(0, "Max arity", true, true));
- parameters.put("seed", new IntegerParameter(123, "Seed"));
+ parameters.put("arity", new IntegerParameter(0, "Max arity", false, true, false));
+
+ IntegerParameter seed = new IntegerParameter(123, "Seed");
+ seed.valueProperty().addListener(new ChangeListener<Number>() {
+ @Override
+ public void changed(
+ ObservableValue<? extends Number> observable,
+ Number oldValue, Number newValue) {
+ numberGenerator.setSeed(newValue.longValue());
+ }
+ });
+ parameters.put("seed", seed);
- parameters.put("verbose", new BooleanParameter(false, "Verbose"));
- parameters.put("report", new IntegerParameter(1, "Report"));
+ parameters.put("report", new IntegerParameter(1, "Report", false, false, false));
+ }
+
+ private boolean validateBaseParameters() {
+ boolean valid = true;
+
+ if (getInt("rows") <= 0) {
+ valid = false;
+ println("Error: number of rows must be greater than 0.");
+ }
+ if (getInt("columns") <= 0) {
+ valid = false;
+ println("Error: number of columns must be greater than 0.");
+ }
+ if (getInt("inputs") <= 0) {
+ valid = false;
+ println("Error: number of inputs must be greater than 0.");
+ }
+ if (getInt("outputs") <= 0) {
+ println("Error: number of outputs must be greater than 0.");
+ valid = false;
+ }
+ if (getInt("popSize") <= 0) {
+ println("Error: population size must be greater than 0.");
+ valid = false;
+ }
+ if (getInt("levelsBack") <= 0 || getInt("levelsBack") > getInt("columns")) {
+ println("Error: levels back must be greater than 0 and no greater than the number of columns.");
+ valid = false;
+ }
+ if (getInt("generations") <= 0) {
+ println("Error: number of generations must be greater than 0.");
+ valid = false;
+ }
+ if (getInt("runs") <= 0) {
+ println("Error: number of runs must be greater than 0.");
+ valid = false;
+ }
+ if (getInt("report") < 0) {
+ println("Error: report frequency must not be smaller than 0.");
+ valid = false;
+ }
+
+ return valid;
}
/**
@@ -157,7 +218,8 @@ public class JCGP {
* FunctionSet functions
*/
public Function getRandomFunction() {
- return functionSet.getAllowedFunction(numberGenerator.nextInt(functionSet.getAllowedFunctionCount()));
+ Function f = functionSet.getAllowedFunction(numberGenerator.nextInt(functionSet.getAllowedFunctionCount()));
+ return f;
}
public Function getFunction(int index) {
@@ -196,7 +258,27 @@ public class JCGP {
public int getTestCaseCount() {
return testCases.length;
}
-
+
+ /*
+ * Console functionality
+ */
+ public void setConsole(Console console) {
+ this.console = console;
+ }
+
+ public void println(String s) {
+ System.out.println(s);
+ if (console != null) {
+ console.println(s);
+ }
+ }
+
+ public void print(String s) {
+ System.out.print(s);
+ if (console != null) {
+ console.print(s);
+ }
+ }
}
private Resources resources = new Resources();
@@ -242,21 +324,12 @@ public class JCGP {
resources.setTestCases(new TestCase(new Integer[]{1, 2, 3}, new Integer[]{4, 5, 6}),
new TestCase(new Integer[]{1, 12, 4}, new Integer[]{6, 21, 2}));
-// for (int i = 0; i < (int) resources.get("generations"); i++) {
-//
-// resources.set("currentGen", ((int) resources.get("currentGen")) + 1);
-//
-// fitnessFunction.evaluate(population, resources);
-// evolutionaryAlgorithm.evolve(population, mutator, resources);
-//
-// System.out.println("fitness: " + evolutionaryAlgorithm.getFittestChromosome().getFitness());
-//
-// if (evolutionaryAlgorithm.getFittestChromosome().getFitness() >= 6) {
-// System.out.println("solution found");
-// evolutionaryAlgorithm.getFittestChromosome().printNodes();
-// break;
-// }
-// }
+
+ }
+
+
+ public void remakePopulation() {
+ population = new Population(resources);
}
@@ -342,23 +415,22 @@ public class JCGP {
}
public void nextGeneration() {
- resources.set("currentGen", resources.getInt("currentGen") + 1);
fitnessFunction.evaluate(population, resources);
evolutionaryAlgorithm.evolve(population, mutator, resources);
if (evolutionaryAlgorithm.getFittestChromosome().getFitness() >= 6) {
- System.out.println("solution found");
+ resources.println("solution found");
evolutionaryAlgorithm.getFittestChromosome().printNodes();
} else {
- System.out.println("Generation: " + resources.getInt("currentGen") + ", fitness: " + evolutionaryAlgorithm.getFittestChromosome().getFitness());
+ resources.println("Generation: " + resources.getInt("currentGen") + ", fitness: " + evolutionaryAlgorithm.getFittestChromosome().getFitness());
}
+ resources.set("currentGen", resources.getInt("currentGen") + 1);
}
public void start() {
while (resources.getInt("currentGen") <= resources.getInt("generations")) {
nextGeneration();
}
- // TODO print something?
- }
+ }
}