From 02fd2bc7059da416937beb1abe67e5ca60379030 Mon Sep 17 00:00:00 2001 From: Eduardo Pedroni Date: Tue, 1 Apr 2014 23:00:53 +0100 Subject: Settings pane now actually controls the parameters, not much left to do. --- src/jcgp/JCGP.java | 170 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 121 insertions(+), 49 deletions(-) (limited to 'src/jcgp/JCGP.java') 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() { + @Override + public void changed( + ObservableValue 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? - } + } } -- cgit v1.2.3