package nl.ru.ai.projects.parrot.ea.evolve;
import java.util.ArrayList;
import nl.ru.ai.projects.parrot.ea.fitness.FitnessDrone;
import nl.ru.ai.projects.parrot.tools.TerminalCondition;
import nl.ru.ai.projects.parrot.tools.TerminatorNumberOfIterations;
import org.jgap.FitnessFunction;
import org.jgap.GeneticOperator;
import org.jgap.Genotype;
import org.jgap.IChromosome;
import org.jgap.InvalidConfigurationException;
import org.jgap.impl.CrossoverOperator;
import org.jgap.impl.MutationOperator;
private EAConfiguration config;
private IChromosome finalChromosome;
public static boolean interrupt = false;
try {
config = new EAConfiguration();
FitnessFunction fitness = new FitnessDrone(config);
GeneticOperator crossover = new CrossoverOperator(config, 0.35d);
GeneticOperator mutation = new MutationOperator(config, 12);
config.addGeneticOperator(crossover);
config.addGeneticOperator(mutation);
config.setFitnessFunction(fitness);
config.setSampleChromosome(Chromosomes.createChromosome(config));
config.setPopulationSize(config.POPULATION_SIZE);
TerminatorNumberOfIterations numberOfIterationsTerminator = new TerminatorNumberOfIterations();
numberOfIterationsTerminator.setNumberOfIterations(config.MAX_EVOLUTIONS);
config.setStopCondition(numberOfIterationsTerminator);
} catch (InvalidConfigurationException e) {
System.err.println("Error in configuration of JGAP. EA did not run");
}
}
try {
Genotype population = Genotype.randomInitialGenotype(config);
IChromosome bestSolutionSoFar = null;
int iteration = 1;
while ( !reachedTerminalCondition() ) {
population.evolve();
bestSolutionSoFar = population.getFittestChromosome();
if ( config.OUTPUT_FITNESS_HISTORY ) {
System.out.println("Best fitness at iteration "+iteration+" is "+bestSolutionSoFar.getFitnessValue());
if ( config.OUTPUT_TIMINGS_ATITERATION!=0 && iteration%config.OUTPUT_TIMINGS_ATITERATION==0 )
displayTimings(bestSolutionSoFar);
}
iteration++;
}
finalChromosome = bestSolutionSoFar;
if ( finalChromosome == null ) {
if ( population.getPopulation().size() > 0 )
finalChromosome = population.getPopulation().getChromosome(0);
}
if ( config.OUTPUT_FITNESS_END )
System.out.println("Fittest individual has a fitness of "+finalChromosome.getFitnessValue());
} catch (InvalidConfigurationException e) {
System.err.println("Error in JGAP configuration while trying to start the evolution. EA did not run");
}
}
if ( finalChromosome == null )
return new Integer[0];
Integer[] timings = new Integer[finalChromosome.size()];
for ( int i=0; i<finalChromosome.size(); i++ )
timings[i] = (Integer)finalChromosome.getGene(i).getAllele();
return timings;
}
return finalChromosome.getFitnessValueDirectly();
}
if ( interrupt )
return true;
ArrayList<TerminalCondition> stopConditions = config.getStopConditions();
for ( int i=0; i<stopConditions.size(); i++ ) {
if ( stopConditions.get(i).terminate() )
return true;
}
return false;
}
System.out.print("Timings: ");
for ( int i=0; i<individual.size(); i++ )
System.out.print((Integer)individual.getGene(i).getAllele()+"; ");
System.out.print("\n");
}
}