From be15f8880236453de72399d959ea53fd1b0dd38a Mon Sep 17 00:00:00 2001 From: Marcel Kronfeld Date: Mon, 17 Jan 2011 16:03:30 +0000 Subject: [PATCH] Some adaptions and a new GA mutation operator --- .../individuals/GAIndividualBinaryData.java | 1 + .../individuals/GAIndividualIntegerData.java | 2 +- .../crossover/CrossoverGANPoint.java | 6 + .../GAInitializeSegmentwise.java | 1 - .../go/operators/mutation/MutateEAMixer.java | 9 +- .../mutation/MutateGAShiftSubstring.java | 158 ++++++++++++++++++ .../operators/selection/SelectTournament.java | 5 + .../server/go/populations/Population.java | 13 ++ 8 files changed, 192 insertions(+), 3 deletions(-) create mode 100644 src/eva2/server/go/operators/mutation/MutateGAShiftSubstring.java diff --git a/src/eva2/server/go/individuals/GAIndividualBinaryData.java b/src/eva2/server/go/individuals/GAIndividualBinaryData.java index 31dbfc24..e22d61d2 100644 --- a/src/eva2/server/go/individuals/GAIndividualBinaryData.java +++ b/src/eva2/server/go/individuals/GAIndividualBinaryData.java @@ -131,6 +131,7 @@ public class GAIndividualBinaryData extends AbstractEAIndividual implements Inte result += "})\n Value: "; result += "{"; for (int i = 0; i < this.m_GenotypeLength; i++) { + if (i%10==0) result+="|"; if (this.m_Genotype.get(i)) result += "1"; else result += "0"; } diff --git a/src/eva2/server/go/individuals/GAIndividualIntegerData.java b/src/eva2/server/go/individuals/GAIndividualIntegerData.java index 1229aef3..18536fb9 100644 --- a/src/eva2/server/go/individuals/GAIndividualIntegerData.java +++ b/src/eva2/server/go/individuals/GAIndividualIntegerData.java @@ -28,7 +28,7 @@ public class GAIndividualIntegerData extends AbstractEAIndividual implements Int private InterfaceGAIntegerCoding m_IntegerCoding = new GAStandardCodingInteger(); public GAIndividualIntegerData() { - this.m_MutationProbability = 0.1; + this.m_MutationProbability = 0.2; this.m_MutationOperator = new MutateGANBit(); this.m_CrossoverProbability = 0.7; this.m_CrossoverOperator = new CrossoverGANPoint(); diff --git a/src/eva2/server/go/operators/crossover/CrossoverGANPoint.java b/src/eva2/server/go/operators/crossover/CrossoverGANPoint.java index 74dd0caf..782610fe 100644 --- a/src/eva2/server/go/operators/crossover/CrossoverGANPoint.java +++ b/src/eva2/server/go/operators/crossover/CrossoverGANPoint.java @@ -23,6 +23,12 @@ public class CrossoverGANPoint implements InterfaceCrossover, java.io.Serializab public CrossoverGANPoint() { } + + public CrossoverGANPoint(int nPoints) { + this(); + setNumberOfCrossovers(nPoints); + } + public CrossoverGANPoint(CrossoverGANPoint mutator) { this.m_OptimizationProblem = mutator.m_OptimizationProblem; this.m_NumberOfCrossovers = mutator.m_NumberOfCrossovers; diff --git a/src/eva2/server/go/operators/initialization/GAInitializeSegmentwise.java b/src/eva2/server/go/operators/initialization/GAInitializeSegmentwise.java index d33facd7..f1b3e23d 100644 --- a/src/eva2/server/go/operators/initialization/GAInitializeSegmentwise.java +++ b/src/eva2/server/go/operators/initialization/GAInitializeSegmentwise.java @@ -49,7 +49,6 @@ public class GAInitializeSegmentwise implements InterfaceInitialization, java.io return new GAInitializeSegmentwise(this); } - @Override public void initialize(AbstractEAIndividual indy, InterfaceOptimizationProblem problem) { if (indy instanceof InterfaceGAIndividual) { diff --git a/src/eva2/server/go/operators/mutation/MutateEAMixer.java b/src/eva2/server/go/operators/mutation/MutateEAMixer.java index 439310ef..7d27e669 100644 --- a/src/eva2/server/go/operators/mutation/MutateEAMixer.java +++ b/src/eva2/server/go/operators/mutation/MutateEAMixer.java @@ -56,7 +56,14 @@ public class MutateEAMixer implements InterfaceMutation, java.io.Serializable { */ public MutateEAMixer(InterfaceMutation ... mutators) { this.m_Mutators = new PropertyMutationMixer(mutators, true); - this.m_UseSelfAdaption = false; + } + + public MutateEAMixer(InterfaceMutation m1, InterfaceMutation m2) { + this(new InterfaceMutation[] {m1, m2}); + } + + public MutateEAMixer(InterfaceMutation m1, InterfaceMutation m2, InterfaceMutation m3) { + this(new InterfaceMutation[] {m1, m2, m3}); } public MutateEAMixer(MutateEAMixer mutator) { diff --git a/src/eva2/server/go/operators/mutation/MutateGAShiftSubstring.java b/src/eva2/server/go/operators/mutation/MutateGAShiftSubstring.java new file mode 100644 index 00000000..41bed7e1 --- /dev/null +++ b/src/eva2/server/go/operators/mutation/MutateGAShiftSubstring.java @@ -0,0 +1,158 @@ +package eva2.server.go.operators.mutation; + + +import java.util.BitSet; + +import eva2.server.go.individuals.AbstractEAIndividual; +import eva2.server.go.individuals.InterfaceGAIndividual; +import eva2.server.go.populations.Population; +import eva2.server.go.problems.InterfaceOptimizationProblem; +import eva2.tools.math.RNG; + +/** + * Shift a certain substring within the individual. The length and shift distance + * can be predefined or will be selected at random. The shift is performed cyclic. + * + * @author mkron + * + */ +public class MutateGAShiftSubstring implements InterfaceMutation, java.io.Serializable { + + private int m_subStringLength = 0; + private int m_shiftDistance = 0; + + public MutateGAShiftSubstring() { + + } + public MutateGAShiftSubstring(MutateGAShiftSubstring mutator) { + this.m_subStringLength = mutator.m_subStringLength; + this.m_shiftDistance = mutator.m_shiftDistance; + } + + /** This method will enable you to clone a given mutation operator + * @return The clone + */ + public Object clone() { + return new MutateGAShiftSubstring(this); + } + + /** This method allows you to evaluate wether two mutation operators + * are actually the same. + * @param mutator The other mutation operator + */ + public boolean equals(Object mutator) { + if (mutator instanceof MutateGAShiftSubstring) { + MutateGAShiftSubstring mut = (MutateGAShiftSubstring)mutator; + if (this.m_subStringLength != mut.m_subStringLength) return false; + if (this.m_shiftDistance != mut.m_shiftDistance) return false; + return true; + } else return false; + } + + /** This method allows you to init the mutation operator + * @param individual The individual that will be mutated. + * @param opt The optimization problem. + */ + public void init(AbstractEAIndividual individual, InterfaceOptimizationProblem opt) { + + } + + /** + * This method will mutate a given AbstractEAIndividual. If the individual + * doesn't implement InterfaceGAIndividual nothing happens. + * @param individual The individual that is to be mutated + */ + public void mutate(AbstractEAIndividual individual) { +// System.out.println("Before Mutate: " +(individual.getStringRepresentation())); + if (individual instanceof InterfaceGAIndividual) { + BitSet tmpBitSet = (BitSet)((InterfaceGAIndividual)individual).getBGenotype().clone(); + int len = ((InterfaceGAIndividual)individual).getGenotypeLength(); +// System.out.println(tmpBitSet.cardinality()); + int[] substr = selectSubstring(tmpBitSet, len); + int a=substr[0]; + int b=substr[1]; + int d = selectShiftDist(len); +// System.out.println("a, b, d: " + a + " " + b + " " + d); + for (int i = 0; i (binCard, binStdDev)); + this.setInitMethod(PopulationInitMethod.binCardinality); + } + public void hideHideable() { setInitMethod(getInitMethod()); }