aboutsummaryrefslogtreecommitdiffstats
path: root/src/jcgp/backend/modules/mutator/PercentPointMutator.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jcgp/backend/modules/mutator/PercentPointMutator.java')
-rw-r--r--src/jcgp/backend/modules/mutator/PercentPointMutator.java73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/jcgp/backend/modules/mutator/PercentPointMutator.java b/src/jcgp/backend/modules/mutator/PercentPointMutator.java
new file mode 100644
index 0000000..4057027
--- /dev/null
+++ b/src/jcgp/backend/modules/mutator/PercentPointMutator.java
@@ -0,0 +1,73 @@
+package jcgp.backend.modules.mutator;
+
+import jcgp.backend.resources.Resources;
+import jcgp.backend.resources.parameters.BooleanParameter;
+import jcgp.backend.resources.parameters.DoubleParameter;
+import jcgp.backend.resources.parameters.IntegerParameter;
+import jcgp.backend.resources.parameters.Parameter;
+import jcgp.backend.resources.parameters.ParameterStatus;
+
+/**
+ * Percent point mutator
+ * <br><br>
+ * This operator calculates how many genes to mutate based on the mutation rate
+ * parameter. The total number of genes is computed from the number of nodes,
+ * the arity and the number of outputs. It then uses the point mutation
+ * algorithm to perform the required number of mutations.
+ *
+ *
+ * @see PointMutator
+ * @author Eduardo Pedroni
+ *
+ */
+public class PercentPointMutator extends PointMutator {
+
+ private DoubleParameter mutationRate;
+ private IntegerParameter genesMutated;
+ private BooleanParameter report;
+
+ /**
+ * Creates a new instance of PointMutator.
+ *
+ * @param resources a reference to the experiment's resources.
+ */
+ public PercentPointMutator(final Resources resources) {
+ mutationRate = new DoubleParameter(10, "Percent mutation", false, false) {
+ @Override
+ public void validate(Number newValue) {
+ genesMutated.set((int) ((newValue.intValue()) * (((((double) resources.nodes() + resources.outputs()))) / 100)));
+ if (newValue.doubleValue() <= 0 || newValue.doubleValue() > 100) {
+ status = ParameterStatus.INVALID;
+ status.setDetails("Mutation rate must be > 0 and <= 100");
+ } else if (genesMutated.get() <= 0) {
+ status = ParameterStatus.WARNING;
+ status.setDetails("With mutation rate " + mutationRate.get() + ", 0 genes will be mutated.");
+ } else {
+ status = ParameterStatus.VALID;
+ }
+ }
+ };
+ genesMutated = new IntegerParameter(0, "Genes mutated", true, false) {
+ @Override
+ public void validate(Number newValue) {
+ // blank
+ }
+ };
+ report = new BooleanParameter(false, "Report") {
+ @Override
+ public void validate(Boolean newValue) {
+ // blank
+ }
+ };
+ }
+
+ @Override
+ public Parameter<?>[] getLocalParameters() {
+ return new Parameter[] {mutationRate, genesMutated, report};
+ }
+
+ @Override
+ public String toString() {
+ return "Percent point mutation";
+ }
+}