// Algorithm.java // // Authors: // Antonio J. Nebro <antonio@lcc.uma.es> // Juan J. Durillo <durillo@lcc.uma.es> //// // Copyright (c) 2011 Antonio J. Nebro, Juan J. Durillo // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. package jmetal.core ; import jmetal.util.JMException; import java.io.Serializable; import java.util.HashMap; import java.util.Map; /** * This class implements a generic template for the algorithms developed in * jMetal. Every algorithm must have a mapping between the parameters and * and their names, and another mapping between the operators and their names. * The class declares an abstract method called <code>execute</code>, which * defines the behavior of the algorithm. */ public abstract class Algorithm implements Serializable { /** * Stores the problem to solve */ protected Problem problem_; /** * Stores the operators used by the algorithm, such as selection, crossover, * etc. */ protected Map<String,Operator> operators_ = null; /** * Stores algorithm specific parameters. For example, in NSGA-II these * parameters include the population size and the maximum number of function * evaluations. */ protected Map<String,Object> inputParameters_ = null; /** * Stores output parameters, which are retrieved by Main object to * obtain information from an algorithm. */ private Map<String,Object> outPutParameters_ = null; /** * Constructor * @param problem The problem to be solved */ public Algorithm(Problem problem) { problem_ = problem ; } /** * Launches the execution of an specific algorithm. * @return a <code>SolutionSet</code> that is a set of non dominated solutions * as a result of the algorithm execution */ public abstract SolutionSet execute() throws JMException, ClassNotFoundException ; /** * Offers facilities for add new operators for the algorithm. To use an * operator, an algorithm has to obtain it through the * <code>getOperator</code> method. * @param name The operator name * @param operator The operator */ public void addOperator(String name, Operator operator){ if (operators_ == null) { operators_ = new HashMap<String,Operator>(); } operators_.put(name,operator); } // addOperator /** * Gets an operator through his name. If the operator doesn't exist or the name * is wrong this method returns null. The client of this method have to check * the result of the method. * @param name The operator name * @return The operator if exists, null in another case. */ public Operator getOperator(String name){ return operators_.get(name); } // getOperator /** * Sets an input parameter to an algorithm. Typically, * the method is invoked by a Main object before running an algorithm. * The parameters have to been inserted using their name to access them through * the <code>getInputParameter</code> method. * @param name The parameter name * @param object Object that represent a parameter for the * algorithm. */ public void setInputParameter(String name, Object object){ if (inputParameters_ == null) { inputParameters_ = new HashMap<String,Object>(); } inputParameters_.put(name,object); } // setInputParameter /** * Gets an input parameter through its name. Typically, * the method is invoked by an object representing an algorithm * @param name The parameter name * @return Object representing the parameter or null if the parameter doesn't * exist or the name is wrong */ public Object getInputParameter(String name){ return inputParameters_.get(name); } // getInputParameter /** * Sets an output parameter that can be obtained by invoking * <code>getOutputParame</code>. Typically this algorithm is invoked by an * algorithm at the end of the <code>execute</code> to retrieve output * information * @param name The output parameter name * @param object Object representing the output parameter */ public void setOutputParameter(String name, Object object) { if (outPutParameters_ == null) { outPutParameters_ = new HashMap<String,Object>(); } outPutParameters_.put(name,object); } // setOutputParameter /** * Gets an output parameter through its name. Typically, * the method is invoked by a Main object after the execution of an algorithm. * @param name The output parameter name * @return Object representing the output parameter, or null if the parameter * doesn't exist or the name is wrong. */ public Object getOutputParameter(String name) { if (outPutParameters_ != null) return outPutParameters_.get(name); else return null ; } // getOutputParameter /** * Returns the problem to solve * @return Problem The problem to solve */ public Problem getProblem() { return problem_ ; } } // Algorithm