/*
  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 MasterProblem masterproblem = null; 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)); // 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)) // there's a master problem to load { // load the masterproblem so it can be accessed by the Slave as well (even though it's not used in its official capacity) masterproblem = (MasterProblem)(state.parameters.getInstanceForParameter( base.push(P_MASTERPROBLEM),null,Problem.class)); masterproblem.setup(state,base.push(P_MASTERPROBLEM)); if (!state.parameters.getBoolean(base.push(P_IAMSLAVE),null,false)) // I am a master (or possibly a slave -- same params) { //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.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); } }

Ads help maintain this website.