diff options
Diffstat (limited to 'src/jcgp/backend/modules/mutator/PointMutator.java')
-rw-r--r-- | src/jcgp/backend/modules/mutator/PointMutator.java | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/src/jcgp/backend/modules/mutator/PointMutator.java b/src/jcgp/backend/modules/mutator/PointMutator.java index 0223a37..9e421c2 100644 --- a/src/jcgp/backend/modules/mutator/PointMutator.java +++ b/src/jcgp/backend/modules/mutator/PointMutator.java @@ -24,48 +24,57 @@ public abstract class PointMutator extends Mutator { protected IntegerParameter genesMutated; protected BooleanParameter report; + + /** + * For internal use only, initialises the resources field. + * + * @param resources the experiment's resources. + */ + protected PointMutator(Resources resources) { + super(resources); + } @Override - public void mutate(Chromosome chromosome, Resources resources) { - if (report.get()) resources.reportln("[Mutator] Number of mutations to be performed: " + genesMutated.get()); + public void mutate(Chromosome chromosome) { + if (report.get()) getResources().reportln("[Mutator] Number of mutations to be performed: " + genesMutated.get()); // for however many genes must be mutated for (int i = 0; i < genesMutated.get(); i++) { MutableElement m = chromosome.getRandomMutableElement(); - if (report.get()) resources.report("[Mutator] Mutation " + i + " selected " + m + ", "); + if (report.get()) getResources().report("[Mutator] Mutation " + i + " selected " + m + ", "); // outputs and nodes are mutated differently if (m instanceof Output) { - if (report.get()) resources.report("changed source from " + ((Output) m).getSource() + " "); + if (report.get()) getResources().report("changed source from " + ((Output) m).getSource() + " "); // outputs are easy, simply set to a different random connection, any will do m.setConnection(0, chromosome.getRandomConnection()); - if (report.get()) resources.reportln("to " + ((Output) m).getSource()); + if (report.get()) getResources().reportln("to " + ((Output) m).getSource()); } else if (m instanceof Node) { /* nodes are more complicated, first we must decide whether to mutate the function * or a connection * we do this by generating a random int between 0 and 1 + arity */ - int geneType = resources.getRandomInt(1 + resources.arity()); + int geneType = getResources().getRandomInt(1 + getResources().arity()); // if the int is less than 1, mutate function, else mutate connections if (geneType < 1) { - if (report.get()) resources.report("changed function from " + ((Node) m).getFunction() + " "); + if (report.get()) getResources().report("changed function from " + ((Node) m).getFunction() + " "); - ((Node) m).setFunction(resources.getRandomFunction()); + ((Node) m).setFunction(getResources().getRandomFunction()); - if (report.get()) resources.reportln("to " + ((Node) m).getFunction()); + if (report.get()) getResources().reportln("to " + ((Node) m).getFunction()); } else { // if we decided to mutate connection, subtract 1 from geneType so it fits into the arity range geneType -= 1; - if (report.get()) resources.report("changed connection " + geneType + " from " + ((Node) m).getConnection(geneType) + " "); + if (report.get()) getResources().report("changed connection " + geneType + " from " + ((Node) m).getConnection(geneType) + " "); m.setConnection(geneType, chromosome.getRandomConnection(((Node) m).getColumn())); - if (report.get()) resources.reportln("to " + ((Node) m).getConnection(geneType)); + if (report.get()) getResources().reportln("to " + ((Node) m).getConnection(geneType)); } } } |