From 126a1780f38c5fbda802f7be7c175f35d2449bd5 Mon Sep 17 00:00:00 2001 From: Marcel Kronfeld Date: Tue, 23 Feb 2010 08:36:19 +0000 Subject: [PATCH] Added simple initialization range interface (req. change of IndividualInterface); added MutateGAUniform; --- .../@JEInterface/JEInterface.m | 45 ++++++--- src/eva2/server/go/IndividualInterface.java | 9 +- .../go/individuals/AbstractEAIndividual.java | 6 +- .../individuals/ESIndividualBinaryData.java | 19 +--- .../individuals/ESIndividualDoubleData.java | 14 ++- .../individuals/ESIndividualIntegerData.java | 25 ++--- .../ESIndividualPermutationData.java | 22 ++--- .../GAESIndividualBinaryDoubleData.java | 6 +- .../individuals/GAIndividualBinaryData.java | 15 +-- .../individuals/GAIndividualDoubleData.java | 14 +-- .../individuals/GAIndividualIntegerData.java | 17 +--- .../individuals/GAPIndividualProgramData.java | 6 +- .../individuals/GEIndividualProgramData.java | 15 +-- .../individuals/GIIndividualIntegerData.java | 21 ++-- ...IOBGAIndividualIntegerPermutationData.java | 6 +- .../individuals/GPIndividualProgramData.java | 17 +--- .../OBGAIndividualPermutationData.java | 11 +-- .../operators/crossover/CrossoverESPCX.java | 8 +- .../operators/crossover/CrossoverESSBX.java | 6 +- .../operators/crossover/CrossoverESSPX.java | 8 +- .../operators/crossover/CrossoverESUNDX.java | 8 +- .../operators/mutation/MutateGAUniform.java | 97 +++++++++++++++++++ .../go/operators/postprocess/PostProcess.java | 2 +- .../server/go/populations/Population.java | 30 +++--- .../problems/AbstractOptimizationProblem.java | 8 +- src/eva2/server/go/problems/F1Problem.java | 24 ++++- .../go/problems/InterfaceHasInitRange.java | 15 ++- .../server/go/problems/MatlabProblem.java | 48 +++++++-- .../server/go/strategies/FloodAlgorithm.java | 2 +- .../go/strategies/MonteCarloSearch.java | 14 ++- .../strategies/ParticleSwarmOptimization.java | 4 +- .../go/strategies/SimulatedAnnealing.java | 2 +- .../go/strategies/ThresholdAlgorithm.java | 2 +- src/eva2/server/go/strategies/Tribes.java | 2 +- .../go/strategies/tribes/TribesExplorer.java | 2 +- 35 files changed, 328 insertions(+), 222 deletions(-) create mode 100644 src/eva2/server/go/operators/mutation/MutateGAUniform.java diff --git a/resources/MatlabInterface/@JEInterface/JEInterface.m b/resources/MatlabInterface/@JEInterface/JEInterface.m index 9b955694..775f62a6 100644 --- a/resources/MatlabInterface/@JEInterface/JEInterface.m +++ b/resources/MatlabInterface/@JEInterface/JEInterface.m @@ -1,8 +1,9 @@ function int = JEInterface(fhandle, range, varargin) % EvA2 Interface for Matlab % JEInterface(fhandle, range) -% JEInterface(fhandle, range, defaultargs) -% JEInterface(fhandle, range, defaultargs, options...) +% JEInterface(fhandle, range, initRange) +% JEInterface(fhandle, range, initRange, defaultargs) +% JEInterface(fhandle, range, initRange, defaultargs, options...) % % Arguments: % fhandle: a function handle defining the optimization target. @@ -43,6 +44,7 @@ int.resultArr = []; int.f = ''; int.dim = 0; int.range = []; +int.initialRange=[]; int.mp = []; int.msg = ''; int.funCalls = 0; @@ -78,21 +80,42 @@ int = class(int,'JEInterface'); int.opts = makeOptions(int); if (nargin>2) - int.args = varargin{1}; - disp('Fitness function argument: '); disp(int.args); - if (nargin > 3) - if (rem(nargin,2)==0) - error('Invalid number of arguments!'); + int.initialRange=varargin{1}; + + if (isa(varargin{1}, 'double') && (size(varargin{1},1) == 2)) + if (int.dim ~= size(varargin{1},2)) + error('Invalid initial range: wrong dimensions'); end - disp('Reading options:'); - for i=2:2:nargin-2 - int=setOpt(int, varargin{i}, varargin{i+1}); + int.initialRange=transpose(varargin{1}); + s = ['Double valued initial search space: ' mat2str(int.initialRange)]; + disp(s); + end + + if (nargin>3) + int.args = varargin{2}; + disp('Fitness function argument: '); disp(int.args); + if (nargin > 4) + if (rem(nargin,2)==1) + error('Invalid number of arguments!'); + end + disp('Reading options:'); + for i=3:2:nargin-2 + int=setOpt(int, varargin{i}, varargin{i+1}); + end end end end display(getOptions(int)); % finally create the java object -int.mp = eva2.server.go.problems.MatlabProblem(int.dim, int.range); +if (isempty(int.initialRange)) + int.mp = eva2.server.go.problems.MatlabProblem(int.dim, int.range); +else + if (eq(size(int.range), size(int.initialRange))) + int.mp = eva2.server.go.problems.MatlabProblem(int.dim, int.range, int.initialRange); + else + error('Mismatching dimensions of range and initial range!'); + end +end disp('Java object created'); testEvalFunc(int); diff --git a/src/eva2/server/go/IndividualInterface.java b/src/eva2/server/go/IndividualInterface.java index 86da44d0..fd7541d9 100644 --- a/src/eva2/server/go/IndividualInterface.java +++ b/src/eva2/server/go/IndividualInterface.java @@ -1,4 +1,7 @@ package eva2.server.go; + +import eva2.server.go.problems.InterfaceOptimizationProblem; + /* * Title: EvA2 * Description: @@ -62,7 +65,9 @@ public interface IndividualInterface { public void defaultMutate(); /** - * Initialize the genotype randomly, usually in a uniform distribution. + * Initialize the genotype randomly, usually in a uniform distribution. Make sure, + * if the problem has an initial range (it implements InterfaceHasInitialRange), that this + * initial range is used. */ - public void defaultInit(); + public void defaultInit(InterfaceOptimizationProblem prob); } \ No newline at end of file diff --git a/src/eva2/server/go/individuals/AbstractEAIndividual.java b/src/eva2/server/go/individuals/AbstractEAIndividual.java index e338808e..5652fa8f 100644 --- a/src/eva2/server/go/individuals/AbstractEAIndividual.java +++ b/src/eva2/server/go/individuals/AbstractEAIndividual.java @@ -269,7 +269,11 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java. /** This method will allow a default initialisation of the individual * @param opt The optimization problem that is to be solved. */ - public abstract void init(InterfaceOptimizationProblem opt); + public void init(InterfaceOptimizationProblem opt) { + this.defaultInit(opt); + this.m_MutationOperator.init(this, opt); + this.m_CrossoverOperator.init(this, opt); + } /** This method will init the individual with a given value for the * phenotype. diff --git a/src/eva2/server/go/individuals/ESIndividualBinaryData.java b/src/eva2/server/go/individuals/ESIndividualBinaryData.java index a3e3b09f..ef6d3bc6 100644 --- a/src/eva2/server/go/individuals/ESIndividualBinaryData.java +++ b/src/eva2/server/go/individuals/ESIndividualBinaryData.java @@ -5,6 +5,7 @@ import java.util.BitSet; import eva2.server.go.operators.crossover.CrossoverESDefault; import eva2.server.go.operators.mutation.InterfaceMutation; import eva2.server.go.operators.mutation.MutateESGlobal; +import eva2.server.go.problems.InterfaceHasInitRange; import eva2.server.go.problems.InterfaceOptimizationProblem; import eva2.tools.math.RNG; @@ -170,15 +171,6 @@ public class ESIndividualBinaryData extends AbstractEAIndividual implements Inte /************************************************************************************ * AbstractEAIndividual methods */ - /** This method will allow a default initialisation of the individual - * @param opt The optimization problem that is to be solved. - */ - public void init(InterfaceOptimizationProblem opt) { - this.defaultInit(); - this.m_MutationOperator.init(this, opt); - this.m_CrossoverOperator.init(this, opt); - } - /** This method will init the individual with a given value for the * phenotype. * @param obj The initial value for the phenotype @@ -189,7 +181,7 @@ public class ESIndividualBinaryData extends AbstractEAIndividual implements Inte BitSet bs = (BitSet) obj; this.SetBinaryGenotype(bs); } else { - this.defaultInit(); + this.defaultInit(opt); System.out.println("Initial value for ESIndividualBinaryData is no BitSet!"); } this.m_MutationOperator.init(this, opt); @@ -260,10 +252,9 @@ public class ESIndividualBinaryData extends AbstractEAIndividual implements Inte ESIndividualDoubleData.defaultMutate(m_Genotype, m_Range); } - /** This method initializes the double vector - */ - public void defaultInit() { - ESIndividualDoubleData.defaultInit(m_Genotype, m_Range); + public void defaultInit(InterfaceOptimizationProblem prob) { + if (prob instanceof InterfaceHasInitRange && (((InterfaceHasInitRange)prob).getInitRange()!=null)) ESIndividualDoubleData.defaultInit(m_Genotype, (double[][])((InterfaceHasInitRange)prob).getInitRange()); + else ESIndividualDoubleData.defaultInit(m_Genotype, m_Range); } /********************************************************************************************************************** * These are for GUI diff --git a/src/eva2/server/go/individuals/ESIndividualDoubleData.java b/src/eva2/server/go/individuals/ESIndividualDoubleData.java index 636ea171..b3a6599f 100644 --- a/src/eva2/server/go/individuals/ESIndividualDoubleData.java +++ b/src/eva2/server/go/individuals/ESIndividualDoubleData.java @@ -4,6 +4,7 @@ package eva2.server.go.individuals; import eva2.server.go.operators.crossover.CrossoverESDefault; import eva2.server.go.operators.mutation.InterfaceMutation; import eva2.server.go.operators.mutation.MutateESGlobal; +import eva2.server.go.problems.InterfaceHasInitRange; import eva2.server.go.problems.InterfaceOptimizationProblem; import eva2.tools.EVAERROR; import eva2.tools.math.Mathematics; @@ -200,9 +201,7 @@ public class ESIndividualDoubleData extends AbstractEAIndividual implements Inte * @param opt The optimization problem that is to be solved. */ public void init(InterfaceOptimizationProblem opt) { - this.defaultInit(); - this.m_MutationOperator.init(this, opt); - this.m_CrossoverOperator.init(this, opt); + super.init(opt); // evil operators may not respect the range, so at least give some hint if (!Mathematics.isInRange(m_Genotype, m_Range)) EVAERROR.errorMsgOnce("Warning: Individual out of range after initialization (and potential initial crossover/mutation)!"); } @@ -218,7 +217,7 @@ public class ESIndividualDoubleData extends AbstractEAIndividual implements Inte if (bs.length != this.m_Genotype.length) System.out.println("Init value and requested length doesn't match!"); this.SetDoubleGenotype(bs); } else { - this.defaultInit(); + this.defaultInit(opt); System.out.println("Initial value for ESIndividualDoubleData is not double[]!"); } this.m_MutationOperator.init(this, opt); @@ -300,10 +299,9 @@ public class ESIndividualDoubleData extends AbstractEAIndividual implements Inte if (genotype[mutationIndex] > range[mutationIndex][1]) genotype[mutationIndex] = range[mutationIndex][1]; } - /** This method initializes the double vector - */ - public void defaultInit() { - ESIndividualDoubleData.defaultInit(m_Genotype, m_Range); + public void defaultInit(InterfaceOptimizationProblem prob) { + if (prob instanceof InterfaceHasInitRange && (((InterfaceHasInitRange)prob).getInitRange()!=null)) ESIndividualDoubleData.defaultInit(m_Genotype, (double[][])((InterfaceHasInitRange)prob).getInitRange()); + else ESIndividualDoubleData.defaultInit(m_Genotype, m_Range); } /** diff --git a/src/eva2/server/go/individuals/ESIndividualIntegerData.java b/src/eva2/server/go/individuals/ESIndividualIntegerData.java index d2679a9c..03f3b0a6 100644 --- a/src/eva2/server/go/individuals/ESIndividualIntegerData.java +++ b/src/eva2/server/go/individuals/ESIndividualIntegerData.java @@ -1,12 +1,9 @@ package eva2.server.go.individuals; - -import java.util.Arrays; - -import eva2.server.go.IndividualInterface; import eva2.server.go.operators.crossover.CrossoverESDefault; import eva2.server.go.operators.mutation.InterfaceMutation; import eva2.server.go.operators.mutation.MutateESGlobal; +import eva2.server.go.problems.InterfaceHasInitRange; import eva2.server.go.problems.InterfaceOptimizationProblem; import eva2.tools.math.RNG; @@ -187,14 +184,6 @@ public class ESIndividualIntegerData extends AbstractEAIndividual implements Int /************************************************************************************ * AbstractEAIndividual methods */ - /** This method will allow a default initialisation of the individual - * @param opt The optimization problem that is to be solved. - */ - public void init(InterfaceOptimizationProblem opt) { - this.defaultInit(); - this.m_MutationOperator.init(this, opt); - this.m_CrossoverOperator.init(this, opt); - } /** This method will init the individual with a given value for the * phenotype. @@ -207,7 +196,7 @@ public class ESIndividualIntegerData extends AbstractEAIndividual implements Int if (bs.length != this.m_Genotype.length) System.out.println("Init value and requested length doesn't match!"); this.SetIntGenotype(bs); } else { - this.defaultInit(); + this.defaultInit(opt); System.out.println("Initial value for ESIndividualIntegerData is not int[]!"); } this.m_MutationOperator.init(this, opt); @@ -276,11 +265,11 @@ public class ESIndividualIntegerData extends AbstractEAIndividual implements Int return result; } - /** This method initializes the double vector - */ - public void defaultInit() { - for (int i = 0; i < this.m_Genotype.length; i++) { - this.m_Genotype[i] = RNG.randomInt(this.m_Range[i][0], this.m_Range[i][1]); + public void defaultInit(InterfaceOptimizationProblem prob) { + int[][] range = m_Range; + if (prob instanceof InterfaceHasInitRange && (((InterfaceHasInitRange)prob).getInitRange()!=null)) range = (int[][])((InterfaceHasInitRange)prob).getInitRange(); + for (int i = 0; i < this.m_Genotype.length; i++) { + this.m_Genotype[i] = RNG.randomInt(range[i][0], range[i][1]); } } /********************************************************************************************************************** diff --git a/src/eva2/server/go/individuals/ESIndividualPermutationData.java b/src/eva2/server/go/individuals/ESIndividualPermutationData.java index fd924ee9..7316da25 100644 --- a/src/eva2/server/go/individuals/ESIndividualPermutationData.java +++ b/src/eva2/server/go/individuals/ESIndividualPermutationData.java @@ -1,9 +1,9 @@ package eva2.server.go.individuals; -import eva2.server.go.IndividualInterface; import eva2.server.go.operators.crossover.CrossoverESDefault; import eva2.server.go.operators.mutation.InterfaceMutation; import eva2.server.go.operators.mutation.MutateESGlobal; +import eva2.server.go.problems.InterfaceHasInitRange; import eva2.server.go.problems.InterfaceOptimizationProblem; import eva2.tools.math.RNG; @@ -214,14 +214,6 @@ public class ESIndividualPermutationData extends AbstractEAIndividual implements /************************************************************************************ * AbstractEAIndividual methods */ - /** This method will allow a default initialisation of the individual - * @param opt The optimization problem that is to be solved. - */ - public void init(InterfaceOptimizationProblem opt) { - this.defaultInit(); - this.m_MutationOperator.init(this, opt); - this.m_CrossoverOperator.init(this, opt); - } /** This method will init the individual with a given value for the * phenotype. @@ -234,7 +226,7 @@ public class ESIndividualPermutationData extends AbstractEAIndividual implements if (bs.length != this.m_Genotype.length) System.out.println("Init value and requested length doesn't match!"); this.SetPermutationGenotype(bs); } else { - this.defaultInit(); + this.defaultInit(opt); System.out.println("Initial value for ESIndividualPermutationData is not int[]!"); } this.m_MutationOperator.init(this, opt); @@ -325,12 +317,12 @@ public class ESIndividualPermutationData extends AbstractEAIndividual implements } } - /** - * This method initializes the double vector - */ - public void defaultInit() { + public void defaultInit(InterfaceOptimizationProblem prob) { + double[][][] range = m_Range; + if (prob instanceof InterfaceHasInitRange && (((InterfaceHasInitRange)prob).getInitRange()!=null)) range = (double[][][])((InterfaceHasInitRange)prob).getInitRange(); + for (int i = 0; i < this.m_Genotype.length; i++) { - ESIndividualDoubleData.defaultInit(m_Genotype[i], m_Range[i]); + ESIndividualDoubleData.defaultInit(m_Genotype[i], range[i]); } } diff --git a/src/eva2/server/go/individuals/GAESIndividualBinaryDoubleData.java b/src/eva2/server/go/individuals/GAESIndividualBinaryDoubleData.java index ba0e40eb..0b19186d 100644 --- a/src/eva2/server/go/individuals/GAESIndividualBinaryDoubleData.java +++ b/src/eva2/server/go/individuals/GAESIndividualBinaryDoubleData.java @@ -75,9 +75,9 @@ public class GAESIndividualBinaryDoubleData extends AbstractEAIndividual impleme ((AbstractEAIndividual)this.m_BitSet).init(opt); } - public void defaultInit() { - ((AbstractEAIndividual)this.m_Numbers).defaultInit(); - ((AbstractEAIndividual)this.m_BitSet).defaultInit(); + public void defaultInit(InterfaceOptimizationProblem prob) { + ((AbstractEAIndividual)this.m_Numbers).defaultInit(prob); + ((AbstractEAIndividual)this.m_BitSet).defaultInit(prob); } /** This method will init the individual with a given value for the diff --git a/src/eva2/server/go/individuals/GAIndividualBinaryData.java b/src/eva2/server/go/individuals/GAIndividualBinaryData.java index be3249a9..f8a5ed0d 100644 --- a/src/eva2/server/go/individuals/GAIndividualBinaryData.java +++ b/src/eva2/server/go/individuals/GAIndividualBinaryData.java @@ -91,15 +91,6 @@ public class GAIndividualBinaryData extends AbstractEAIndividual implements Inte /************************************************************************************ * AbstractEAIndividual methods */ - /** This method will allow a default initialisation of the individual - * @param opt The optimization problem that is to be solved. - */ - public void init(InterfaceOptimizationProblem opt) { - this.defaultInit(); - this.m_MutationOperator.init(this, opt); - this.m_CrossoverOperator.init(this, opt); - } - /** This method will init the individual with a given value for the * phenotype. * @param obj The initial value for the phenotype @@ -110,7 +101,7 @@ public class GAIndividualBinaryData extends AbstractEAIndividual implements Inte BitSet bs = (BitSet) obj; this.SetBinaryGenotype(bs); } else { - this.defaultInit(); + this.defaultInit(opt); System.out.println("Initial value for GAIndividualBinaryData is no BitSet!"); } this.m_MutationOperator.init(this, opt); @@ -175,9 +166,7 @@ public class GAIndividualBinaryData extends AbstractEAIndividual implements Inte return this.m_GenotypeLength; } - /** This method inits the genotpye of the individual - */ - public void defaultInit() { + public void defaultInit(InterfaceOptimizationProblem prob) { for (int i = 0; i < this.m_GenotypeLength; i++) { if (RNG.flipCoin(0.5)) this.m_Genotype.set(i); else this.m_Genotype.clear(i); diff --git a/src/eva2/server/go/individuals/GAIndividualDoubleData.java b/src/eva2/server/go/individuals/GAIndividualDoubleData.java index de211be9..49b88ef4 100644 --- a/src/eva2/server/go/individuals/GAIndividualDoubleData.java +++ b/src/eva2/server/go/individuals/GAIndividualDoubleData.java @@ -208,14 +208,6 @@ public class GAIndividualDoubleData extends AbstractEAIndividual implements Inte /************************************************************************************ * AbstractEAIndividual methods */ - /** This method will allow a default initialisation of the individual - * @param opt The optimization problem that is to be solved. - */ - public void init(InterfaceOptimizationProblem opt) { - this.defaultInit(); - this.m_MutationOperator.init(this, opt); - this.m_CrossoverOperator.init(this, opt); - } /** This method will init the individual with a given value for the * phenotype. @@ -228,7 +220,7 @@ public class GAIndividualDoubleData extends AbstractEAIndividual implements Inte if (bs.length != this.m_Range.length) System.out.println("Init value and requested length doesn't match!"); this.SetDoubleGenotype(bs); } else { - this.defaultInit(); + this.defaultInit(opt); System.out.println("Initial value for GAIndividualDoubleData is not double[]!"); } this.m_MutationOperator.init(this, opt); @@ -290,9 +282,7 @@ public class GAIndividualDoubleData extends AbstractEAIndividual implements Inte return this.m_GenotypeLength; } - /** This method inits the genotpye of the individual - */ - public void defaultInit() { + public void defaultInit(InterfaceOptimizationProblem prob) { for (int i = 0; i < this.m_GenotypeLength; i++) { if (RNG.flipCoin(0.5)) this.m_Genotype.set(i); else this.m_Genotype.clear(i); diff --git a/src/eva2/server/go/individuals/GAIndividualIntegerData.java b/src/eva2/server/go/individuals/GAIndividualIntegerData.java index b65e1b28..5def6e46 100644 --- a/src/eva2/server/go/individuals/GAIndividualIntegerData.java +++ b/src/eva2/server/go/individuals/GAIndividualIntegerData.java @@ -237,15 +237,6 @@ public class GAIndividualIntegerData extends AbstractEAIndividual implements Int /************************************************************************************ * AbstractEAIndividual methods */ - /** This method will allow a default initialisation of the individual - * @param opt The optimization problem that is to be solved. - */ - public void init(InterfaceOptimizationProblem opt) { - this.defaultInit(); - this.m_MutationOperator.init(this, opt); - this.m_CrossoverOperator.init(this, opt); - } - /** This method will init the individual with a given value for the * phenotype. * @param obj The initial value for the phenotype @@ -257,7 +248,7 @@ public class GAIndividualIntegerData extends AbstractEAIndividual implements Int if (bs.length != this.m_Range.length) System.out.println("Init value and requested length doesn't match!"); this.SetIntGenotype(bs); } else { - this.defaultInit(); + this.defaultInit(opt); System.out.println("Initial value for GAIndividualDoubleData is not double[]!"); } this.m_MutationOperator.init(this, opt); @@ -333,9 +324,7 @@ public class GAIndividualIntegerData extends AbstractEAIndividual implements Int return overallLength; } - /** This method inits the genotpye of the individual - */ - public void defaultInit() { + public void defaultInit(InterfaceOptimizationProblem prob) { int overallLength = 0; for (int i = 0; i < this.m_CodingLenghts.length; i++) overallLength += this.m_CodingLenghts[i]; for (int i = 0; i < overallLength; i++) { @@ -365,7 +354,7 @@ public class GAIndividualIntegerData extends AbstractEAIndividual implements Int } indy.setIntegerDataLength(dimension); indy.SetIntRange(range); - indy.defaultInit(); + indy.defaultInit(null); System.out.println(""+indy.getStringRepresentation()); System.out.println("System.exit(0)"); int[] data = indy.getIntegerData(); diff --git a/src/eva2/server/go/individuals/GAPIndividualProgramData.java b/src/eva2/server/go/individuals/GAPIndividualProgramData.java index e06a42b0..b31d4822 100644 --- a/src/eva2/server/go/individuals/GAPIndividualProgramData.java +++ b/src/eva2/server/go/individuals/GAPIndividualProgramData.java @@ -74,9 +74,9 @@ public class GAPIndividualProgramData extends AbstractEAIndividual implements In ((AbstractEAIndividual)this.m_Program).init(opt); } - public void defaultInit() { - ((AbstractEAIndividual)this.m_Numbers).defaultInit(); - ((AbstractEAIndividual)this.m_Program).defaultInit(); + public void defaultInit(InterfaceOptimizationProblem prob) { + ((AbstractEAIndividual)this.m_Numbers).defaultInit(prob); + ((AbstractEAIndividual)this.m_Program).defaultInit(prob); } /** This method will init the individual with a given value for the diff --git a/src/eva2/server/go/individuals/GEIndividualProgramData.java b/src/eva2/server/go/individuals/GEIndividualProgramData.java index 5075e6ea..6c3fef87 100644 --- a/src/eva2/server/go/individuals/GEIndividualProgramData.java +++ b/src/eva2/server/go/individuals/GEIndividualProgramData.java @@ -501,15 +501,6 @@ public class GEIndividualProgramData extends AbstractEAIndividual implements Int /************************************************************************************ * InterfaceEAIndividual methods */ - /** This method will allow a default initialisation of the individual - * @param opt The optimization problem that is to be solved. - */ - public void init(InterfaceOptimizationProblem opt) { - this.defaultInit(); - this.m_MutationOperator.init(this, opt); - this.m_CrossoverOperator.init(this, opt); - } - /** This method will init the individual with a given value for the * phenotype. * @param obj The initial value for the phenotype @@ -519,7 +510,7 @@ public class GEIndividualProgramData extends AbstractEAIndividual implements Int if (obj instanceof InterfaceProgram) { this.SetProgramGenotype((InterfaceProgram[])obj); } else { - this.defaultInit(); + this.defaultInit(opt); System.out.println("Initial value for GPIndividualDoubleData is no InterfaceProgram[]!"); } this.m_MutationOperator.init(this, opt); @@ -574,9 +565,7 @@ public class GEIndividualProgramData extends AbstractEAIndividual implements Int return this.m_GenotypeLengthPerProgram*this.m_Area.length; } - /** This method inits the genotpye of the individual - */ - public void defaultInit() { + public void defaultInit(InterfaceOptimizationProblem prob) { for (int i = 0; i < this.m_GenotypeLengthPerProgram*this.m_Area.length; i++) { if (RNG.flipCoin(0.5)) this.m_Genotype.set(i); else this.m_Genotype.clear(i); diff --git a/src/eva2/server/go/individuals/GIIndividualIntegerData.java b/src/eva2/server/go/individuals/GIIndividualIntegerData.java index 4ed80f30..a5180348 100644 --- a/src/eva2/server/go/individuals/GIIndividualIntegerData.java +++ b/src/eva2/server/go/individuals/GIIndividualIntegerData.java @@ -3,6 +3,7 @@ package eva2.server.go.individuals; import eva2.server.go.operators.crossover.CrossoverGIDefault; import eva2.server.go.operators.mutation.InterfaceMutation; import eva2.server.go.operators.mutation.MutateDefault; +import eva2.server.go.problems.InterfaceHasInitRange; import eva2.server.go.problems.InterfaceOptimizationProblem; import eva2.tools.math.RNG; @@ -189,15 +190,6 @@ public class GIIndividualIntegerData extends AbstractEAIndividual implements Int /************************************************************************************ * AbstractEAIndividual methods */ - /** This method will allow a default initialisation of the individual - * @param opt The optimization problem that is to be solved. - */ - public void init(InterfaceOptimizationProblem opt) { - this.defaultInit(); - this.m_MutationOperator.init(this, opt); - this.m_CrossoverOperator.init(this, opt); - } - /** This method will init the individual with a given value for the * phenotype. * @param obj The initial value for the phenotype @@ -209,7 +201,7 @@ public class GIIndividualIntegerData extends AbstractEAIndividual implements Int if (bs.length != this.m_Range.length) System.out.println("Init value and requested length doesn't match!"); this.SetIntGenotype(bs); } else { - this.defaultInit(); + this.defaultInit(opt); System.out.println("Initial value for GAIndividualDoubleData is not double[]!"); } this.m_MutationOperator.init(this, opt); @@ -279,11 +271,12 @@ public class GIIndividualIntegerData extends AbstractEAIndividual implements Int this.m_Genotype[mutationIndex] = RNG.randomInt(this.m_Range[mutationIndex][0], this.m_Range[mutationIndex][1]); } - /** This method initializes the GA genotype randomly - */ - public void defaultInit() { + public void defaultInit(InterfaceOptimizationProblem prob) { + int[][] range = m_Range; + if (prob instanceof InterfaceHasInitRange && (((InterfaceHasInitRange)prob).getInitRange()!=null)) range = (int[][])((InterfaceHasInitRange)prob).getInitRange(); + for (int i = 0; i < this.m_Genotype.length; i++) { - this.m_Genotype[i] = RNG.randomInt(this.m_Range[i][0], this.m_Range[i][1]); + this.m_Genotype[i] = RNG.randomInt(range[i][0], range[i][1]); } } diff --git a/src/eva2/server/go/individuals/GIOBGAIndividualIntegerPermutationData.java b/src/eva2/server/go/individuals/GIOBGAIndividualIntegerPermutationData.java index 90bc26a2..61a6e642 100644 --- a/src/eva2/server/go/individuals/GIOBGAIndividualIntegerPermutationData.java +++ b/src/eva2/server/go/individuals/GIOBGAIndividualIntegerPermutationData.java @@ -75,9 +75,9 @@ public class GIOBGAIndividualIntegerPermutationData extends AbstractEAIndividual ((AbstractEAIndividual)this.m_Permutation).init(opt); } - public void defaultInit() { - ((AbstractEAIndividual)this.m_Integer).defaultInit(); - ((AbstractEAIndividual)this.m_Permutation).defaultInit(); + public void defaultInit(InterfaceOptimizationProblem prob) { + ((AbstractEAIndividual)this.m_Integer).defaultInit(prob); + ((AbstractEAIndividual)this.m_Permutation).defaultInit(prob); } /** This method will init the individual with a given value for the diff --git a/src/eva2/server/go/individuals/GPIndividualProgramData.java b/src/eva2/server/go/individuals/GPIndividualProgramData.java index a985ed03..12a470e5 100644 --- a/src/eva2/server/go/individuals/GPIndividualProgramData.java +++ b/src/eva2/server/go/individuals/GPIndividualProgramData.java @@ -193,15 +193,6 @@ public class GPIndividualProgramData extends AbstractEAIndividual implements Int /************************************************************************************ * InterfaceEAIndividual methods */ - /** This method will allow a default initialisation of the individual - * @param opt The optimization problem that is to be solved. - */ - public void init(InterfaceOptimizationProblem opt) { - this.defaultInit(); - this.m_MutationOperator.init(this, opt); - this.m_CrossoverOperator.init(this, opt); - } - /** This method will init the individual with a given value for the * phenotype. * @param obj The initial value for the phenotype @@ -211,7 +202,7 @@ public class GPIndividualProgramData extends AbstractEAIndividual implements Int if (obj instanceof InterfaceProgram[]) { this.SetProgramGenotype((InterfaceProgram[])obj); } else { - this.defaultInit(); + this.defaultInit(opt); System.out.println("Initial value for GPIndividualDoubleData is no InterfaceProgram[]!"); } this.m_MutationOperator.init(this, opt); @@ -271,7 +262,7 @@ public class GPIndividualProgramData extends AbstractEAIndividual implements Int this.m_Genotype[i].addNodesTo(allNodes); AbstractGPNode nodeToMutate = (AbstractGPNode) allNodes.get(RNG.randomInt(0, allNodes.size()-1)); if (nodeToMutate.getParent() == null) { - this.defaultInit(); + this.defaultInit(null); } else { AbstractGPNode parent = nodeToMutate.getParent(); AbstractGPNode newNode = (AbstractGPNode)(((AbstractGPNode)this.m_Area[i].getRandomNode().clone())); @@ -282,9 +273,7 @@ public class GPIndividualProgramData extends AbstractEAIndividual implements Int } } - /** This method initializes the program - */ - public void defaultInit() { + public void defaultInit(InterfaceOptimizationProblem prob) { for (int i = 0; i < this.m_Area.length; i++) { if (this.m_Area[i] == null) { EVAERROR.errorMsgOnce("Error in GPIndividualProgramData.defaultInit(): Area["+i+"] == null !!"); diff --git a/src/eva2/server/go/individuals/OBGAIndividualPermutationData.java b/src/eva2/server/go/individuals/OBGAIndividualPermutationData.java index fd9b272e..f25e5905 100644 --- a/src/eva2/server/go/individuals/OBGAIndividualPermutationData.java +++ b/src/eva2/server/go/individuals/OBGAIndividualPermutationData.java @@ -91,12 +91,6 @@ public class OBGAIndividualPermutationData extends AbstractEAIndividual implemen * AbstractEAIndividual methods */ - public void init(InterfaceOptimizationProblem opt) { - this.defaultInit(); - this.m_MutationOperator.init(this, opt); - this.m_CrossoverOperator.init(this, opt); - } - /** This method will init the individual with a given value for the * phenotype. * @param obj The initial value for the phenotype @@ -106,7 +100,7 @@ public class OBGAIndividualPermutationData extends AbstractEAIndividual implemen if (obj instanceof int[]) { this.SetPermutationGenotype((int[][]) obj); } else { - this.defaultInit(); + this.defaultInit(opt); System.out.println("Initial value for OBGAIndividualBinaryData is no Permutation!"); } this.m_MutationOperator.init(this, opt); @@ -180,8 +174,7 @@ public class OBGAIndividualPermutationData extends AbstractEAIndividual implemen this.SetPermutationGenotype(permmatrix); } -/*generates a random permutation */ - public void defaultInit(){ + public void defaultInit(InterfaceOptimizationProblem prob){ //System.out.println("Default Init!"); int[][] perm = new int[this.m_Genotype.length][]; for (int p = 0; p < perm.length; p++) { diff --git a/src/eva2/server/go/operators/crossover/CrossoverESPCX.java b/src/eva2/server/go/operators/crossover/CrossoverESPCX.java index fcd3a696..f12860e3 100644 --- a/src/eva2/server/go/operators/crossover/CrossoverESPCX.java +++ b/src/eva2/server/go/operators/crossover/CrossoverESPCX.java @@ -216,10 +216,10 @@ public class CrossoverESPCX implements InterfaceCrossover, java.io.Serializable indy4 = (ESIndividualDoubleData)indy1.clone(); if (false) { // random init - indy1.defaultInit(); - indy2.defaultInit(); - indy3.defaultInit(); - indy4.defaultInit(); + indy1.defaultInit(prob); + indy2.defaultInit(prob); + indy3.defaultInit(prob); + indy4.defaultInit(prob); } else { // value init tmpD[0] = 0; diff --git a/src/eva2/server/go/operators/crossover/CrossoverESSBX.java b/src/eva2/server/go/operators/crossover/CrossoverESSBX.java index df749989..f81a3aff 100644 --- a/src/eva2/server/go/operators/crossover/CrossoverESSBX.java +++ b/src/eva2/server/go/operators/crossover/CrossoverESSBX.java @@ -130,9 +130,9 @@ public class CrossoverESSBX implements InterfaceCrossover, java.io.Serializable indy3 = (ESIndividualDoubleData)indy1.clone(); if (false) { // random init - indy1.defaultInit(); - indy2.defaultInit(); - indy3.defaultInit(); + indy1.defaultInit(prob); + indy2.defaultInit(prob); + indy3.defaultInit(prob); } else { // value init tmpD[0] = 0.5; diff --git a/src/eva2/server/go/operators/crossover/CrossoverESSPX.java b/src/eva2/server/go/operators/crossover/CrossoverESSPX.java index d2b40d63..ed70b69c 100644 --- a/src/eva2/server/go/operators/crossover/CrossoverESSPX.java +++ b/src/eva2/server/go/operators/crossover/CrossoverESSPX.java @@ -145,10 +145,10 @@ public class CrossoverESSPX implements InterfaceCrossover, java.io.Serializable indy4 = (ESIndividualDoubleData)indy1.clone(); if (false) { // random init - indy1.defaultInit(); - indy2.defaultInit(); - indy3.defaultInit(); - indy4.defaultInit(); + indy1.defaultInit(prob); + indy2.defaultInit(prob); + indy3.defaultInit(prob); + indy4.defaultInit(prob); } else { // value init tmpD[0] = -1; diff --git a/src/eva2/server/go/operators/crossover/CrossoverESUNDX.java b/src/eva2/server/go/operators/crossover/CrossoverESUNDX.java index fc980b2d..c3fba0a3 100644 --- a/src/eva2/server/go/operators/crossover/CrossoverESUNDX.java +++ b/src/eva2/server/go/operators/crossover/CrossoverESUNDX.java @@ -205,10 +205,10 @@ public class CrossoverESUNDX implements InterfaceCrossover, java.io.Serializable indy4 = (ESIndividualDoubleData)indy1.clone(); if (false) { // random init - indy1.defaultInit(); - indy2.defaultInit(); - indy3.defaultInit(); - indy4.defaultInit(); + indy1.defaultInit(prob); + indy2.defaultInit(prob); + indy3.defaultInit(prob); + indy4.defaultInit(prob); } else { // value init tmpD[0] = -1.9; diff --git a/src/eva2/server/go/operators/mutation/MutateGAUniform.java b/src/eva2/server/go/operators/mutation/MutateGAUniform.java new file mode 100644 index 00000000..b98f3464 --- /dev/null +++ b/src/eva2/server/go/operators/mutation/MutateGAUniform.java @@ -0,0 +1,97 @@ +package eva2.server.go.operators.mutation; + +import java.io.Serializable; + +import eva2.gui.GenericObjectEditor; +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.EVAERROR; +import eva2.tools.math.RNG; + +/** + * Uniform mutation mutates every GA bit with a fixed probability. + * + * @author mkron + * + */ +public class MutateGAUniform implements InterfaceMutation, Serializable { + double bitwiseProb = 0.1; + private boolean useInvertedLength = true; + + public MutateGAUniform() {} + + public MutateGAUniform(MutateGAUniform o) { + setBitwiseProb(o.getBitwiseProb()); + } + + public void crossoverOnStrategyParameters(AbstractEAIndividual indy1, + Population partners) { + if (indy1.getMutationOperator() instanceof MutateGAUniform) { + MutateGAUniform mute = (MutateGAUniform)indy1.getMutationOperator(); + double smallerProb, largerProb; + smallerProb = Math.min(getBitwiseProb(), mute.getBitwiseProb()); + largerProb = Math.max(getBitwiseProb(), mute.getBitwiseProb()); + setBitwiseProb(RNG.randomDouble(smallerProb, largerProb)); + } + } + + public Object clone() { + return new MutateGAUniform(this); + } + + public void hideHideable() { + setUseInvertedLength(isUseInvertedLength()); + } + + public String getStringRepresentation() { + return "Uniform GA mutation (" + getBitwiseProb() + ")"; + } + + public void init(AbstractEAIndividual individual, + InterfaceOptimizationProblem opt) { + if (useInvertedLength && (individual instanceof InterfaceGAIndividual)) setBitwiseProb(((InterfaceGAIndividual)individual).getGenotypeLength()); + } + + /** + * Flip every bit with a certain probability. + */ + public void mutate(AbstractEAIndividual individual) { + if (individual instanceof InterfaceGAIndividual) { + InterfaceGAIndividual indy = (InterfaceGAIndividual)individual; + for (int i=0; i