From 726a3cc6bf6353332b1bbf0ddf5c0b10d57e2030 Mon Sep 17 00:00:00 2001 From: Marcel Kronfeld Date: Mon, 17 Jan 2011 13:30:34 +0000 Subject: [PATCH] Added an abstraction over individual initialization methods. --- .../go/individuals/AbstractEAIndividual.java | 20 ++- .../initialization/DefaultInitialization.java | 32 +++++ .../GAInitializeSegmentwise.java | 125 ++++++++++++++++++ .../InterfaceInitialization.java | 31 +++++ src/eva2/tools/math/RNG.java | 6 + 5 files changed, 212 insertions(+), 2 deletions(-) create mode 100644 src/eva2/server/go/operators/initialization/DefaultInitialization.java create mode 100644 src/eva2/server/go/operators/initialization/GAInitializeSegmentwise.java create mode 100644 src/eva2/server/go/operators/initialization/InterfaceInitialization.java diff --git a/src/eva2/server/go/individuals/AbstractEAIndividual.java b/src/eva2/server/go/individuals/AbstractEAIndividual.java index a4e283c0..622c3712 100644 --- a/src/eva2/server/go/individuals/AbstractEAIndividual.java +++ b/src/eva2/server/go/individuals/AbstractEAIndividual.java @@ -13,6 +13,8 @@ import eva2.server.go.individuals.codings.gp.InterfaceProgram; import eva2.server.go.operators.constraint.InterfaceConstraint; import eva2.server.go.operators.crossover.InterfaceCrossover; import eva2.server.go.operators.crossover.NoCrossover; +import eva2.server.go.operators.initialization.DefaultInitialization; +import eva2.server.go.operators.initialization.InterfaceInitialization; import eva2.server.go.operators.mutation.InterfaceMutation; import eva2.server.go.operators.mutation.NoMutation; import eva2.server.go.populations.Population; @@ -58,7 +60,9 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java. protected double m_MutationProbability = 0.2; protected InterfaceMutation m_MutationOperator = new NoMutation(); protected InterfaceCrossover m_CrossoverOperator = new NoCrossover(); -// protected String[] m_Identifiers = new String[m_ObjectIncrement]; + protected InterfaceInitialization m_InitOperator = new DefaultInitialization(); + + // protected String[] m_Identifiers = new String[m_ObjectIncrement]; // protected Object[] m_Objects = new Object[m_ObjectIncrement]; protected HashMap m_dataHash = new HashMap(); @@ -148,6 +152,7 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java. m_Marked = individual.m_Marked; m_isPenalized = individual.m_isPenalized; individualIndex = individual.individualIndex; + m_InitOperator = individual.m_InitOperator.clone(); if (individual.parentIDs != null) { parentIDs = new Long[individual.parentIDs.length]; System.arraycopy(individual.parentIDs, 0, parentIDs, 0, parentIDs.length); @@ -271,7 +276,8 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java. * @param opt The optimization problem that is to be solved. */ public void init(InterfaceOptimizationProblem opt) { - this.defaultInit(opt); + m_InitOperator.initialize(this, opt); +// this.defaultInit(opt); this.m_MutationOperator.init(this, opt); this.m_CrossoverOperator.init(this, opt); } @@ -815,6 +821,16 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java. return "The chance that crossover occurs."; } + public InterfaceInitialization getInitOperator() { + return m_InitOperator; + } + public void setInitOperator(InterfaceInitialization mInitOperator) { + m_InitOperator = mInitOperator; + } + public String initOperatorTipText() { + return "An initialization method for the individual"; + } + /** This method allows you to store an arbitrary value under an arbitrary * name. * @param name The identifying name. diff --git a/src/eva2/server/go/operators/initialization/DefaultInitialization.java b/src/eva2/server/go/operators/initialization/DefaultInitialization.java new file mode 100644 index 00000000..a05dad5c --- /dev/null +++ b/src/eva2/server/go/operators/initialization/DefaultInitialization.java @@ -0,0 +1,32 @@ +package eva2.server.go.operators.initialization; + +import eva2.server.go.individuals.AbstractEAIndividual; +import eva2.server.go.problems.InterfaceOptimizationProblem; + +/** + * A dummy initialization method which only calls the default init method of the individual. + * + * @author mkron + * + */ +public class DefaultInitialization implements InterfaceInitialization, java.io.Serializable { + private static final long serialVersionUID = 1L; + + public DefaultInitialization() {} + + public void initialize(AbstractEAIndividual indy, InterfaceOptimizationProblem problem) { + indy.defaultInit(problem); + } + + public InterfaceInitialization clone() { + return new DefaultInitialization(); + } + + public String getName() { + return "DefaultInitialization"; + } + + public String globalInfo() { + return "Uses the standard initialization of the individual implementation"; + } +} diff --git a/src/eva2/server/go/operators/initialization/GAInitializeSegmentwise.java b/src/eva2/server/go/operators/initialization/GAInitializeSegmentwise.java new file mode 100644 index 00000000..d33facd7 --- /dev/null +++ b/src/eva2/server/go/operators/initialization/GAInitializeSegmentwise.java @@ -0,0 +1,125 @@ +package eva2.server.go.operators.initialization; + +import java.util.BitSet; + +import eva2.server.go.individuals.AbstractEAIndividual; +import eva2.server.go.individuals.InterfaceGAIndividual; +import eva2.server.go.problems.InterfaceOptimizationProblem; +import eva2.tools.EVAERROR; +import eva2.tools.math.RNG; + +/** + * An initialization method which sets a fixed number of bits per segment, + * where a segment is a connected subsequence of the genotype. + * This is usable for GA individuals only. + * + * The initialization may be parameterized in two ways, where each takes a fixed + * segment length s. Firstly, a fixed number of bits (k<=s) is set per segment, + * so each segment has equal cardinality. + * Secondly, an int-array can be specified which defines possibly varying k_i for + * each segment i, so different segments may have different cardinaltiy. The array + * must comply to the binary genotype length of the problem. The array definition + * has strict priority over the fixed cardinality definition. + * + * @author mkron + * + */ +public class GAInitializeSegmentwise implements InterfaceInitialization, java.io.Serializable { + protected int[] bitsPerSegmentArray = new int[0]; + private int bitsPerSegment=1; + private int segmentLength=4; + + public GAInitializeSegmentwise() {} + + public GAInitializeSegmentwise(GAInitializeSegmentwise o) { + bitsPerSegment = o.bitsPerSegment; + segmentLength = o.segmentLength; + if (o.bitsPerSegmentArray!=null) { + bitsPerSegmentArray = new int[o.bitsPerSegmentArray.length]; + System.arraycopy(o.bitsPerSegmentArray, 0, bitsPerSegmentArray, 0, bitsPerSegmentArray.length); + } + } + + public GAInitializeSegmentwise(int segLen, int[] bitsPerSeg) { + segmentLength = segLen; + bitsPerSegmentArray = bitsPerSeg; + } + + public InterfaceInitialization clone() { + return new GAInitializeSegmentwise(this); + } + + @Override + public void initialize(AbstractEAIndividual indy, + InterfaceOptimizationProblem problem) { + if (indy instanceof InterfaceGAIndividual) { + InterfaceGAIndividual gaIndy = ((InterfaceGAIndividual)indy); + int genotypeLen = gaIndy.getGenotypeLength(); + BitSet genotype = gaIndy.getBGenotype(); + if (bitsPerSegmentArray==null || (bitsPerSegmentArray.length==0)) { + // regard only a fixed number of bits per segment + for (int i=0; ilength) { + EVAERROR.errorMsgOnce("Error, invalid cardinality " + cardinality + " requested for bit length "+ length +", cardinality will be reduced."); + cardinality=length; + } BitSet bs = new BitSet(length); int[] perm = randomPerm(length); for (int i=0; i