package bsearch.representations; import java.util.LinkedHashMap; import org.nlogo.util.MersenneTwisterFast; import bsearch.space.SearchSpace; /** * A dummy Chromosome, it just acts as a container for a set of parameter-settings. * Evolution algorithms should not use this Chromosome type for evolution -- * it's just a convenient mechanism for representing a point in the search space * (or potentially outside the bounds/resolution of the search space) * so it can be evaluated using the existing BatchModel running infrastructure. */ public strictfp class DummyChromosome implements Chromosome { SearchSpace searchSpace; LinkedHashMap<String,Object> paramSettings; public DummyChromosome( SearchSpace searchSpace, LinkedHashMap<String,Object> paramSettings) { this.searchSpace = searchSpace; this.paramSettings = paramSettings; } public LinkedHashMap<String,Object> getParamSettings() { return paramSettings; } @Override public DummyChromosome clone() { return new DummyChromosome(searchSpace,new LinkedHashMap<String,Object>(paramSettings)); } public DummyChromosome mutate(double mutRate, MersenneTwisterFast rng) { throw new IllegalStateException("Can't evolve DummyChromosome!"); } public Chromosome[] crossoverWith(Chromosome other, MersenneTwisterFast rng) { throw new IllegalStateException("Can't evolve DummyChromosome!"); } /** Note: Depending on how the DummyChromosome was constructed, it may or may not * represent a point in this search space. */ public SearchSpace getSearchSpace() { return searchSpace; } /** * Redefine equality for DummyChromosomes. * Two chromosomes are considered equal if they represent the same parameter values. */ public boolean equals(Object other) { if (other instanceof DummyChromosome) { DummyChromosome dc = (DummyChromosome) other; return paramSettings.equals(dc.paramSettings); } return false; } /** * Reflects the redefined equals(Object) method, and it * should provide more efficient hashing for Chromosome keys in hashmaps. */ @Override public int hashCode() { int hashCode = 0; for (Object o: paramSettings.values()) { hashCode = hashCode + o.hashCode(); } return hashCode; } }