package test;

import org.jgap.Configuration;
import org.jgap.DeltaFitnessEvaluator;
import org.jgap.Gene;
import org.jgap.Genotype;
import org.jgap.IChromosome;
import org.jgap.InvalidConfigurationException;
import org.jgap.impl.DefaultConfiguration;

public class Test1 {
	private static final int VALUE_TO_FOUND = 10000;

	private static final int SIZE = 100;

	public static void main(String[] args) {
		// NB max evolutions
		int numEvolutions = 10000;

		Configuration gaConf = new DefaultConfiguration();
		Configuration.reset();
		gaConf.setFitnessEvaluator(new DeltaFitnessEvaluator()); // Fitness
																	// standard
		gaConf.setPreservFittestIndividual(true); // Elitisme
		gaConf.setKeepPopulationSizeConstant(true);
		Genotype genotype = null;
		try {
			IChromosome sampleChromosome = new CalculChromosome(gaConf, SIZE);
			gaConf.setSampleChromosome(sampleChromosome);
			
			gaConf.setPopulationSize(20); // Population size

			// Cost function
			gaConf.setFitnessFunction(new CalculFitnessFunction(VALUE_TO_FOUND));
			
			genotype = Genotype.randomInitialGenotype(gaConf);
		} catch (InvalidConfigurationException e) {
			e.printStackTrace();
			System.exit(-2);
		}
		int progress = 0;
		int percentEvolution = numEvolutions / 10;
		
		// Evolution LOOP
		for (int i = 0; i < numEvolutions; i++) {
			genotype.evolve();
			if (percentEvolution > 0 && i % percentEvolution == 0) {
				progress++;
				IChromosome fittest = genotype.getFittestChromosome();
				double fitness = fittest.getFitnessValue();
				System.out.println("Generation " + i + ": Currently fittest Chromosome has fitness " + fitness);
				if (fitness < 0.0001) break;
			}
		}
		IChromosome fittest = genotype.getFittestChromosome();
		System.out.println("Fittest Chromosome has fitness " + fittest.getFitnessValue());
		System.err.println(fittest);
		Gene[] genes = fittest.getGenes();
		double d = 0;
		for (Gene gene : genes) {
			Operation op = (Operation) gene.getApplicationData();
			d += op.calcul(d, ((Double) gene.getAllele()));
		}
		System.err.println("Result: " + d);
	}
}
