package net.sourceforge.jabm.evolution; import net.sourceforge.jabm.agent.Agent; import net.sourceforge.jabm.event.InteractionsFinishedEvent; import net.sourceforge.jabm.event.SimEvent; import net.sourceforge.jabm.event.SimulationStartingEvent; import net.sourceforge.jabm.evolution.FitnessFunction; import net.sourceforge.jabm.report.Report; import org.springframework.beans.factory.annotation.Required; import java.util.HashMap; import java.util.Map; /** * (c) Steve Phelps 2013 */ public class EMAFitnessFunction implements FitnessFunction, Report { protected FitnessFunction baseFitnessFunction; protected HashMap<Agent,Double> fitnesses = new HashMap<Agent,Double>(); protected double alpha; public FitnessFunction getBaseFitnessFunction() { return baseFitnessFunction; } @Required public void setBaseFitnessFunction(FitnessFunction baseFitnessFunction) { this.baseFitnessFunction = baseFitnessFunction; } public double getAlpha() { return alpha; } public void setAlpha(double alpha) { this.alpha = alpha; } @Override public double getFitness(Agent i) { if (fitnesses.containsKey(i)) { return fitnesses.get(i); } else { return 0.0; } } @Override public Map<Object, Number> getVariableBindings() { return null; //To change body of implemented methods use File | Settings | File Templates. } @Override public String getName() { return null; //To change body of implemented methods use File | Settings | File Templates. } @Override public void eventOccurred(SimEvent event) { if (event instanceof SimulationStartingEvent) { initialiseFitnesses((SimulationStartingEvent) event); } else if (event instanceof InteractionsFinishedEvent) { updateFitnesses(); } } protected void updateFitnesses() { for(Agent i: fitnesses.keySet()) { Double existingFitness = getFitness(i); double newFitness = alpha * existingFitness + (1 - alpha) * baseFitnessFunction.getFitness(i); fitnesses.put(i, newFitness); } } protected void initialiseFitnesses(SimulationStartingEvent event) { this.fitnesses = new HashMap<Agent, Double>(); for(Agent agent : event.getSimulation().getPopulation().getAgents()) { this.fitnesses.put(agent, 0.0); } } }