Refactored IndividualInterface and MutateXXDefault versions. DE/PSO now work on any InterfaceDataTypeDouble
This commit is contained in:
parent
0fdb7edc52
commit
9d9f507d13
@ -5,11 +5,17 @@ package eva2;
|
||||
*
|
||||
* --- Changelog
|
||||
* 2.030: Added an EnumEditor to access enums easily through the GUI.
|
||||
* IPOP-ES and RankMuCMA mutator have been added lately (wow!).
|
||||
* Cleaned up the IndividualInterface and reduced the usage of InterfaceESIndividual. This
|
||||
* means that, e.g., that DE and PSO now also work on GAIndividualDoubleData. Because this
|
||||
* requires much time for transcoding, however, this is not useful by itself. Yet it could be
|
||||
* interesting for combined individuals composed of two data types.
|
||||
* Cleaned up MutateXXDefault to a single MutateDefault, too.
|
||||
* 2.029: Tuned the 2d-graphs which now paints quicker and changes size depending on the
|
||||
* surrounding plot window. Added a preloader-thread to accelerate the GUI at starting time.
|
||||
* 2.028: Tuned the Population to sort only when necessary on calls to getBestN... Added StatisticsDummy.
|
||||
* Slightly tuned SimpleProblemWrapper to call initProblem of simple problems if available.
|
||||
* 2.027: Renamed SetData and SetDataLamarckian from individual datatype interfaces to SetGenotype and SetPhenotype.
|
||||
* 2.027: Renamed SetData and SetDataLamarckian from individual data type interfaces to SetGenotype and SetPhenotype.
|
||||
* Repaired the GenericArrayEditor. Population measures can now be plotted in stats.
|
||||
* 2.026: Added DiversityTerminator and KnownOptimaTerminator, slightly changed InterfaceTerminator for these
|
||||
* and InterfaceStatistics to provide termination message to text window.
|
||||
|
@ -9,20 +9,60 @@ package eva2.server.go;
|
||||
* $Date: 2007-12-04 14:22:52 +0100 (Tue, 04 Dec 2007) $
|
||||
* $Author: mkron $
|
||||
*/
|
||||
/*==========================================================================*
|
||||
* IMPORTS
|
||||
*==========================================================================*/
|
||||
/*==========================================================================*
|
||||
* INTERFACE DECLARATION
|
||||
*==========================================================================*/
|
||||
|
||||
/**
|
||||
*
|
||||
* Minimal interface for an EA individual.
|
||||
*/
|
||||
public interface IndividualInterface {
|
||||
public IndividualInterface getClone();
|
||||
public double[] getFitness();
|
||||
public void SetFitness (double[] fit);
|
||||
public double[] getDoubleArray();
|
||||
public boolean isDominant(double[] otherFitness);
|
||||
public boolean isDominant(IndividualInterface other);
|
||||
/**
|
||||
* Create a clone of the individual instance.
|
||||
*
|
||||
* @return a clone of the individual instance
|
||||
*/
|
||||
public IndividualInterface getClone();
|
||||
|
||||
/**
|
||||
* Get the fitness array of the individual which may be null if none has been set.
|
||||
*
|
||||
* @return the fitness array of the individual
|
||||
*/
|
||||
public double[] getFitness();
|
||||
|
||||
/**
|
||||
* Set the fitness array to the given array.
|
||||
*
|
||||
* @param fit new fitness of the individual
|
||||
*/
|
||||
public void SetFitness (double[] fit);
|
||||
|
||||
/**
|
||||
* Check whether the instance is dominating the given other individual and return
|
||||
* true in this case.
|
||||
*
|
||||
* @param other a second individual of the same type
|
||||
* @return true if the instance dominates the other individual, else false
|
||||
*/
|
||||
public boolean isDominant(double[] fitness);
|
||||
|
||||
/**
|
||||
* Check whether the instance is dominating the given other individual and return
|
||||
* true in this case.
|
||||
* Should behave equally to {@link #isDominant(double[])} if called with the fitness
|
||||
* of the given individual.
|
||||
*
|
||||
* @param other a second individual of the same type
|
||||
* @return true if the instance dominates the other individual, else false
|
||||
*/
|
||||
public boolean isDominant(IndividualInterface other);
|
||||
|
||||
/**
|
||||
* Perform a standard mutation operation on the individual. The exact implementation
|
||||
* depends on the implemented genotype.
|
||||
*/
|
||||
public void defaultMutate();
|
||||
|
||||
/**
|
||||
* Initialize the genotype randomly, usually in a uniform distribution.
|
||||
*/
|
||||
public void defaultInit();
|
||||
}
|
@ -22,9 +22,9 @@ import eva2.tools.EVAERROR;
|
||||
/** This is the abstract EA individual implementing the most important methods giving
|
||||
* access to mutation and crossover rates and operators, fitness values and selection
|
||||
* probabilities. All EA individuals should typically extend this abstract EA individual.
|
||||
* In that case the EA individuals only implement the genotpye and phenotype interfaces.
|
||||
* The names of the implementation should be build like this:
|
||||
* (Genotpye)Individual(Phenotype)
|
||||
* In that case the EA individuals only implement the genotype and phenotype interfaces.
|
||||
* The names of the implementation should be built like this:
|
||||
* (Genotype)Individual(Phenotype)
|
||||
* Thus a binary individual coding double values is named GAIndividualDoubleData and a
|
||||
* real-valued individual coding binary values is named ESIndividualBinaryData.
|
||||
* Created by IntelliJ IDEA.
|
||||
@ -531,7 +531,7 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java.
|
||||
}
|
||||
|
||||
/** This method will allow you to compare two individuals regarding the dominance.
|
||||
* Note this is dominance! If the individuals are invariant this method will
|
||||
* Note this is dominance! If the individuals are not comparable this method will
|
||||
* return false!
|
||||
* @param indy The individual to compare to.
|
||||
* @return True if better false else
|
||||
@ -583,7 +583,7 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java.
|
||||
}
|
||||
|
||||
/** This method will allow you to compare two individuals regarding the dominance.
|
||||
* Note this is dominance! If the individuals are invariant this method will
|
||||
* Note this is dominance! If the individuals are not comparable this method will
|
||||
* return false!
|
||||
* @param indy The individual to compare to.
|
||||
* @return True if better false else
|
||||
@ -607,7 +607,7 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java.
|
||||
}
|
||||
|
||||
/** This method will allow you to compare two individuals regarding the dominance.
|
||||
* Note this is dominance! If the individuals are invariant this method will
|
||||
* Note this is dominance! If the individuals are not comparable this method will
|
||||
* return false!
|
||||
* @param indy The individual to compare to.
|
||||
* @return True if better false else
|
||||
@ -620,7 +620,7 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java.
|
||||
}
|
||||
|
||||
/** This method will allow you to compare two individuals regarding the dominance.
|
||||
* Note this is dominance! If the individuals are invariant this method will
|
||||
* Note this is dominance! If the individuals are not comparable this method will
|
||||
* return false!
|
||||
*
|
||||
* @param indy The individual to compare to.
|
||||
@ -889,16 +889,16 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java.
|
||||
return (IndividualInterface)this.clone();
|
||||
}
|
||||
|
||||
/** This method is used to get the basic data type of an individual double[].
|
||||
* @deprecated Since not all EAIndividuals provide double as basic data type
|
||||
* the fitness can be is returned as default value.
|
||||
* @see #getFitness()
|
||||
* @return double[]
|
||||
*/
|
||||
public double[] getDoubleArray() {
|
||||
if (this instanceof InterfaceDataTypeDouble) return ((InterfaceDataTypeDouble)this).getDoubleData();
|
||||
else return this.getFitness();
|
||||
}
|
||||
// /** This method is used to get the basic data type of an individual double[].
|
||||
// * @deprecated Since not all EAIndividuals provide double as basic data type
|
||||
// * the fitness can be is returned as default value.
|
||||
// * @see #getFitness()
|
||||
// * @return double[]
|
||||
// */
|
||||
// public double[] getDoubleArray() {
|
||||
// if (this instanceof InterfaceDataTypeDouble) return ((InterfaceDataTypeDouble)this).getDoubleData();
|
||||
// else return this.getFitness();
|
||||
// }
|
||||
|
||||
public boolean isDominantNotEqual(double[] otherFitness) {
|
||||
return isDominatingFitnessNotEqual(m_Fitness, otherFitness);
|
||||
|
@ -257,18 +257,13 @@ public class ESIndividualBinaryData extends AbstractEAIndividual implements Inte
|
||||
/** This method performs a simple one element mutation on the double vector
|
||||
*/
|
||||
public void defaultMutate() {
|
||||
int mutationIndex = RNG.randomInt(0, this.m_Genotype.length-1);
|
||||
this.m_Genotype[mutationIndex] += ((this.m_Range[mutationIndex][1] - this.m_Range[mutationIndex][0])/2)*RNG.gaussianDouble(0.05f);
|
||||
if (this.m_Genotype[mutationIndex] < this.m_Range[mutationIndex][0]) this.m_Genotype[mutationIndex] = this.m_Range[mutationIndex][0];
|
||||
if (this.m_Genotype[mutationIndex] > this.m_Range[mutationIndex][1]) this.m_Genotype[mutationIndex] = this.m_Range[mutationIndex][1];
|
||||
ESIndividualDoubleData.defaultMutate(m_Genotype, m_Range);
|
||||
}
|
||||
|
||||
/** This method initializes the double vector
|
||||
*/
|
||||
public void defaultInit() {
|
||||
for (int i = 0; i < this.m_Genotype.length; i++) {
|
||||
this.m_Genotype[i] = RNG.randomDouble(this.m_Range[i][0], this.m_Range[i][1]);
|
||||
}
|
||||
ESIndividualDoubleData.defaultInit(m_Genotype, m_Range);
|
||||
}
|
||||
/**********************************************************************************************************************
|
||||
* These are for GUI
|
||||
|
@ -275,17 +275,40 @@ public class ESIndividualDoubleData extends AbstractEAIndividual implements Inte
|
||||
/** This method performs a simple one element mutation on the double vector
|
||||
*/
|
||||
public void defaultMutate() {
|
||||
int mutationIndex = RNG.randomInt(0, this.m_Genotype.length-1);
|
||||
this.m_Genotype[mutationIndex] += ((this.m_Range[mutationIndex][1] - this.m_Range[mutationIndex][0])/2)*RNG.gaussianDouble(0.05f);
|
||||
if (this.m_Genotype[mutationIndex] < this.m_Range[mutationIndex][0]) this.m_Genotype[mutationIndex] = this.m_Range[mutationIndex][0];
|
||||
if (this.m_Genotype[mutationIndex] > this.m_Range[mutationIndex][1]) this.m_Genotype[mutationIndex] = this.m_Range[mutationIndex][1];
|
||||
ESIndividualDoubleData.defaultMutate(this.m_Genotype, this.m_Range);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method for default ES mutation. A single, uniformly chosen double entry
|
||||
* is mutated with a gaussian value.
|
||||
* If the range constraint is violated, the value is set on the bound.
|
||||
*
|
||||
* @param genotype
|
||||
* @param range
|
||||
*/
|
||||
public static void defaultMutate(double[] genotype, double[][] range) {
|
||||
int mutationIndex = RNG.randomInt(0, genotype.length-1);
|
||||
genotype[mutationIndex] += ((range[mutationIndex][1] - range[mutationIndex][0])/2)*RNG.gaussianDouble(0.05f);
|
||||
if (genotype[mutationIndex] < range[mutationIndex][0]) genotype[mutationIndex] = range[mutationIndex][0];
|
||||
if (genotype[mutationIndex] > range[mutationIndex][1]) genotype[mutationIndex] = range[mutationIndex][1];
|
||||
}
|
||||
|
||||
/** This method initializes the double vector
|
||||
*/
|
||||
public void defaultInit() {
|
||||
for (int i = 0; i < this.m_Genotype.length; i++) {
|
||||
this.m_Genotype[i] = RNG.randomDouble(this.m_Range[i][0], this.m_Range[i][1]);
|
||||
ESIndividualDoubleData.defaultInit(m_Genotype, m_Range);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method for initialization. The genotype is distributed uniformly
|
||||
* within the given range.
|
||||
*
|
||||
* @param genotype
|
||||
* @param range
|
||||
*/
|
||||
public static void defaultInit(double[] genotype, double[][] range) {
|
||||
for (int i = 0; i < genotype.length; i++) {
|
||||
genotype[i] = RNG.randomDouble(range[i][0], range[i][1]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7,7 +7,8 @@ import eva2.server.go.operators.mutation.MutateESGlobal;
|
||||
import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
import wsi.ra.math.RNG;
|
||||
|
||||
/** This individual uses a real-valued genotype to code for a permutations,
|
||||
/**
|
||||
* This individual uses a real-valued genotype to code for a permutations,
|
||||
* the sorting of the real-valued genotype gives the permutation.
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: streiche
|
||||
@ -316,25 +317,20 @@ public class ESIndividualPermutationData extends AbstractEAIndividual implements
|
||||
|
||||
}
|
||||
|
||||
/** This method performs a simple one element mutation on the double vector
|
||||
/** This method performs a one element mutation on every permutation coded by a double vector.
|
||||
*/
|
||||
public void defaultMutate() {
|
||||
for (int i = 0; i < m_Genotype.length; i++) {
|
||||
int mutationIndex = RNG.randomInt(0, this.m_Genotype[i].length-1);
|
||||
this.m_Genotype[i][mutationIndex] += ((this.m_Range[i][mutationIndex][1] - this.m_Range[i][mutationIndex][0])/2)*RNG.gaussianDouble(0.05f);
|
||||
if (this.m_Genotype[i][mutationIndex] < this.m_Range[i][mutationIndex][0]) this.m_Genotype[i][mutationIndex] = this.m_Range[i][mutationIndex][0];
|
||||
if (this.m_Genotype[i][mutationIndex] > this.m_Range[i][mutationIndex][1]) this.m_Genotype[i][mutationIndex] = this.m_Range[i][mutationIndex][1];
|
||||
ESIndividualDoubleData.defaultMutate(m_Genotype[i], m_Range[i]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/** This method initializes the double vector
|
||||
/**
|
||||
* This method initializes the double vector
|
||||
*/
|
||||
public void defaultInit() {
|
||||
for (int i = 0; i < this.m_Genotype.length; i++) {
|
||||
for (int j = 0; j < this.m_Genotype[i].length; j++) {
|
||||
this.m_Genotype[i][j] = RNG.randomDouble(this.m_Range[i][j][0], this.m_Range[i][j][1]);
|
||||
}
|
||||
ESIndividualDoubleData.defaultInit(m_Genotype[i], m_Range[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -75,6 +75,11 @@ 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();
|
||||
}
|
||||
|
||||
/** This method will init the individual with a given value for the
|
||||
* phenotype.
|
||||
* @param obj The initial value for the phenotype
|
||||
@ -103,6 +108,11 @@ public class GAESIndividualBinaryDoubleData extends AbstractEAIndividual impleme
|
||||
if (RNG.flipCoin(this.m_MutationProbability))((AbstractEAIndividual)this.m_BitSet).mutate();
|
||||
}
|
||||
|
||||
public void defaultMutate() {
|
||||
((AbstractEAIndividual)this.m_Numbers).defaultMutate();
|
||||
((AbstractEAIndividual)this.m_BitSet).defaultMutate();
|
||||
}
|
||||
|
||||
/** This method will mate the Individual with given other individuals
|
||||
* of the same type.
|
||||
* @param partners The possible partners
|
||||
|
@ -3,16 +3,11 @@ package eva2.server.go.individuals;
|
||||
|
||||
import java.util.BitSet;
|
||||
|
||||
import eva2.server.go.operators.crossover.CrossoverGADefault;
|
||||
import eva2.server.go.operators.crossover.CrossoverGANPoint;
|
||||
import eva2.server.go.operators.crossover.InterfaceCrossover;
|
||||
import eva2.server.go.operators.crossover.NoCrossover;
|
||||
import eva2.server.go.operators.mutation.InterfaceMutation;
|
||||
import eva2.server.go.operators.mutation.MutateGADefault;
|
||||
import eva2.server.go.operators.mutation.MutateGAStandard;
|
||||
import eva2.server.go.operators.mutation.NoMutation;
|
||||
import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
import wsi.ra.math.RNG;
|
||||
import eva2.server.go.operators.crossover.CrossoverGANPoint;
|
||||
import eva2.server.go.operators.mutation.InterfaceMutation;
|
||||
import eva2.server.go.operators.mutation.MutateGAStandard;
|
||||
import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
|
||||
/** This individual uses a binary genotype to code for binary values.
|
||||
* Created by IntelliJ IDEA.
|
||||
|
@ -3,16 +3,13 @@ package eva2.server.go.individuals;
|
||||
|
||||
import java.util.BitSet;
|
||||
|
||||
import wsi.ra.math.RNG;
|
||||
import eva2.server.go.individuals.codings.ga.GAStandardCodingDouble;
|
||||
import eva2.server.go.individuals.codings.ga.InterfaceGADoubleCoding;
|
||||
import eva2.server.go.operators.crossover.CrossoverGADefault;
|
||||
import eva2.server.go.operators.crossover.CrossoverGANPoint;
|
||||
import eva2.server.go.operators.crossover.InterfaceCrossover;
|
||||
import eva2.server.go.operators.mutation.InterfaceMutation;
|
||||
import eva2.server.go.operators.mutation.MutateGADefault;
|
||||
import eva2.server.go.operators.mutation.MutateGAStandard;
|
||||
import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
import wsi.ra.math.RNG;
|
||||
|
||||
/** This individual uses a binary genotype to code for double values
|
||||
* using two alternative encodings.
|
||||
|
@ -1,20 +1,11 @@
|
||||
package eva2.server.go.individuals;
|
||||
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import eva2.server.go.individuals.codings.gp.AbstractGPNode;
|
||||
import eva2.server.go.individuals.codings.gp.GPArea;
|
||||
import wsi.ra.math.RNG;
|
||||
import eva2.server.go.individuals.codings.gp.InterfaceProgram;
|
||||
import eva2.server.go.operators.crossover.CrossoverESDefault;
|
||||
import eva2.server.go.operators.crossover.CrossoverGPDefault;
|
||||
import eva2.server.go.operators.crossover.InterfaceCrossover;
|
||||
import eva2.server.go.operators.mutation.InterfaceMutation;
|
||||
import eva2.server.go.operators.mutation.MutateESDefault;
|
||||
import eva2.server.go.operators.mutation.MutateGPDefault;
|
||||
import eva2.server.go.populations.Population;
|
||||
import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
import wsi.ra.math.RNG;
|
||||
|
||||
/** This individual combines a real-valued phenotype with a tree-based phenotype.
|
||||
* Created by IntelliJ IDEA.
|
||||
@ -82,7 +73,12 @@ public class GAPIndividualProgramData extends AbstractEAIndividual implements In
|
||||
((AbstractEAIndividual)this.m_Numbers).init(opt);
|
||||
((AbstractEAIndividual)this.m_Program).init(opt);
|
||||
}
|
||||
|
||||
|
||||
public void defaultInit() {
|
||||
((AbstractEAIndividual)this.m_Numbers).defaultInit();
|
||||
((AbstractEAIndividual)this.m_Program).defaultInit();
|
||||
}
|
||||
|
||||
/** This method will init the individual with a given value for the
|
||||
* phenotype.
|
||||
* @param obj The initial value for the phenotype
|
||||
@ -111,6 +107,11 @@ public class GAPIndividualProgramData extends AbstractEAIndividual implements In
|
||||
if (RNG.flipCoin(this.m_MutationProbability))((AbstractEAIndividual)this.m_Program).mutate();
|
||||
}
|
||||
|
||||
public void defaultMutate() {
|
||||
((AbstractEAIndividual)this.m_Numbers).defaultMutate();
|
||||
((AbstractEAIndividual)this.m_Program).defaultMutate();
|
||||
}
|
||||
|
||||
/** This method will mate the Individual with given other individuals
|
||||
* of the same type.
|
||||
* @param partners The possible partners
|
||||
|
@ -1,17 +1,17 @@
|
||||
package eva2.server.go.individuals;
|
||||
|
||||
|
||||
import java.util.BitSet;
|
||||
import java.util.ArrayList;
|
||||
import java.util.BitSet;
|
||||
|
||||
import wsi.ra.math.RNG;
|
||||
import eva2.server.go.individuals.codings.gp.AbstractGPNode;
|
||||
import eva2.server.go.individuals.codings.gp.GPArea;
|
||||
import eva2.server.go.individuals.codings.gp.InterfaceProgram;
|
||||
import eva2.server.go.operators.crossover.CrossoverGADefault;
|
||||
import eva2.server.go.operators.mutation.InterfaceMutation;
|
||||
import eva2.server.go.operators.mutation.MutateGADefault;
|
||||
import eva2.server.go.operators.mutation.MutateDefault;
|
||||
import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
import wsi.ra.math.RNG;
|
||||
|
||||
/** This individual uses a binary genotype to code for a tree-based representation
|
||||
* using a BNF grammar, see also Grammatical Evolution.
|
||||
@ -42,7 +42,7 @@ public class GEIndividualProgramData extends AbstractEAIndividual implements Int
|
||||
this.m_Area = new GPArea[1];
|
||||
this.m_GenotypeLengthPerProgram = 240;
|
||||
this.m_Genotype = new BitSet();
|
||||
this.m_MutationOperator = new MutateGADefault();
|
||||
this.m_MutationOperator = new MutateDefault();
|
||||
this.m_CrossoverOperator = new CrossoverGADefault();
|
||||
this.m_MutationProbability = 0.5;
|
||||
this.m_CrossoverProbability = 0.5;
|
||||
|
@ -1,10 +1,10 @@
|
||||
package eva2.server.go.individuals;
|
||||
|
||||
import wsi.ra.math.RNG;
|
||||
import eva2.server.go.operators.crossover.CrossoverGIDefault;
|
||||
import eva2.server.go.operators.mutation.InterfaceMutation;
|
||||
import eva2.server.go.operators.mutation.MutateGIDefault;
|
||||
import eva2.server.go.operators.mutation.MutateDefault;
|
||||
import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
import wsi.ra.math.RNG;
|
||||
|
||||
/** This individual uses a integer genotype to code for integer values.
|
||||
* Created by IntelliJ IDEA.
|
||||
@ -21,7 +21,7 @@ public class GIIndividualIntegerData extends AbstractEAIndividual implements Int
|
||||
|
||||
public GIIndividualIntegerData() {
|
||||
this.m_MutationProbability = 0.1;
|
||||
this.m_MutationOperator = new MutateGIDefault();
|
||||
this.m_MutationOperator = new MutateDefault();
|
||||
this.m_CrossoverProbability = 0.7;
|
||||
this.m_CrossoverOperator = new CrossoverGIDefault();
|
||||
this.m_Range = new int[10][2];
|
||||
|
@ -74,6 +74,11 @@ public class GIOBGAIndividualIntegerPermutationData extends AbstractEAIndividual
|
||||
((AbstractEAIndividual)this.m_Integer).init(opt);
|
||||
((AbstractEAIndividual)this.m_Permutation).init(opt);
|
||||
}
|
||||
|
||||
public void defaultInit() {
|
||||
((AbstractEAIndividual)this.m_Integer).defaultInit();
|
||||
((AbstractEAIndividual)this.m_Permutation).defaultInit();
|
||||
}
|
||||
|
||||
/** This method will init the individual with a given value for the
|
||||
* phenotype.
|
||||
@ -103,6 +108,11 @@ public class GIOBGAIndividualIntegerPermutationData extends AbstractEAIndividual
|
||||
if (RNG.flipCoin(this.m_MutationProbability))((AbstractEAIndividual)this.m_Permutation).mutate();
|
||||
}
|
||||
|
||||
public void defaultMutate() {
|
||||
((AbstractEAIndividual)this.m_Integer).defaultMutate();
|
||||
((AbstractEAIndividual)this.m_Permutation).defaultMutate();
|
||||
}
|
||||
|
||||
/** This method will mate the Individual with given other individuals
|
||||
* of the same type.
|
||||
* @param partners The possible partners
|
||||
|
@ -3,16 +3,15 @@ package eva2.server.go.individuals;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import wsi.ra.math.RNG;
|
||||
import eva2.server.go.individuals.codings.gp.AbstractGPNode;
|
||||
import eva2.server.go.individuals.codings.gp.GPArea;
|
||||
import eva2.server.go.individuals.codings.gp.InterfaceProgram;
|
||||
import eva2.server.go.operators.crossover.CrossoverGPDefault;
|
||||
import eva2.server.go.operators.mutation.InterfaceMutation;
|
||||
import eva2.server.go.operators.mutation.MutateGPDefault;
|
||||
import eva2.server.go.operators.mutation.MutateDefault;
|
||||
import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
import wsi.ra.math.RNG;
|
||||
import eva2.tools.EVAERROR;
|
||||
import eva2.tools.EVAHELP;
|
||||
|
||||
/** This individual uses a tree-based genotype to code for program trees.
|
||||
* Created by IntelliJ IDEA.
|
||||
@ -35,7 +34,7 @@ public class GPIndividualProgramData extends AbstractEAIndividual implements Int
|
||||
this.m_Area = new GPArea[1];
|
||||
m_Area[0] = new GPArea();
|
||||
this.m_Genotype = new AbstractGPNode[1];
|
||||
this.m_MutationOperator = new MutateGPDefault();
|
||||
this.m_MutationOperator = new MutateDefault();
|
||||
this.m_CrossoverOperator = new CrossoverGPDefault();
|
||||
}
|
||||
|
||||
|
@ -33,11 +33,4 @@ public interface InterfaceESIndividual {
|
||||
*/
|
||||
public double[][] getDoubleRange();
|
||||
|
||||
/** This method performs a simple one element mutation on the double vector
|
||||
*/
|
||||
public void defaultMutate();
|
||||
|
||||
/** This method initializes the double vector
|
||||
*/
|
||||
public void defaultInit();
|
||||
}
|
||||
|
@ -11,7 +11,7 @@ import java.util.BitSet;
|
||||
* Time: 14:25:24
|
||||
* To change this template use Options | File Templates.
|
||||
*/
|
||||
public interface InterfaceGAIndividual {
|
||||
public interface InterfaceGAIndividual {
|
||||
|
||||
/** This method will allow the user to read the GA genotype
|
||||
* @return BitSet
|
||||
@ -33,11 +33,4 @@ public interface InterfaceGAIndividual {
|
||||
*/
|
||||
public int getGenotypeLength();
|
||||
|
||||
/** This method performs a simple one point mutation in the genotype
|
||||
*/
|
||||
public void defaultMutate();
|
||||
|
||||
/** This method initializes the GA genotype randomly
|
||||
*/
|
||||
public void defaultInit();
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
package eva2.server.go.individuals;
|
||||
|
||||
import java.util.BitSet;
|
||||
|
||||
/** This interface gives access to a integer genotype and should
|
||||
* only be used by mutation and crossover operators.
|
||||
@ -48,12 +47,4 @@ public interface InterfaceGIIndividual {
|
||||
* @return The length of the genotype.
|
||||
*/
|
||||
public int getGenotypeLength();
|
||||
|
||||
/** This method performs a simple one point mutation in the genotype
|
||||
*/
|
||||
public void defaultMutate();
|
||||
|
||||
/** This method initializes the GA genotype randomly
|
||||
*/
|
||||
public void defaultInit();
|
||||
}
|
||||
|
@ -33,11 +33,4 @@ public interface InterfaceGPIndividual {
|
||||
*/
|
||||
public Object[] getFunctionArea();
|
||||
|
||||
/** This method performs a simple one element mutation on the program
|
||||
*/
|
||||
public void defaultMutate();
|
||||
|
||||
/** This method initializes the program
|
||||
*/
|
||||
public void defaultInit();
|
||||
}
|
||||
|
@ -27,14 +27,4 @@ public interface InterfaceOBGAIndividual {
|
||||
* @param b int[] new genotype
|
||||
*/
|
||||
public void SetOBGenotype(int[][] b);
|
||||
|
||||
|
||||
/**
|
||||
* defaultMutate perfoms a mutation by flipping two elements in the permutation
|
||||
*/
|
||||
public void defaultMutate();
|
||||
|
||||
/** This method initializes the program
|
||||
*/
|
||||
public void defaultInit();
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ import java.util.BitSet;
|
||||
public interface InterfaceGADoubleCoding {
|
||||
/** This method decodes a part of a given BitSet into a double value. This method may change the contens
|
||||
* of the BitSet if it doesn't describe a valid value.
|
||||
* The method checks wether or not the value is within the given range.
|
||||
* The method checks whether or not the value is within the given range.
|
||||
* @param refBitSet The BitSet where the questioned value is stored.
|
||||
* @param range The allowed range of the value.
|
||||
* @param locus The position and length on the BitSet that is to be decoded.
|
||||
@ -21,9 +21,9 @@ public interface InterfaceGADoubleCoding {
|
||||
*/
|
||||
public double decodeValue(BitSet refBitSet, double[] range, int[] locus, boolean correction);
|
||||
|
||||
/** This method codes a given int value directly into a BitSet at
|
||||
/** This method codes a given double value directly into a BitSet at
|
||||
* the position which is specified by locus.
|
||||
* The method checks wether or not the value is within the given range.
|
||||
* The method checks whether or not the value is within the given range.
|
||||
* @param value The value to be coded.
|
||||
* @param range The allowed range of the value.
|
||||
* @param refBitSet The BitSet where the questioned value is stored.
|
||||
|
@ -1,24 +1,23 @@
|
||||
package eva2.server.go.operators.mutation;
|
||||
|
||||
import eva2.server.go.IndividualInterface;
|
||||
import eva2.server.go.individuals.AbstractEAIndividual;
|
||||
import eva2.server.go.individuals.InterfaceGIIndividual;
|
||||
import eva2.server.go.individuals.InterfaceESIndividual;
|
||||
import eva2.server.go.populations.Population;
|
||||
import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: streiche
|
||||
* Date: 18.05.2005
|
||||
* Time: 17:08:49
|
||||
* To change this template use File | Settings | File Templates.
|
||||
* Mutate individuals using the default operator implemented by the individuals themselves.
|
||||
*
|
||||
*/
|
||||
public class MutateGIDefault implements InterfaceMutation, java.io.Serializable {
|
||||
public class MutateDefault implements InterfaceMutation, java.io.Serializable {
|
||||
|
||||
/** This method will enable you to clone a given mutation operator
|
||||
* @return The clone
|
||||
*/
|
||||
public Object clone() {
|
||||
return new MutateGIDefault();
|
||||
return new MutateDefault();
|
||||
}
|
||||
|
||||
/** This method allows you to evaluate wether two mutation operators
|
||||
@ -26,7 +25,7 @@ public class MutateGIDefault implements InterfaceMutation, java.io.Serializable
|
||||
* @param mutator The other mutation operator
|
||||
*/
|
||||
public boolean equals(Object mutator) {
|
||||
if (mutator instanceof MutateGIDefault) return true;
|
||||
if (mutator instanceof MutateDefault) return true;
|
||||
else return false;
|
||||
}
|
||||
|
||||
@ -38,6 +37,14 @@ public class MutateGIDefault implements InterfaceMutation, java.io.Serializable
|
||||
|
||||
}
|
||||
|
||||
/** 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) {
|
||||
if (individual instanceof IndividualInterface) ((IndividualInterface)individual).defaultMutate();
|
||||
}
|
||||
|
||||
/** This method allows you to perform either crossover on the strategy parameters
|
||||
* or to deal in some other way with the crossover event.
|
||||
* @param indy1 The original mother
|
||||
@ -47,20 +54,12 @@ public class MutateGIDefault implements InterfaceMutation, java.io.Serializable
|
||||
// nothing to do here
|
||||
}
|
||||
|
||||
/** 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) {
|
||||
if (individual instanceof InterfaceGIIndividual) ((InterfaceGIIndividual)individual).defaultMutate();
|
||||
}
|
||||
|
||||
/** This method allows you to get a string representation of the mutation
|
||||
* operator
|
||||
* @return A descriptive string.
|
||||
*/
|
||||
public String getStringRepresentation() {
|
||||
return "GI default mutation";
|
||||
return "Default mutation";
|
||||
}
|
||||
|
||||
/**********************************************************************************************************************
|
||||
@ -71,12 +70,12 @@ public class MutateGIDefault implements InterfaceMutation, java.io.Serializable
|
||||
* @return The name.
|
||||
*/
|
||||
public String getName() {
|
||||
return "GI default mutation";
|
||||
return "Default mutation";
|
||||
}
|
||||
/** This method returns a global info string
|
||||
* @return description
|
||||
*/
|
||||
public String globalInfo() {
|
||||
return "The default mutation alters one element of the int attributes.";
|
||||
return "The default mutation just uses the default method implemented in the individual.";
|
||||
}
|
||||
}
|
||||
}
|
@ -1,85 +0,0 @@
|
||||
package eva2.server.go.operators.mutation;
|
||||
|
||||
import eva2.server.go.individuals.AbstractEAIndividual;
|
||||
import eva2.server.go.individuals.InterfaceESIndividual;
|
||||
import eva2.server.go.populations.Population;
|
||||
import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: streiche
|
||||
* Date: 25.03.2003
|
||||
* Time: 10:58:44
|
||||
* To change this template use Options | File Templates.
|
||||
*/
|
||||
public class MutateESDefault implements InterfaceMutation, java.io.Serializable {
|
||||
|
||||
/** This method will enable you to clone a given mutation operator
|
||||
* @return The clone
|
||||
*/
|
||||
public Object clone() {
|
||||
return new MutateESDefault();
|
||||
}
|
||||
|
||||
/** 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 MutateESDefault) 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: " +((GAIndividual)individual).getSolutionRepresentationFor());
|
||||
if (individual instanceof InterfaceESIndividual) ((InterfaceESIndividual)individual).defaultMutate();
|
||||
//System.out.println("After Mutate: " +((GAIndividual)individual).getSolutionRepresentationFor());
|
||||
}
|
||||
|
||||
/** This method allows you to perform either crossover on the strategy parameters
|
||||
* or to deal in some other way with the crossover event.
|
||||
* @param indy1 The original mother
|
||||
* @param partners The original partners
|
||||
*/
|
||||
public void crossoverOnStrategyParameters(AbstractEAIndividual indy1, Population partners) {
|
||||
// nothing to do here
|
||||
}
|
||||
|
||||
/** This method allows you to get a string representation of the mutation
|
||||
* operator
|
||||
* @return A descriptive string.
|
||||
*/
|
||||
public String getStringRepresentation() {
|
||||
return "ES default mutation";
|
||||
}
|
||||
|
||||
/**********************************************************************************************************************
|
||||
* These are for GUI
|
||||
*/
|
||||
/** This method allows the CommonJavaObjectEditorPanel to read the
|
||||
* name to the current object.
|
||||
* @return The name.
|
||||
*/
|
||||
public String getName() {
|
||||
return "ES default mutation";
|
||||
}
|
||||
/** This method returns a global info string
|
||||
* @return description
|
||||
*/
|
||||
public String globalInfo() {
|
||||
return "The default mutation just uses the default method implemented in the individual.";
|
||||
}
|
||||
}
|
@ -1,88 +0,0 @@
|
||||
package eva2.server.go.operators.mutation;
|
||||
|
||||
import eva2.server.go.individuals.AbstractEAIndividual;
|
||||
import eva2.server.go.individuals.InterfaceGAIndividual;
|
||||
import eva2.server.go.populations.Population;
|
||||
import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
|
||||
|
||||
/**
|
||||
* This operator performs one-point mutation.
|
||||
* Created by IntelliJ IDEA.
|
||||
*
|
||||
* User: streiche
|
||||
* Date: 18.03.2003
|
||||
* Time: 12:36:08
|
||||
* To change this template use Options | File Templates.
|
||||
*/
|
||||
public class MutateGADefault implements InterfaceMutation, java.io.Serializable {
|
||||
|
||||
/** This method will enable you to clone a given mutation operator
|
||||
* @return The clone
|
||||
*/
|
||||
public Object clone() {
|
||||
return new MutateGADefault();
|
||||
}
|
||||
|
||||
/** 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 MutateGADefault) 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: " +((GAIndividual)individual).getSolutionRepresentationFor());
|
||||
if (individual instanceof InterfaceGAIndividual) ((InterfaceGAIndividual)individual).defaultMutate();
|
||||
//System.out.println("After Mutate: " +((GAIndividual)individual).getSolutionRepresentationFor());
|
||||
}
|
||||
|
||||
/** This method allows you to perform either crossover on the strategy parameters
|
||||
* or to deal in some other way with the crossover event.
|
||||
* @param indy1 The original mother
|
||||
* @param partners The original partners
|
||||
*/
|
||||
public void crossoverOnStrategyParameters(AbstractEAIndividual indy1, Population partners) {
|
||||
// nothing to do here
|
||||
}
|
||||
|
||||
|
||||
/** This method allows you to get a string representation of the mutation
|
||||
* operator
|
||||
* @return A descriptive string.
|
||||
*/
|
||||
public String getStringRepresentation() {
|
||||
return "GA default mutation";
|
||||
}
|
||||
|
||||
/**********************************************************************************************************************
|
||||
* These are for GUI
|
||||
*/
|
||||
/** This method allows the CommonJavaObjectEditorPanel to read the
|
||||
* name to the current object.
|
||||
* @return The name.
|
||||
*/
|
||||
public String getName() {
|
||||
return "GA default mutation";
|
||||
}
|
||||
/** This method returns a global info string
|
||||
* @return description
|
||||
*/
|
||||
public String globalInfo() {
|
||||
return "The default mutation switches one bit of the GA genotype.";
|
||||
}
|
||||
}
|
@ -1,14 +1,12 @@
|
||||
package eva2.server.go.operators.mutation;
|
||||
|
||||
|
||||
import java.util.BitSet;
|
||||
|
||||
import wsi.ra.math.RNG;
|
||||
import eva2.server.go.IndividualInterface;
|
||||
import eva2.server.go.individuals.AbstractEAIndividual;
|
||||
import eva2.server.go.individuals.InterfaceGAIndividual;
|
||||
import eva2.server.go.individuals.InterfaceGPIndividual;
|
||||
import eva2.server.go.populations.Population;
|
||||
import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
import wsi.ra.math.RNG;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
@ -73,7 +71,7 @@ public class MutateGPAdaptive implements InterfaceMutation, java.io.Serializable
|
||||
this.m_MutationStep = this.m_MutationStep * Math.exp(this.m_Tau1 * RNG.gaussianDouble(1) + this.m_Tau2 * RNG.gaussianDouble(1));
|
||||
if (this.m_MutationStep < this.m_LowerLimitStepSize) this.m_MutationStep = this.m_LowerLimitStepSize;
|
||||
if (this.m_MutationStep > 1) this.m_MutationStep = 1;
|
||||
if (RNG.flipCoin(this.m_MutationStep)) ((InterfaceGPIndividual)individual).defaultMutate();
|
||||
if (RNG.flipCoin(this.m_MutationStep)) ((IndividualInterface)individual).defaultMutate();
|
||||
}
|
||||
//System.out.println("After Mutate: " +((GAIndividual)individual).getSolutionRepresentationFor());
|
||||
}
|
||||
|
@ -1,89 +0,0 @@
|
||||
package eva2.server.go.operators.mutation;
|
||||
|
||||
import eva2.server.go.individuals.AbstractEAIndividual;
|
||||
import eva2.server.go.individuals.InterfaceGPIndividual;
|
||||
import eva2.server.go.populations.Population;
|
||||
import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: streiche
|
||||
* Date: 04.04.2003
|
||||
* Time: 16:38:31
|
||||
* To change this template use Options | File Templates.
|
||||
*/
|
||||
public class MutateGPDefault implements InterfaceMutation, java.io.Serializable {
|
||||
|
||||
public MutateGPDefault() {
|
||||
|
||||
}
|
||||
/** This method will enable you to clone a given mutation operator
|
||||
* @return The clone
|
||||
*/
|
||||
public Object clone() {
|
||||
return new MutateGPDefault();
|
||||
}
|
||||
|
||||
/** 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 MutateGPDefault) 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: " +((InterfaceGPIndividual)individual).getPGenotype()[0].getStringRepresentation());
|
||||
// System.out.println("Length: " +((InterfaceGPIndividual)individual).getPGenotype()[0].getNumberOfNodes());
|
||||
if (individual instanceof InterfaceGPIndividual) ((InterfaceGPIndividual)individual).defaultMutate();
|
||||
// System.out.println("After Mutate: " +((InterfaceGPIndividual)individual).getPGenotype()[0].getStringRepresentation());
|
||||
// System.out.println("Length: " +((InterfaceGPIndividual)individual).getPGenotype()[0].getNumberOfNodes());
|
||||
}
|
||||
|
||||
/** This method allows you to perform either crossover on the strategy parameters
|
||||
* or to deal in some other way with the crossover event.
|
||||
* @param indy1 The original mother
|
||||
* @param partners The original partners
|
||||
*/
|
||||
public void crossoverOnStrategyParameters(AbstractEAIndividual indy1, Population partners) {
|
||||
// nothing to do here
|
||||
}
|
||||
|
||||
/** This method allows you to get a string representation of the mutation
|
||||
* operator
|
||||
* @return A descriptive string.
|
||||
*/
|
||||
public String getStringRepresentation() {
|
||||
return "GP default mutation";
|
||||
}
|
||||
|
||||
/**********************************************************************************************************************
|
||||
* These are for GUI
|
||||
*/
|
||||
/** This method allows the CommonJavaObjectEditorPanel to read the
|
||||
* name to the current object.
|
||||
* @return The name.
|
||||
*/
|
||||
public String getName() {
|
||||
return "GP default mutation";
|
||||
}
|
||||
/** This method returns a global info string
|
||||
* @return description
|
||||
*/
|
||||
public String globalInfo() {
|
||||
return "The default mutation replaces a random subtree using init, also called headless chicken mutation.";
|
||||
}
|
||||
}
|
@ -6,7 +6,7 @@ import wsi.ra.math.RNG;
|
||||
import eva2.gui.GenericObjectEditor;
|
||||
import eva2.server.go.InterfacePopulationChangedEventListener;
|
||||
import eva2.server.go.individuals.AbstractEAIndividual;
|
||||
import eva2.server.go.individuals.InterfaceESIndividual;
|
||||
import eva2.server.go.individuals.InterfaceDataTypeDouble;
|
||||
import eva2.server.go.operators.selection.replacement.ReplacementCrowding;
|
||||
import eva2.server.go.populations.InterfaceSolutionSet;
|
||||
import eva2.server.go.populations.Population;
|
||||
@ -166,11 +166,11 @@ public class DifferentialEvolution implements InterfaceOptimizer, java.io.Serial
|
||||
* @param indy The current individual
|
||||
* @return the delta vector
|
||||
*/
|
||||
private double[] fetchDeltaBest(Population pop, InterfaceESIndividual indy) {
|
||||
private double[] fetchDeltaBest(Population pop, InterfaceDataTypeDouble indy) {
|
||||
double[] x1, result;
|
||||
AbstractEAIndividual xbIndy;
|
||||
|
||||
x1 = indy.getDGenotype();
|
||||
x1 = indy.getDoubleData();
|
||||
result = new double[x1.length];
|
||||
if (m_Problem instanceof AbstractMultiObjectiveOptimizationProblem) {
|
||||
// implements MODE for the multi-objective case: a dominating individual is selected for difference building
|
||||
@ -220,21 +220,21 @@ public class DifferentialEvolution implements InterfaceOptimizer, java.io.Serial
|
||||
public AbstractEAIndividual generateNewIndividual(Population pop) {
|
||||
int firstParentIndex;
|
||||
AbstractEAIndividual indy;
|
||||
InterfaceESIndividual esIndy;
|
||||
InterfaceDataTypeDouble esIndy;
|
||||
if (doLogParents) parents = new Vector<AbstractEAIndividual>();
|
||||
else parents = null;
|
||||
try {
|
||||
// select one random indy as starting individual. its a parent in any case.
|
||||
firstParentIndex = RNG.randomInt(0, pop.size()-1);
|
||||
indy = (AbstractEAIndividual)(pop.getEAIndividual(firstParentIndex)).getClone();
|
||||
esIndy = (InterfaceESIndividual)indy;
|
||||
esIndy = (InterfaceDataTypeDouble)indy;
|
||||
} catch (java.lang.ClassCastException e) {
|
||||
System.err.println("Differential Evolution currently requires InterfaceESIndividual as basic data type!");
|
||||
return (AbstractEAIndividual)((AbstractEAIndividual)pop.get(RNG.randomInt(0, pop.size()-1))).getClone();
|
||||
}
|
||||
double[] nX, vX, oX;
|
||||
oX = esIndy.getDGenotype();
|
||||
vX = esIndy.getDGenotype();
|
||||
oX = esIndy.getDoubleData();
|
||||
vX = esIndy.getDoubleData();
|
||||
nX = new double[oX.length];
|
||||
switch (this.m_DEType.getSelectedTag().getID()) {
|
||||
case 0 : {
|
||||
@ -274,11 +274,11 @@ public class DifferentialEvolution implements InterfaceOptimizer, java.io.Serial
|
||||
if (RNG.flipCoin(this.m_Mt)) {
|
||||
double[] xk, xl;
|
||||
double p, pj, pk, pl;
|
||||
InterfaceESIndividual indy1 = null, indy2 = null;
|
||||
InterfaceDataTypeDouble indy1 = null, indy2 = null;
|
||||
try {
|
||||
// and i got indy!
|
||||
indy1 = (InterfaceESIndividual)pop.get(RNG.randomInt(0, pop.size()-1));
|
||||
indy2 = (InterfaceESIndividual)pop.get(RNG.randomInt(0, pop.size()-1));
|
||||
indy1 = (InterfaceDataTypeDouble)pop.get(RNG.randomInt(0, pop.size()-1));
|
||||
indy2 = (InterfaceDataTypeDouble)pop.get(RNG.randomInt(0, pop.size()-1));
|
||||
if (parents != null) {
|
||||
parents.add((AbstractEAIndividual)indy1);
|
||||
parents.add((AbstractEAIndividual)indy2);
|
||||
@ -286,8 +286,8 @@ public class DifferentialEvolution implements InterfaceOptimizer, java.io.Serial
|
||||
} catch (java.lang.ClassCastException e) {
|
||||
EVAERROR.errorMsgOnce("Differential Evolution currently requires InterfaceESIndividual as basic data type!");
|
||||
}
|
||||
xk = indy1.getDGenotype();
|
||||
xl = indy2.getDGenotype();
|
||||
xk = indy1.getDoubleData();
|
||||
xl = indy2.getDoubleData();
|
||||
p = Math.abs(((AbstractEAIndividual)esIndy).getFitness(0)) + Math.abs(((AbstractEAIndividual)indy1).getFitness(0)) + Math.abs(((AbstractEAIndividual)indy2).getFitness(0));
|
||||
pj = Math.abs(((AbstractEAIndividual)esIndy).getFitness(0))/p;
|
||||
pk = Math.abs(((AbstractEAIndividual)indy1).getFitness(0))/p;
|
||||
@ -316,7 +316,7 @@ public class DifferentialEvolution implements InterfaceOptimizer, java.io.Serial
|
||||
}
|
||||
}
|
||||
// setting the new genotype and fitness
|
||||
esIndy.SetDGenotype(nX);
|
||||
esIndy.SetDoubleGenotype(nX);
|
||||
indy.SetAge(0);
|
||||
double[] fit = new double[1];
|
||||
fit[0] = 0;
|
||||
@ -339,7 +339,7 @@ public class DifferentialEvolution implements InterfaceOptimizer, java.io.Serial
|
||||
|
||||
private double[] getGenotype(AbstractEAIndividual indy) {
|
||||
try {
|
||||
return ((InterfaceESIndividual)indy).getDGenotype();
|
||||
return ((InterfaceDataTypeDouble)indy).getDoubleData();
|
||||
} catch (java.lang.ClassCastException e) {
|
||||
EVAERROR.errorMsgOnce("Differential Evolution currently requires InterfaceESIndividual as basic data type!");
|
||||
return null;
|
||||
|
@ -132,11 +132,11 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization
|
||||
* @param best The best individual found so far.
|
||||
*/
|
||||
private void updateQuantumIndividual(int index, AbstractEAIndividual indy, Population pop) {
|
||||
InterfaceESIndividual endy = (InterfaceESIndividual) indy;
|
||||
InterfaceDataTypeDouble endy = (InterfaceDataTypeDouble) indy;
|
||||
// search for the local best position
|
||||
|
||||
double[] localBestPosition;
|
||||
double[] position = endy.getDGenotype();
|
||||
double[] position = endy.getDoubleData();
|
||||
|
||||
localBestPosition = findNeighbourhoodOptimum(index, pop);
|
||||
|
||||
@ -157,7 +157,7 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization
|
||||
}
|
||||
|
||||
if (indy instanceof InterfaceDataTypeDouble) ((InterfaceDataTypeDouble)indy).SetDoubleGenotype(newPos);
|
||||
else endy.SetDGenotype(newPos);
|
||||
else endy.SetDoubleGenotype(newPos);
|
||||
|
||||
resetFitness(indy);
|
||||
|
||||
@ -392,7 +392,7 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization
|
||||
*/
|
||||
protected void updateIndividual(int index, AbstractEAIndividual indy, Population pop) {
|
||||
if (index != detectAnchor) { // only for non anchor individuals (its -1 if other detect strategy is used)
|
||||
if (indy instanceof InterfaceESIndividual) {
|
||||
if (indy instanceof InterfaceDataTypeDouble) {
|
||||
int type=(Integer)indy.getData(partTypeKey);
|
||||
switch (type) {
|
||||
case quantumType:
|
||||
@ -424,7 +424,7 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization
|
||||
// }
|
||||
|
||||
if (doSpeedAdaptation) {
|
||||
adaptTrackingSpeed(((InterfaceESIndividual)population.get(0)).getDoubleRange());
|
||||
adaptTrackingSpeed(((InterfaceDataTypeDouble)population.get(0)).getDoubleRange());
|
||||
}
|
||||
// if (m_Problem instanceof DynLocalizationProblem) {
|
||||
// ((DynLocalizationProblem)m_Problem).adaptPSOByPopulation(population, this);
|
||||
|
@ -134,8 +134,8 @@ public class ParticleFilterOptimization implements InterfaceOptimizer, java.io.S
|
||||
indy.SetFitness(0, 0);
|
||||
|
||||
if (this.withShow) {
|
||||
InterfaceESIndividual endy = (InterfaceESIndividual) indy;
|
||||
double[] curPosition = endy.getDGenotype();
|
||||
InterfaceDataTypeDouble endy = (InterfaceDataTypeDouble) indy;
|
||||
double[] curPosition = endy.getDoubleData();
|
||||
|
||||
myPlot.setUnconnectedPoint(curPosition[0], curPosition[1], indCount);
|
||||
myPlot.setConnectedPoint(curPosition[0], curPosition[1], indCount);
|
||||
|
@ -3,6 +3,10 @@ package eva2.server.go.strategies;
|
||||
import java.util.Arrays;
|
||||
import java.util.Vector;
|
||||
|
||||
import wsi.ra.chart2d.DPoint;
|
||||
import wsi.ra.chart2d.DPointSet;
|
||||
import wsi.ra.math.RNG;
|
||||
import wsi.ra.math.Jama.Matrix;
|
||||
import eva2.gui.BeanInspector;
|
||||
import eva2.gui.GenericObjectEditor;
|
||||
import eva2.gui.TopoPlot;
|
||||
@ -10,7 +14,6 @@ import eva2.server.go.InterfacePopulationChangedEventListener;
|
||||
import eva2.server.go.individuals.AbstractEAIndividual;
|
||||
import eva2.server.go.individuals.AbstractEAIndividualComparator;
|
||||
import eva2.server.go.individuals.InterfaceDataTypeDouble;
|
||||
import eva2.server.go.individuals.InterfaceESIndividual;
|
||||
import eva2.server.go.operators.distancemetric.PhenotypeMetric;
|
||||
import eva2.server.go.populations.InterfaceSolutionSet;
|
||||
import eva2.server.go.populations.Population;
|
||||
@ -18,15 +21,10 @@ import eva2.server.go.populations.SolutionSet;
|
||||
import eva2.server.go.problems.F1Problem;
|
||||
import eva2.server.go.problems.Interface2DBorderProblem;
|
||||
import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
import wsi.ra.math.RNG;
|
||||
import eva2.tools.EVAERROR;
|
||||
import eva2.tools.Mathematics;
|
||||
import eva2.tools.SelectedTag;
|
||||
|
||||
import wsi.ra.chart2d.DPoint;
|
||||
import wsi.ra.chart2d.DPointSet;
|
||||
import wsi.ra.math.Jama.Matrix;
|
||||
|
||||
|
||||
/**
|
||||
* This implements particle swarm optimization by Kennedy and Eberhardt.
|
||||
@ -174,13 +172,13 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
protected void initIndividualDefaults(AbstractEAIndividual indy) {
|
||||
double[] writeData;
|
||||
// init velocity
|
||||
writeData = new double[((InterfaceESIndividual)indy).getDGenotype().length];
|
||||
writeData = new double[((InterfaceDataTypeDouble)indy).getDoubleData().length];
|
||||
for (int j = 0; j < writeData.length; j++) {
|
||||
writeData[j] = RNG.gaussianDouble(1.0);
|
||||
//sum += (writeData[j])*(writeData[j]);
|
||||
}
|
||||
//sum = Math.sqrt(sum);
|
||||
double relSpeed = getRelativeSpeed(writeData, ((InterfaceESIndividual)indy).getDoubleRange());
|
||||
double relSpeed = getRelativeSpeed(writeData, ((InterfaceDataTypeDouble)indy).getDoubleRange());
|
||||
for (int j = 0; j < writeData.length; j++) {
|
||||
writeData[j] = (writeData[j]/relSpeed)*this.m_InitialVelocity;
|
||||
}
|
||||
@ -200,7 +198,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
System.arraycopy(tmpD, 0, writeData, 0, tmpD.length);
|
||||
indy.SetData(partBestFitKey, writeData);
|
||||
// init best position
|
||||
tmpD = ((InterfaceESIndividual)indy).getDGenotype();
|
||||
tmpD = ((InterfaceDataTypeDouble)indy).getDoubleData();
|
||||
writeData = new double[tmpD.length];
|
||||
System.arraycopy(tmpD, 0, writeData, 0, tmpD.length);
|
||||
indy.SetData(partBestPosKey, writeData);
|
||||
@ -212,11 +210,11 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
* @param population
|
||||
*/
|
||||
protected void traceEMA(Population population) {
|
||||
if (population.get(0) instanceof InterfaceESIndividual) {
|
||||
if (population.get(0) instanceof InterfaceDataTypeDouble) {
|
||||
double[] curAvVelAndSpeed = getPopulationVelSpeed(population, 3);
|
||||
double[][] range = ((InterfaceESIndividual)population.get(0)).getDoubleRange();
|
||||
double[][] range = ((InterfaceDataTypeDouble)population.get(0)).getDoubleRange();
|
||||
if (tracedVelocity == null) {
|
||||
tracedVelocity = new double[((InterfaceESIndividual)population.get(0)).getDGenotype().length];
|
||||
tracedVelocity = new double[((InterfaceDataTypeDouble)population.get(0)).getDoubleData().length];
|
||||
for (int i=0; i<tracedVelocity.length; i++) tracedVelocity[i] = curAvVelAndSpeed[i];
|
||||
} else {
|
||||
if (population.getGeneration() < emaPeriods) {// if less than emaPeriods have passed, use larger alpha
|
||||
@ -256,10 +254,10 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
*/
|
||||
private double[] getPopulationVelSpeed(Population pop, int calcModeSwitch) {
|
||||
AbstractEAIndividual indy = (AbstractEAIndividual)pop.get(0);
|
||||
if (!(indy instanceof InterfaceESIndividual)) System.out.println("error, PSO needs ES individuals!");
|
||||
if (!(indy instanceof InterfaceDataTypeDouble)) System.out.println("error, PSO needs individuals with double data!");
|
||||
|
||||
double[] ret;
|
||||
double[][] range = ((InterfaceESIndividual)indy).getDoubleRange();
|
||||
double[][] range = ((InterfaceDataTypeDouble)indy).getDoubleRange();
|
||||
int retSize = 0;
|
||||
///// warning, this method uses dark magic
|
||||
|
||||
@ -368,7 +366,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
// double sum;
|
||||
for (int i = 0; i < this.m_Population.size(); i++) {
|
||||
indy = (AbstractEAIndividual) this.m_Population.get(i);
|
||||
if (indy instanceof InterfaceESIndividual) {
|
||||
if (indy instanceof InterfaceDataTypeDouble) {
|
||||
initIndividualDefaults(indy);
|
||||
}
|
||||
indy.SetData(indexKey, i);
|
||||
@ -378,12 +376,13 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
|
||||
for (int i = 0; i < this.m_Population.size(); i++) {
|
||||
indy = (AbstractEAIndividual) this.m_Population.get(i);
|
||||
if (indy instanceof InterfaceESIndividual) {
|
||||
if (indy instanceof InterfaceDataTypeDouble) {
|
||||
initIndividualMemory(indy);
|
||||
}
|
||||
}
|
||||
|
||||
this.m_BestIndividual = (AbstractEAIndividual)this.m_Population.getBestEAIndividual().clone();
|
||||
|
||||
if (reset) this.firePropertyChangedEvent("NextGenerationPerformed");
|
||||
|
||||
treeLevels = 0;
|
||||
@ -438,7 +437,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
neighbourPos = (double[])neighbourIndy.getData(partBestPosKey);
|
||||
} else {
|
||||
neighbourFit = neighbourIndy.getFitness();
|
||||
neighbourPos = ((InterfaceESIndividual)neighbourIndy).getDGenotype();
|
||||
neighbourPos = ((InterfaceDataTypeDouble)neighbourIndy).getDoubleData();
|
||||
}
|
||||
|
||||
if (neighbourFit == null || attractorFit == null) {
|
||||
@ -453,15 +452,14 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
}
|
||||
|
||||
protected void resetIndividual(AbstractEAIndividual indy) {
|
||||
if (indy instanceof InterfaceESIndividual) {
|
||||
if (indy instanceof InterfaceDataTypeDouble) {
|
||||
indy.setParents(null);
|
||||
InterfaceESIndividual endy = (InterfaceESIndividual) indy;
|
||||
endy.defaultInit();
|
||||
indy.defaultInit();
|
||||
indy.SetData(partTypeKey, defaultType); // turn into default type
|
||||
initIndividualDefaults(indy);
|
||||
initIndividualMemory(indy);
|
||||
plotIndy(endy.getDGenotype(), null, (Integer)indy.getData(indexKey));
|
||||
} else System.err.println("error, InterfaceESIndividual required (PSO)");
|
||||
plotIndy(((InterfaceDataTypeDouble)indy).getDoubleData(), null, (Integer)indy.getData(indexKey));
|
||||
} else System.err.println("error, double valued individuals required for PSO");
|
||||
}
|
||||
|
||||
/** This method will update a given individual
|
||||
@ -471,7 +469,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
* @param best The best individual found so far.
|
||||
*/
|
||||
protected void updateIndividual(int index, AbstractEAIndividual indy, Population pop) {
|
||||
if (indy instanceof InterfaceESIndividual) {
|
||||
if (indy instanceof InterfaceDataTypeDouble) {
|
||||
int type=(Integer)indy.getData(partTypeKey);
|
||||
switch (type) {
|
||||
case resetType:
|
||||
@ -488,13 +486,13 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
}
|
||||
|
||||
protected void defaultIndividualUpdate(int index, AbstractEAIndividual indy, Population pop) {
|
||||
InterfaceESIndividual endy = (InterfaceESIndividual) indy;
|
||||
InterfaceDataTypeDouble endy = (InterfaceDataTypeDouble) indy;
|
||||
|
||||
indy.SetData(partTypeKey, defaultType);
|
||||
// default update
|
||||
double[] personalBestPos = (double[]) indy.getData(partBestPosKey);
|
||||
double[] velocity = (double[]) indy.getData(partVelKey);
|
||||
double[] curPosition = endy.getDGenotype();
|
||||
double[] curPosition = endy.getDoubleData();
|
||||
double[][] range = endy.getDoubleRange();
|
||||
|
||||
// search for the local best position
|
||||
@ -583,7 +581,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
*/
|
||||
protected void updateIndProps(AbstractEAIndividual indy) {
|
||||
indy.SetData(partBestFitKey, indy.getFitness());
|
||||
indy.SetData(partBestPosKey, ((InterfaceESIndividual)indy).getDGenotype());
|
||||
indy.SetData(partBestPosKey, ((InterfaceDataTypeDouble)indy).getDoubleData());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1005,7 +1003,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
||||
// finally set the new position and the current velocity
|
||||
if (indy instanceof InterfaceDataTypeDouble) ((InterfaceDataTypeDouble)indy).SetDoubleGenotype(newPosition);
|
||||
else {
|
||||
((InterfaceESIndividual) indy).SetDGenotype(newPosition); // WARNING, this does a checkBounds in any case!
|
||||
((InterfaceDataTypeDouble) indy).SetDoubleGenotype(newPosition); // WARNING, this does a checkBounds in any case!
|
||||
if (!m_CheckConstraints) System.err.println("warning, checkbounds will be forced by InterfaceESIndividual!");
|
||||
}
|
||||
|
||||
|
@ -7,7 +7,6 @@ import eva2.gui.GenericObjectEditor;
|
||||
import eva2.server.go.InterfacePopulationChangedEventListener;
|
||||
import eva2.server.go.individuals.AbstractEAIndividual;
|
||||
import eva2.server.go.individuals.InterfaceDataTypeDouble;
|
||||
import eva2.server.go.individuals.InterfaceESIndividual;
|
||||
import eva2.server.go.populations.InterfaceSolutionSet;
|
||||
import eva2.server.go.populations.Population;
|
||||
import eva2.server.go.populations.SolutionSet;
|
||||
@ -637,8 +636,8 @@ public class Tribes implements InterfaceOptimizer, java.io.Serializable {
|
||||
public void setPopulation(Population pop) {
|
||||
if (pop == null) return;
|
||||
population = pop;
|
||||
if (population.get(0) instanceof InterfaceESIndividual) {
|
||||
range = ((InterfaceESIndividual)population.get(0)).getDoubleRange();
|
||||
if (population.get(0) instanceof InterfaceDataTypeDouble) {
|
||||
range = ((InterfaceDataTypeDouble)population.get(0)).getDoubleRange();
|
||||
setDimension(range.length);
|
||||
} else {
|
||||
System.err.println("warning, TRIBES requires InterfaceESIndidivual instead of " + population.get(0).getClass() + ". Couldnt correctly init the problem range.");
|
||||
|
@ -8,7 +8,7 @@ import eva2.server.go.problems.InterfaceOptimizationProblem;
|
||||
import eva2.server.go.strategies.Tribes;
|
||||
import wsi.ra.math.RNG;
|
||||
|
||||
public class TribesExplorer extends AbstractEAIndividual implements InterfaceESIndividual, InterfaceDataTypeDouble {
|
||||
public class TribesExplorer extends AbstractEAIndividual implements InterfaceDataTypeDouble {
|
||||
/**
|
||||
*
|
||||
*/
|
||||
@ -956,6 +956,17 @@ v[d] = cmin * v[d];
|
||||
}
|
||||
}
|
||||
|
||||
public void defaultInit() {
|
||||
// shouldnt be called as we are beyond the EvA framework in this class
|
||||
for (int i = 0; i < this.position.x.length; i++) {
|
||||
this.position.x[0] = 0.;
|
||||
}
|
||||
}
|
||||
|
||||
public void defaultMutate() {
|
||||
// shouldnt be called as we are beyond the EvA framework in this class
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initByValue(Object obj, InterfaceOptimizationProblem opt) {
|
||||
if (obj instanceof double[]) {
|
||||
@ -1020,19 +1031,19 @@ v[d] = cmin * v[d];
|
||||
return position.x.length;
|
||||
}
|
||||
|
||||
public void SetDGenotype(double[] b) {
|
||||
position.setDoubleArray(b);
|
||||
}
|
||||
|
||||
public void defaultInit() {
|
||||
System.err.println("defaultInit not available for TribesExplorer!");
|
||||
}
|
||||
|
||||
public void defaultMutate() {
|
||||
System.err.println("defaultMutate not available for TribesExplorer!");
|
||||
}
|
||||
|
||||
public double[] getDGenotype() {
|
||||
return position.getDoubleArray().clone();
|
||||
}
|
||||
// public void SetDGenotype(double[] b) {
|
||||
// position.setDoubleArray(b);
|
||||
// }
|
||||
//
|
||||
// public void defaultInit() {
|
||||
// System.err.println("defaultInit not available for TribesExplorer!");
|
||||
// }
|
||||
//
|
||||
// public void defaultMutate() {
|
||||
// System.err.println("defaultMutate not available for TribesExplorer!");
|
||||
// }
|
||||
//
|
||||
// public double[] getDGenotype() {
|
||||
// return position.getDoubleArray().clone();
|
||||
// }
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user