/* Copyright 2006 by Sean Luke Licensed under the Academic Free License version 3.0 See the file "LICENSE" for more information */ package ec; import ec.util.ParamClassLoadException; import ec.util.Parameter; import ec.eval.MasterProblem; /* * Evaluator.java * * Created: Tue Aug 10 20:53:30 1999 * By: Sean Luke */ /** * An Evaluator is a singleton object which is responsible for the * evaluation process during the course of an evolutionary run. Only * one Evaluator is created in a run, and is stored in the EvolutionState * object. * *

Evaluators typically do their work by applying an instance of some * subclass of Problem to individuals in the population. Evaluators come * with a Problem prototype which they may clone as necessary to create * new Problem spaces to evaluate individuals in (Problems may be reused * to prevent constant cloning). * *

Evaluators may be multithreaded, with one Problem instance per thread * usually. The number of threads they may spawn (excepting a parent * "gathering" thread) is governed by the EvolutionState's evalthreads value. * *

Be careful about spawning threads -- this system has no few synchronized * methods for efficiency's sake, so you must either divvy up evaluation in * a thread-safe fashion, or * otherwise you must obtain the appropriate locks on individuals in the population * and other objects as necessary. *

Parameters
base.problem
classname, inherits and != ec.Problem
(the class for the Problem prototype p_problem)
base.masterproblem
classname, inherits
(the class for the MasterProblem prototype masterproblem)
* @author Sean Luke * @version 1.0 */ public abstract class Evaluator implements Singleton { public static final String P_PROBLEM = "problem"; public Problem p_problem; public static final String P_MASTERPROBLEM = "masterproblem"; public static final String P_IAMSLAVE = "i-am-slave"; /** Evaluates the fitness of an entire population. You will have to determine how to handle multiple threads on your own, as this is a very domain-specific thing. */ public abstract void evaluatePopulation(final EvolutionState state); /** Returns true if an ideal individual has been found or some other run result has shortcircuited the run so that it should end prematurely right now. */ public abstract boolean runComplete(final EvolutionState state); public void setup(final EvolutionState state, final Parameter base) { // Load my problem p_problem = (Problem)(state.parameters.getInstanceForParameter( base.push(P_PROBLEM),null,Problem.class)); p_problem.setup(state,base.push(P_PROBLEM)); /* // Check to see if this process is configured to be a master problem server // If so, don't bother creating and setting up the master problem. String masterServerName = state.parameters.getString(new Parameter(P_EVALSLAVENAME)); if (masterServerName == null) { */ // Am I a master problem and NOT a slave. Note that the "eval.i-am-slave" parameter // is not set by the user but rather programmatically by the Slave.java class if( state.parameters.exists(base.push(P_MASTERPROBLEM),null) && // I am a master (or possibly a slave -- same params) !state.parameters.getBoolean(base.push(P_IAMSLAVE),null,false)) // I am NOT a slave { try { Problem masterproblem = (Problem)(state.parameters.getInstanceForParameter( base.push(P_MASTERPROBLEM),null,Problem.class)); masterproblem.setup(state,base.push(P_MASTERPROBLEM)); /* * If a MasterProblem was specified, interpose it between the * evaluator and the real problem. This allows seamless use * of the master problem. */ ((MasterProblem)masterproblem).problem = p_problem; p_problem = masterproblem; } catch(ParamClassLoadException e) { state.output.fatal("Parameter has an invalid value: "+base.push(P_MASTERPROBLEM)); } } /* } */ } /** Called to set up remote evaluation network contacts when the run is started. Mostly used for client/server evaluation (see MasterProblem). By default calls p_problem.initializeContacts(state) */ public void initializeContacts(EvolutionState state) { p_problem.initializeContacts(state); } /** Called to reinitialize remote evaluation network contacts when the run is restarted from checkpoint. Mostly used for client/server evaluation (see MasterProblem). By default calls p_problem.reinitializeContacts(state) */ public void reinitializeContacts(EvolutionState state) { p_problem.reinitializeContacts(state); } /** Called to shut down remote evaluation network contacts when the run is completed. Mostly used for client/server evaluation (see MasterProblem). By default calls p_problem.closeContacts(state,result) */ public void closeContacts(EvolutionState state, int result) { p_problem.closeContacts(state,result); } }