/*
* This file is part of JGAP.
*
* JGAP offers a dual license model containing the LGPL as well as the MPL.
*
* For licensing information please see the file license.txt included with JGAP
* or have a look at the top of class org.jgap.Chromosome which representatively
* includes the JGAP license policy applicable for any file delivered with JGAP.
*/
package examples.grid.fitnessDistributed;
import org.homedns.dade.jcgrid.client.*;
import org.jgap.*;
import org.jgap.distr.grid.*;
/**
* Sample implementation of a strategy for evolving a generation on the client.
*
* @author Klaus Meffert
* @since 3.2
*/
public class ClientEvolveStrategy
implements IClientEvolveStrategy {
/** String containing the CVS revision. Read out via reflection!*/
public final static String CVS_REVISION = "$Revision: 1.3 $";
// private GridClient m_gc;
private Configuration m_config;
private IClientFeedback m_clientFeedback;
private final int m_maxEvolutions = 3;
private Population m_pop;
/**
* Default constructor is necessary here as it will be called dynamically!
* Don't declare any other constructor as it will not be called!
*/
public ClientEvolveStrategy() {
}
/**
* Called at the very beginning and only once before distributed evolution
* starts.
*
* @param a_gc GridClient
* @param a_config Configuration
* @param a_clientFeedback IClientFeedback
* @throws Exception
*
* @author Klaus Meffert
* @since 3.2
*/
public void initialize(GridClient a_gc, Configuration a_config,
IClientFeedback a_clientFeedback)
throws Exception {
m_clientFeedback = a_clientFeedback;
m_config = a_config;
// m_gc = a_gc;
// Initialize population randomly.
// -------------------------------
Genotype gen = Genotype.randomInitialGenotype(a_config);
m_pop = gen.getPopulation();
}
public void afterWorkRequestsSent()
throws Exception {
m_pop = new Population(m_config, m_config.getPopulationSize());
}
public boolean isEvolutionFinished(int a_evolutionsDone) {
// Do the complete evolution cycle 3 times.
// ----------------------------------------
if (a_evolutionsDone > m_maxEvolutions) {
return true;
}
else {
return false;
}
}
public void onFinished() {
IChromosome best = m_pop.determineFittestChromosome();
m_clientFeedback.info("Best solution evolved: " + best);
}
public void evolve()
throws Exception {
// Do the evolution locally.
// Note: It would be easy to also distribute this task.
// ----------------------------------------------------
Genotype gen = new Genotype(m_config, m_pop);
gen.evolve();
// Get back the evolved population for further evolutions
// (see beginning of the iteration).
// ------------------------------------------------------
m_pop = gen.getPopulation();
}
public JGAPRequest[] generateWorkRequests(JGAPRequest m_workReq,
IRequestSplitStrategy m_splitStrategy, Object data)
throws Exception {
// Calculate fitness values of chromosomes.
// Let each worker compute one fitness value.
// ------------------------------------------
JGAPRequest[] workList;
m_workReq.setPopulation(m_pop);
workList = m_splitStrategy.split(m_workReq);
return workList;
}
public void resultReceived(JGAPResult a_result)
throws Exception {
m_pop.addChromosomes(a_result.getPopulation());
}
}