Class AbstractAlgorithm

java.lang.Object
org.moeaframework.algorithm.AbstractAlgorithm
All Implemented Interfaces:
Algorithm, Stateful
Direct Known Subclasses:
AbstractEvolutionaryAlgorithm, AbstractPSOAlgorithm, AbstractSimulatedAnnealingAlgorithm, CMAES, MOEAD, RandomSearch, RepeatedSingleObjective

public abstract class AbstractAlgorithm extends Object implements Algorithm
Abstract class providing default implementations for several Algorithm methods.

When creating a new subclass, one should:

  1. Use the evaluate(org.moeaframework.core.Solution) or evaluateAll(java.lang.Iterable<org.moeaframework.core.Solution>) methods provided by this class. Do not call Problem.evaluate(org.moeaframework.core.Solution) directly as that will not count the number of function evaluations correctly.
  2. When possible, prefer evaluating all solutions at once by calling evaluateAll(java.lang.Iterable<org.moeaframework.core.Solution>). Doing so allows function evaluations to run in parallel when enabled (see Executor#distributeOnAllCores()).
  3. Implement the algorithm by overriding the initialize() and iterate() methods.
  • Field Details

    • problem

      protected final Problem problem
      The problem being solved.
    • numberOfEvaluations

      protected int numberOfEvaluations
      The number of times the evaluate(org.moeaframework.core.Solution) method was invoked.
    • initialized

      protected boolean initialized
      true if the initialize() method has been invoked; false otherwise.
    • terminated

      protected boolean terminated
      true if the terminate() method has been invoked; false otherwise.
  • Constructor Details

    • AbstractAlgorithm

      public AbstractAlgorithm(Problem problem)
      Constructs an abstract algorithm for solving the specified problem.
      Parameters:
      problem - the problem being solved
  • Method Details

    • evaluateAll

      public void evaluateAll(Iterable<Solution> solutions)
      Evaluates the specified solutions. This method calls evaluate(Solution) on each of the solutions. Subclasses should prefer calling this method over evaluate whenever possible, as this ensures the solutions can be evaluated in parallel.
      Parameters:
      solutions - the solutions to evaluate
    • evaluateAll

      public void evaluateAll(Solution[] solutions)
      Evaluates the specified solutions. This method is equivalent to evaluateAll(Arrays.asList(solutions)).
      Parameters:
      solutions - the solutions to evaluate
    • evaluate

      public void evaluate(Solution solution)
      Description copied from interface: Algorithm
      Evaluates the specified solution for the problem being solved by this algorithm.
      Specified by:
      evaluate in interface Algorithm
      Parameters:
      solution - the solution to be evaluated
      See Also:
    • getNumberOfEvaluations

      public int getNumberOfEvaluations()
      Description copied from interface: Algorithm
      Returns the number of times the evaluate method was invoked. This is the primary measure of runtime for optimization algorithms.
      Specified by:
      getNumberOfEvaluations in interface Algorithm
      Returns:
      the number of times the evaluate method was invoked
    • getProblem

      public Problem getProblem()
      Description copied from interface: Algorithm
      Returns the problem being solved by this algorithm.
      Specified by:
      getProblem in interface Algorithm
      Returns:
      the problem being solved by this algorithm
    • initialize

      protected void initialize()
      Performs any initialization that is required by this algorithm. This method is called automatically on the first invocation of step(). Implementations should always invoke super.initialize() to ensure the algorithm is initialized correctly.
      Throws:
      AlgorithmInitializationException - if the algorithm has already been initialized
    • isInitialized

      public boolean isInitialized()
      Returns true if the initialize() method has been invoked; false otherwise.
      Returns:
      true if the initialize() method has been invoked; false otherwise
    • assertNotInitialized

      public void assertNotInitialized()
      Throws an exception if the algorithm is initialized. Use this anywhere to check and fail if the algorithm is already initialized.
      Throws:
      AlgorithmInitializationException - if the algorithm is initialized
    • step

      public void step()
      This method first checks if the algorithm is initialized. If not, the initialize() method is invoked. Once initialized, all subsequent calls to step invoke iterate(). Implementations should override the initialize and iterate methods in preference to modifying this method.
      Specified by:
      step in interface Algorithm
      Throws:
      AlgorithmTerminationException - if the algorithm has already terminated
    • iterate

      protected abstract void iterate()
      Performs one iteration of the algorithm. This method should be overridden by implementations to perform each logical iteration of the algorithm.
    • isTerminated

      public boolean isTerminated()
      Description copied from interface: Algorithm
      Returns true if this algorithm is terminated; false otherwise.
      Specified by:
      isTerminated in interface Algorithm
      Returns:
      true if this algorithm is terminated; false otherwise
      See Also:
    • terminate

      public void terminate()
      Implementations should always invoke super.terminate() to ensure the hierarchy is terminated correctly.
      Specified by:
      terminate in interface Algorithm
      Throws:
      AlgorithmTerminationException - if the algorithm has already terminated
    • saveState

      public void saveState(ObjectOutputStream stream) throws IOException
      Description copied from interface: Stateful
      Writes the state of this object to the stream. The order that objects are written to the stream is important. We recommend first calling super.saveState(stream) followed by writing each field.
      Specified by:
      saveState in interface Stateful
      Parameters:
      stream - the stream
      Throws:
      IOException - if an I/O error occurred
    • loadState

      public void loadState(ObjectInputStream stream) throws IOException, ClassNotFoundException
      Description copied from interface: Stateful
      Loads the state of this object from the stream. The order for reading objects from the stream must match the order they are written to the stream in Stateful.saveState(ObjectOutputStream).
      Specified by:
      loadState in interface Stateful
      Parameters:
      stream - the stream
      Throws:
      IOException - if an I/O error occurred
      ClassNotFoundException - if the stream referenced a class that is not defined