From 6465afb3e9f92587e3c8b93c91357ba80fac26af Mon Sep 17 00:00:00 2001 From: Fabian Becker Date: Wed, 29 Oct 2014 23:10:47 +0100 Subject: [PATCH] New MaximumTimeTerminator closes #28 - Implements new MaximumTimeTerminator - Bit of cleanup + making some classes final where useful --- src/eva2/gui/PropertySheetPanel.java | 2 +- .../terminators/FitnessValueTerminator.java | 4 +- .../terminators/MaximumTimeTerminator.java | 55 +++++++++++++++++++ src/eva2/problems/WaitForEvARunnable.java | 2 +- .../simple/InterfaceSimpleProblem.java | 1 - .../problems/simple/SimpleProblemBinary.java | 9 ++- .../problems/simple/SimpleProblemDouble.java | 9 ++- src/eva2/tools/math/BayNet.java | 2 +- src/eva2/tools/math/BayNode.java | 2 +- src/eva2/tools/math/RNG.java | 2 +- src/eva2/tools/math/StatisticUtils.java | 3 +- 11 files changed, 71 insertions(+), 20 deletions(-) create mode 100644 src/eva2/optimization/operator/terminators/MaximumTimeTerminator.java diff --git a/src/eva2/gui/PropertySheetPanel.java b/src/eva2/gui/PropertySheetPanel.java index e5031c8e..524f2a9e 100644 --- a/src/eva2/gui/PropertySheetPanel.java +++ b/src/eva2/gui/PropertySheetPanel.java @@ -26,7 +26,7 @@ import java.util.logging.Logger; /** * There are some trick methods interpreted here. Check EvA2Notes.txt. */ -public class PropertySheetPanel extends JPanel implements PropertyChangeListener { +public final class PropertySheetPanel extends JPanel implements PropertyChangeListener { public final static Logger LOGGER = Logger.getLogger(PropertySheetPanel.class.getName()); /** diff --git a/src/eva2/optimization/operator/terminators/FitnessValueTerminator.java b/src/eva2/optimization/operator/terminators/FitnessValueTerminator.java index 893f6c86..22315ec4 100644 --- a/src/eva2/optimization/operator/terminators/FitnessValueTerminator.java +++ b/src/eva2/optimization/operator/terminators/FitnessValueTerminator.java @@ -7,6 +7,7 @@ import eva2.problems.InterfaceOptimizationProblem; import eva2.util.annotation.Description; import java.io.Serializable; +import java.util.Arrays; /** * @@ -63,8 +64,7 @@ public class FitnessValueTerminator implements InterfaceTerminator, */ @Override public String toString() { - String ret = "FitnessValueTerminator,fitnessValue=" + fitnessValue; - return ret; + return "FitnessValueTerminator,fitnessValue=" + Arrays.toString(fitnessValue); } /** diff --git a/src/eva2/optimization/operator/terminators/MaximumTimeTerminator.java b/src/eva2/optimization/operator/terminators/MaximumTimeTerminator.java new file mode 100644 index 00000000..1612ca3d --- /dev/null +++ b/src/eva2/optimization/operator/terminators/MaximumTimeTerminator.java @@ -0,0 +1,55 @@ +package eva2.optimization.operator.terminators; + +import eva2.optimization.population.InterfaceSolutionSet; +import eva2.optimization.population.PopulationInterface; +import eva2.problems.InterfaceOptimizationProblem; +import eva2.util.annotation.Description; +import eva2.util.annotation.Parameter; + +/** + * This terminator stops the optimization after maximumTime seconds have passed. + * + * Note: Actual execution time depends on when the termination criteria is checked + * (usually after a generation has been performed) and on the precision of the system + * clock. Runs will terminate after a minimum of maximumTime seconds. + */ +@Description("Terminate if a maximum time (seconds) was reached.") +public class MaximumTimeTerminator implements InterfaceTerminator { + @Parameter(name = "maxTime", description = "Maximum time in seconds") + private int maximumTime = 5; + + private long startTime; + + @Override + public boolean isTerminated(PopulationInterface pop) { + return (startTime/1000.0) + maximumTime < (System.currentTimeMillis()/1000.0); + } + + @Override + public boolean isTerminated(InterfaceSolutionSet pop) { + return (startTime/1000.0) + maximumTime < (System.currentTimeMillis()/1000.0); + } + + @Override + public String lastTerminationMessage() { + return "Maximum Time of " + maximumTime + " seconds reached"; + } + + @Override + public void initialize(InterfaceOptimizationProblem prob) { + startTime = System.currentTimeMillis(); + } + + @Override + public String toString() { + return "MaximumTimeTerminator,maximumTime=" + maximumTime; + } + + public int getMaximumTime() { + return maximumTime; + } + + public void setMaximumTime(int maximumTime) { + this.maximumTime = maximumTime; + } +} diff --git a/src/eva2/problems/WaitForEvARunnable.java b/src/eva2/problems/WaitForEvARunnable.java index 9d96eee5..57c37cf7 100644 --- a/src/eva2/problems/WaitForEvARunnable.java +++ b/src/eva2/problems/WaitForEvARunnable.java @@ -7,7 +7,7 @@ import eva2.optimization.individuals.AbstractEAIndividual; import java.io.PrintWriter; import java.io.StringWriter; -class WaitForEvARunnable implements Runnable { +final class WaitForEvARunnable implements Runnable { OptimizerRunnable runnable; MatlabProblem mp; diff --git a/src/eva2/problems/simple/InterfaceSimpleProblem.java b/src/eva2/problems/simple/InterfaceSimpleProblem.java index db2a2de7..4c419518 100644 --- a/src/eva2/problems/simple/InterfaceSimpleProblem.java +++ b/src/eva2/problems/simple/InterfaceSimpleProblem.java @@ -4,7 +4,6 @@ package eva2.problems.simple; * A simple interface to easily include new optimization problems in Java into the * EvA framework. */ - public interface InterfaceSimpleProblem { /** * Evaluate a double vector representing a possible problem solution as diff --git a/src/eva2/problems/simple/SimpleProblemBinary.java b/src/eva2/problems/simple/SimpleProblemBinary.java index 9bccb8ad..b6ef3f62 100644 --- a/src/eva2/problems/simple/SimpleProblemBinary.java +++ b/src/eva2/problems/simple/SimpleProblemBinary.java @@ -1,10 +1,9 @@ package eva2.problems.simple; +import eva2.util.annotation.Description; + import java.io.Serializable; import java.util.BitSet; -public abstract class SimpleProblemBinary implements InterfaceSimpleProblem, Serializable { - public static String globalInfo() { - return "A simple binary problem. Override globalInfo() to insert more information."; - } -} \ No newline at end of file +@Description("A simple binary problem. Override globalInfo() to insert more information.") +public abstract class SimpleProblemBinary implements InterfaceSimpleProblem, Serializable { } \ No newline at end of file diff --git a/src/eva2/problems/simple/SimpleProblemDouble.java b/src/eva2/problems/simple/SimpleProblemDouble.java index 65ee7fe4..0a6fdaf2 100644 --- a/src/eva2/problems/simple/SimpleProblemDouble.java +++ b/src/eva2/problems/simple/SimpleProblemDouble.java @@ -1,9 +1,8 @@ package eva2.problems.simple; +import eva2.util.annotation.Description; + import java.io.Serializable; -public abstract class SimpleProblemDouble implements InterfaceSimpleProblem, Serializable { - public static String globalInfo() { - return "A simple double valued problem. Override globalInfo() to insert more information."; - } -} +@Description("A simple double valued problem. Override globalInfo() to insert more information.") +public abstract class SimpleProblemDouble implements InterfaceSimpleProblem, Serializable {} diff --git a/src/eva2/tools/math/BayNet.java b/src/eva2/tools/math/BayNet.java index 89114b23..2c1fa0b4 100644 --- a/src/eva2/tools/math/BayNet.java +++ b/src/eva2/tools/math/BayNet.java @@ -10,7 +10,7 @@ import eva2.tools.Pair; import java.util.*; -public class BayNet { +public final class BayNet { private boolean[][] network = null; private int dimension = 3; diff --git a/src/eva2/tools/math/BayNode.java b/src/eva2/tools/math/BayNode.java index 7bf3c406..b02637e6 100644 --- a/src/eva2/tools/math/BayNode.java +++ b/src/eva2/tools/math/BayNode.java @@ -3,7 +3,7 @@ package eva2.tools.math; import java.util.LinkedList; import java.util.List; -public class BayNode { +public final class BayNode { private int id; private int numberOfParents = 0; diff --git a/src/eva2/tools/math/RNG.java b/src/eva2/tools/math/RNG.java index 3bb93de8..0d5baacf 100644 --- a/src/eva2/tools/math/RNG.java +++ b/src/eva2/tools/math/RNG.java @@ -10,7 +10,7 @@ import java.util.Random; * Random number generator used across all optimizations * for reproducability of runs. */ -public class RNG { +public final class RNG { private static Random random; private static long randomSeed; diff --git a/src/eva2/tools/math/StatisticUtils.java b/src/eva2/tools/math/StatisticUtils.java index 8e6fa9b3..8374ecea 100644 --- a/src/eva2/tools/math/StatisticUtils.java +++ b/src/eva2/tools/math/StatisticUtils.java @@ -1,6 +1,5 @@ package eva2.tools.math; -import eva2.problems.AbstractProblemDouble; import eva2.tools.math.Jama.Matrix; import java.util.ArrayList; @@ -9,7 +8,7 @@ import java.util.Collections; /** * Statistic utils. */ -public class StatisticUtils { +public final class StatisticUtils { /** * The natural logarithm of 2. */