/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package geneticmusic.fitness; import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; import java.util.LinkedList; import javax.swing.JOptionPane; import org.jfree.data.xy.XYDataset; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; import org.jgap.FitnessFunction; import org.jgap.IChromosome; /** * * @author davide */ public abstract class AbstractCompositionFitness extends FitnessFunction{ protected LinkedList<CompositionRule> rules ; protected XYSeriesCollection rulesDataset; protected static int chromosomesEvaluated = 0; protected static int currentGeneration = 1; protected HashMap<String,Double> ruleValues; public AbstractCompositionFitness(){ this.ruleValues = new HashMap<String, Double>(); this.rules = new LinkedList<CompositionRule>(); rulesDataset = new XYSeriesCollection(); configRules(); } protected void addRule(CompositionRule rule){ rulesDataset.addSeries(new XYSeries(rule.getName())); rules.add(rule); } public XYSeriesCollection getRuleDataset(){ return rulesDataset; } @Override public double evaluate(IChromosome ic) { chromosomesEvaluated++; double evaluation = 0.0; //apply the rules for(CompositionRule rule : rules){ double currentEval = rule.evaluate(ic); /*** sum the values , calculate the average at the end of the population ***/ double storedEval = 0.0; if(ruleValues.containsKey(rule.getName())) storedEval = ruleValues.get(rule.getName()); ruleValues.put(rule.getName(), storedEval+=currentEval); /****************************************************************************/ evaluation += currentEval; //update evaluation with positive or negative value // System.out.println("rule: "+ rule.getClass().toString()); // System.out.println("value: "+ currentEval); } int populationSize = ic.getConfiguration().getPopulationSize(); if(chromosomesEvaluated == populationSize){//calculate the average for(String rule : ruleValues.keySet())//for each rule; rulesDataset.getSeries(rule).add( currentGeneration, (ruleValues.get(rule) / chromosomesEvaluated) //average classif ); ruleValues = new HashMap<String, Double>(); chromosomesEvaluated = 0; currentGeneration++; } return evaluation; } protected abstract void configRules(); }