package org.java.evolutionary.sequence; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import ec.EvolutionState; import ec.Individual; import ec.Statistics; import ec.gp.GPIndividual; import ec.util.Parameter; /** * This class is meant for getting plugin for HallOfFame. * By using this we get hook when evaluations are done, we try * to rank the Individuals based on fitness. * It uses size using the parameter hall-of-fame and writes the * top individuals to hall-of-fame-file parameter value file. * This can then be used for interpretation. * @author udaykamath * */ public class StatisticPluginForHallofFame extends Statistics { private HallOfFame hallOfFame; private int sizeOfHallOfFame; private String fileName; public void setup(final EvolutionState state, final Parameter base) { // DO NOT FORGET to call super.setup(...) !! super.setup(state, base); //read the hall of fame count String sizeofHallOfFame = state.parameters.getString(base .push("hall-of-fame"), null); sizeOfHallOfFame = new Integer(sizeofHallOfFame).intValue(); fileName = state.parameters.getString(base .push("hall-of-fame-file"), null); hallOfFame = new HallOfFame(); hallOfFame.setup(fileName); } public void postEvaluationStatistics(final EvolutionState state) { System.out.println("Generation.." + state.generation); //get the individuals Individual[] individuals = state.population.subpops[0].individuals; //now create a map of individuals and fitness Map individualsToFitness = new HashMap(); for(int i=0; i< individuals.length; i++){ individualsToFitness.put((GPIndividual)individuals[i], new Double(individuals[i].fitness.fitness())); } //sort the map Map results = sortByValue(individualsToFitness); GPIndividual[] allInds = results.keySet().toArray(new GPIndividual[0]); int size = sizeOfHallOfFame; if(state.generation == 0) size =6000; hallOfFame.addTopPopulationToHallOfFame(state, allInds, size); } public void finalStatistics(final EvolutionState state, final int result) { hallOfFame.flushToFile(state,fileName); } private Map sortByValue(Map map) { List list = new LinkedList(map.entrySet()); Collections.sort(list, new Comparator() { public int compare(Object o1, Object o2) { double d1 = (Double)((Map.Entry) (o1)).getValue(); double d2 = (Double)((Map.Entry) (o2)).getValue(); int returnval =0; if (d1 < d2) returnval= 1; // Neither val is NaN, thisVal is smaller if (d1 > d2) returnval= -1; // Neither val is NaN, thisVal is larger if(d1 == d2) returnval= 0; return returnval; } }); Map result = new LinkedHashMap(); for (Iterator it = list.iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry)it.next(); result.put((GPIndividual)entry.getKey(), (Double)entry.getValue()); } return result; } }