package jcgp.modules.mutator; import jcgp.Utilities; import jcgp.parameters.IntegerParameter; import jcgp.parameters.Parameters; import jcgp.population.Chromosome; import jcgp.population.MutableElement; import jcgp.population.Node; import jcgp.population.Output; public class PointMutator implements Mutator { public PointMutator() { Parameters.add("mutRate", new IntegerParameter(10, "Mutation rate")); } @Override public void mutate(Chromosome chromosome) { int mutations = (int) (((int) Parameters.get("mutRate").getValue()) * ((((double) Parameters.get("nodes").getValue()) + ((double) Parameters.get("outputs").getValue())) / 100)); for (int i = 0; i < mutations; i++) { MutableElement m = chromosome.getRandomMutableElement(); if (m instanceof Output) { m.setConnection(chromosome.getRandomConnection()); } else if (m instanceof Node) { int geneType = Utilities.getRandomInt(1 + ((int) Parameters.get("Max arity").getValue())); if (geneType < 1) { ((Node) m).setFunction(Utilities.getRandomFunction()); } else { m.setConnection(chromosome.getRandomConnection(((Node) m).getColumn())); } } } } }