diff --git a/src/eva2/OptimizerFactory.java b/src/eva2/OptimizerFactory.java index 12868e29..b4abd972 100644 --- a/src/eva2/OptimizerFactory.java +++ b/src/eva2/OptimizerFactory.java @@ -1174,8 +1174,8 @@ public class OptimizerFactory { es.setPlusStrategy(false); cbn.setOptimizer(es); ClusteringDensityBased clustering = new ClusteringDensityBased(0.1); - cbn.setConvergenceCA((ClusteringDensityBased) clustering.clone()); - cbn.setDifferentationCA(clustering); + cbn.setMergingCA((ClusteringDensityBased) clustering.clone()); + cbn.setDifferentiationCA(clustering); cbn.setShowCycle(0); // don't do graphical output return makeParams(cbn, 100, problem, randSeed, makeDefaultTerminator()); @@ -1186,8 +1186,8 @@ public class OptimizerFactory { GeneticAlgorithm ga = new GeneticAlgorithm(); cbn.setOptimizer(ga); ClusteringDensityBased clustering = new ClusteringDensityBased(0.1); - cbn.setConvergenceCA((ClusteringDensityBased) clustering.clone()); - cbn.setDifferentationCA(clustering); + cbn.setMergingCA((ClusteringDensityBased) clustering.clone()); + cbn.setDifferentiationCA(clustering); cbn.setShowCycle(0); // don't do graphical output return makeParams(cbn, 100, problem, randSeed, makeDefaultTerminator()); diff --git a/src/eva2/gui/GOEPanel.java b/src/eva2/gui/GOEPanel.java index d760d606..39f4ccd9 100644 --- a/src/eva2/gui/GOEPanel.java +++ b/src/eva2/gui/GOEPanel.java @@ -73,7 +73,7 @@ public class GOEPanel extends JPanel implements ItemListener { m_Support = support; m_goe = goe; - //System.out.println("GOEPanel.Constructor !!"); + //System.out.println("GOEPanel.Constructor ! Backup is " + m_Backup + " " + BeanInspector.toString(m_goe.getValue())); if (!(Proxy.isProxyClass(m_Object.getClass()))) m_Backup = copyObject(m_Object); m_ObjectNames = new DefaultComboBoxModel(new String [0]); m_ObjectChooser = new JComboBox(m_ObjectNames); diff --git a/src/eva2/server/ModuleServer.java b/src/eva2/server/ModuleServer.java index 321ef5b6..353f2739 100644 --- a/src/eva2/server/ModuleServer.java +++ b/src/eva2/server/ModuleServer.java @@ -29,7 +29,7 @@ import eva2.tools.jproxy.RMIProxyLocal; * CLASS DECLARATION *==========================================================================*/ /** - * + * Collect available ModuleAdapter implementations and load them on request. */ public class ModuleServer { public static boolean TRACE = false; @@ -117,7 +117,11 @@ public class ModuleServer { } /** - * + * Load the module indicated by the selectedModuleName from all available + * module classes; if necessary through a remote proxy. Try to load a given + * parameter file in case its a GOModuleAdapter. + * + * @return the loaded module adapter instance */ public ModuleAdapter createModuleAdapter(String selectedModuleName, MainAdapterClient Client, boolean runWithoutRMI, diff --git a/src/eva2/server/go/individuals/AbstractEAIndividual.java b/src/eva2/server/go/individuals/AbstractEAIndividual.java index 477290f5..e338808e 100644 --- a/src/eva2/server/go/individuals/AbstractEAIndividual.java +++ b/src/eva2/server/go/individuals/AbstractEAIndividual.java @@ -53,8 +53,8 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java. public boolean m_isPenalized = false; // may be set true for penalty based constraints protected double[] m_SelectionProbability = new double[1];; - public double m_CrossoverProbability = 1.0; - public double m_MutationProbability = 0.2; + protected double m_CrossoverProbability = 1.0; + protected double m_MutationProbability = 0.2; protected InterfaceMutation m_MutationOperator = new NoMutation(); protected InterfaceCrossover m_CrossoverOperator = new NoCrossover(); // protected String[] m_Identifiers = new String[m_ObjectIncrement]; diff --git a/src/eva2/server/go/individuals/AbstractEAIndividualComparator.java b/src/eva2/server/go/individuals/AbstractEAIndividualComparator.java index 2a1d05dc..195ce02d 100644 --- a/src/eva2/server/go/individuals/AbstractEAIndividualComparator.java +++ b/src/eva2/server/go/individuals/AbstractEAIndividualComparator.java @@ -23,7 +23,7 @@ import java.util.Comparator; public class AbstractEAIndividualComparator implements Comparator, Serializable { // flag whether a data field should be used. - String indyDataKey = null; + String indyDataKey = ""; int fitCriterion = -1; /** @@ -34,7 +34,7 @@ public class AbstractEAIndividualComparator implements Comparator, Seria * */ public AbstractEAIndividualComparator() { - this(null, -1); + this("", -1); } /** @@ -57,7 +57,7 @@ public class AbstractEAIndividualComparator implements Comparator, Seria * @param fitnessCriterion */ public AbstractEAIndividualComparator(int fitnessCriterion) { - this(null, fitnessCriterion); + this("", fitnessCriterion); } /** @@ -92,7 +92,7 @@ public class AbstractEAIndividualComparator implements Comparator, Seria public int compare(Object o1, Object o2) { boolean o1domO2, o2domO1; - if (indyDataKey != null) { + if (indyDataKey != null && (indyDataKey.length()>0)) { double[] fit1 = (double[])((AbstractEAIndividual)o1).getData(indyDataKey); double[] fit2 = (double[])((AbstractEAIndividual)o2).getData(indyDataKey); if (fitCriterion < 0) { @@ -114,4 +114,31 @@ public class AbstractEAIndividualComparator implements Comparator, Seria if (o1domO2 ^ o2domO1) return (o1domO2 ? -1 : 1); else return 0; // these are not comparable } + + public String getIndyDataKey() { + return indyDataKey; + } + public void setIndyDataKey(String indyDataKey) { + this.indyDataKey = indyDataKey; + } + public String indyDataKeyTipText() { + return "A String can be given which retrievies individual properties based on which the comparison is performed."; + } + + public int getFitCriterion() { + return fitCriterion; + } + public void setFitCriterion(int fitCriterion) { + this.fitCriterion = fitCriterion; + } + public String fitCriterionTipText() { + return "If -1, dominance is used, otherwise the indexed fitness criterion (for multiobjective problems)"; + } + + public String globalInfo() { + return "A comparator class for general EA individuals. Compares individuals based on their fitness in context of minimization."; + } + public String getName() { + return "IndividualComparator"; + } } diff --git a/src/eva2/server/go/individuals/GAIndividualBinaryData.java b/src/eva2/server/go/individuals/GAIndividualBinaryData.java index 825b7405..be3249a9 100644 --- a/src/eva2/server/go/individuals/GAIndividualBinaryData.java +++ b/src/eva2/server/go/individuals/GAIndividualBinaryData.java @@ -4,6 +4,7 @@ package eva2.server.go.individuals; import java.util.BitSet; 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.MutateGAStandard; import eva2.server.go.problems.InterfaceOptimizationProblem; @@ -40,7 +41,7 @@ public class GAIndividualBinaryData extends AbstractEAIndividual implements Inte // cloning the members of AbstractEAIndividual this.m_Age = individual.m_Age; - this.m_CrossoverOperator = individual.m_CrossoverOperator; + this.m_CrossoverOperator = (InterfaceCrossover)individual.m_CrossoverOperator.clone(); this.m_CrossoverProbability = individual.m_CrossoverProbability; this.m_MutationOperator = (InterfaceMutation)individual.m_MutationOperator.clone(); this.m_MutationProbability = individual.m_MutationProbability; diff --git a/src/eva2/server/go/individuals/GAIndividualDoubleData.java b/src/eva2/server/go/individuals/GAIndividualDoubleData.java index 70f0138b..de211be9 100644 --- a/src/eva2/server/go/individuals/GAIndividualDoubleData.java +++ b/src/eva2/server/go/individuals/GAIndividualDoubleData.java @@ -6,6 +6,7 @@ import java.util.BitSet; import eva2.server.go.individuals.codings.ga.GAStandardCodingDouble; import eva2.server.go.individuals.codings.ga.InterfaceGADoubleCoding; 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.MutateGAStandard; import eva2.server.go.problems.InterfaceOptimizationProblem; @@ -55,7 +56,7 @@ public class GAIndividualDoubleData extends AbstractEAIndividual implements Inte // cloning the members of AbstractEAIndividual this.m_Age = individual.m_Age; - this.m_CrossoverOperator = individual.m_CrossoverOperator; + this.m_CrossoverOperator = (InterfaceCrossover)individual.m_CrossoverOperator.clone(); this.m_CrossoverProbability = individual.m_CrossoverProbability; this.m_MutationOperator = (InterfaceMutation)individual.m_MutationOperator.clone(); this.m_MutationProbability = individual.m_MutationProbability; diff --git a/src/eva2/server/go/operators/cluster/ClusteringDensityBased.java b/src/eva2/server/go/operators/cluster/ClusteringDensityBased.java index 20a64317..0fd78f04 100644 --- a/src/eva2/server/go/operators/cluster/ClusteringDensityBased.java +++ b/src/eva2/server/go/operators/cluster/ClusteringDensityBased.java @@ -151,7 +151,7 @@ public class ClusteringDensityBased implements InterfaceClustering, java.io.Seri * @param species2 The second species. * @return True if species converge, else False. */ - public boolean convergingSpecies(Population species1, Population species2) { + public boolean mergingSpecies(Population species1, Population species2) { if (m_TestConvergingSpeciesOnBestOnly) { if (this.m_Metric.distance(species1.getBestEAIndividual(), species2.getBestEAIndividual()) < this.m_ClusterDistance) return true; else return false; diff --git a/src/eva2/server/go/operators/cluster/ClusteringHierarchical.java b/src/eva2/server/go/operators/cluster/ClusteringHierarchical.java index 834f2e4a..bf36f4cd 100644 --- a/src/eva2/server/go/operators/cluster/ClusteringHierarchical.java +++ b/src/eva2/server/go/operators/cluster/ClusteringHierarchical.java @@ -167,7 +167,7 @@ public class ClusteringHierarchical implements InterfaceClustering, Serializable * @param species2 The second species. * @return True if species converge, else False. */ - public boolean convergingSpecies(Population species1, Population species2) { + public boolean mergingSpecies(Population species1, Population species2) { if (testConvergingSpeciesOnBestOnly) { if (this.metric.distance(species1.getBestEAIndividual(), species2.getBestEAIndividual()) < this.currentDistThreshold()) return true; else return false; diff --git a/src/eva2/server/go/operators/cluster/ClusteringKMeans.java b/src/eva2/server/go/operators/cluster/ClusteringKMeans.java index 5df406dc..2c5a2dce 100644 --- a/src/eva2/server/go/operators/cluster/ClusteringKMeans.java +++ b/src/eva2/server/go/operators/cluster/ClusteringKMeans.java @@ -24,7 +24,7 @@ public class ClusteringKMeans implements InterfaceClustering, java.io.Serializab public int m_K = 5; public double[][] m_C = null; - public boolean m_UseSearchSpace = false; + public boolean m_UseSearchSpace = true; public boolean m_ReuseC = false; public boolean m_Debug = false; @@ -278,7 +278,7 @@ public class ClusteringKMeans implements InterfaceClustering, java.io.Serializab * @param species2 The second species. * @return True if species converge, else False. */ - public boolean convergingSpecies(Population species1, Population species2) { + public boolean mergingSpecies(Population species1, Population species2) { // @todo i could use the BIC metric from X-means to calculate this return false; } diff --git a/src/eva2/server/go/operators/cluster/ClusteringXMeans.java b/src/eva2/server/go/operators/cluster/ClusteringXMeans.java index b5c7a924..f38be480 100644 --- a/src/eva2/server/go/operators/cluster/ClusteringXMeans.java +++ b/src/eva2/server/go/operators/cluster/ClusteringXMeans.java @@ -221,7 +221,7 @@ public class ClusteringXMeans implements InterfaceClustering, java.io.Serializab * @param species2 The second species. * @return True if species converge, else False. */ - public boolean convergingSpecies(Population species1, Population species2) { + public boolean mergingSpecies(Population species1, Population species2) { // @todo i could use the BIC metric from X-means to calculate this return false; } diff --git a/src/eva2/server/go/operators/cluster/InterfaceClustering.java b/src/eva2/server/go/operators/cluster/InterfaceClustering.java index 15f87141..1ef09280 100644 --- a/src/eva2/server/go/operators/cluster/InterfaceClustering.java +++ b/src/eva2/server/go/operators/cluster/InterfaceClustering.java @@ -35,12 +35,12 @@ public interface InterfaceClustering { */ public Population[] cluster(Population pop); - /** This method allows you to decide if two species converge. + /** This method allows you to decide if two species are to be merged regarding this clustering algorithm. * @param species1 The first species. * @param species2 The second species. * @return True if species converge, else False. */ - public boolean convergingSpecies(Population species1, Population species2); + public boolean mergingSpecies(Population species1, Population species2); /** This method decides if an unclustered individual belongs to an already established species. * @param indy A unclustered individual. diff --git a/src/eva2/server/go/operators/distancemetric/EuclideanMetric.java b/src/eva2/server/go/operators/distancemetric/EuclideanMetric.java index ac4143fa..550dc4af 100644 --- a/src/eva2/server/go/operators/distancemetric/EuclideanMetric.java +++ b/src/eva2/server/go/operators/distancemetric/EuclideanMetric.java @@ -34,7 +34,45 @@ public class EuclideanMetric implements InterfaceDistanceMetric { } return Math.sqrt(result); } + + /** + * The euclidean distance normed by the given ranges lying between 0 and sqrt(n) + * for n dimensions. + * + * @param pos1 + * @param range1 + * @param pos2 + * @param range2 + * @return + */ + public static double normedEuclideanDistance(double[] pos1, double[][] range1, double[] pos2, double[][] range2) { + double tmpResult = 0, tmp=0; + for (int i = 0; (i < pos1.length) && (i < pos2.length); i++) { + tmp=((pos1[i] - range1[i][0])/(range1[i][1] - range1[i][0])) - ((pos2[i] - range2[i][0])/(range2[i][1] - range2[i][0])); + tmpResult += (tmp*tmp); + } + return Math.sqrt(tmpResult); + } + + public static double squaredEuclideanDistance(double[] v1, double[] v2) { + double tmp, result = 0; + for (int i = 0; (i < v1.length) && (i < v2.length); i++) { + tmp=v1[i] - v2[i]; + result += (tmp*tmp); + } + return result; + } + + public static double euclideanDistance(double[] v1, double[] v2) { + double result = 0, tmp=0; + for (int i = 0; (i < v1.length) && (i < v2.length); i++) { + tmp = v1[i] - v2[i]; + result += (tmp*tmp); + } + return Math.sqrt(result); + } + /** This method returns a global info string * @return description */ diff --git a/src/eva2/server/go/operators/distancemetric/PhenotypeMetric.java b/src/eva2/server/go/operators/distancemetric/PhenotypeMetric.java index f807eedb..7cd46e08 100644 --- a/src/eva2/server/go/operators/distancemetric/PhenotypeMetric.java +++ b/src/eva2/server/go/operators/distancemetric/PhenotypeMetric.java @@ -157,34 +157,6 @@ public class PhenotypeMetric implements InterfaceDistanceMetric, java.io.Seriali if (pMetric == null) pMetric = new PhenotypeMetric(); return pMetric.distance(indy1, indy2); } - - public static double euclidianDistance(double[] v1, double[] v2) { - double result = 0, tmp=0; - for (int i = 0; (i < v1.length) && (i < v2.length); i++) { - tmp = v1[i] - v2[i]; - result += (tmp*tmp); - } - return Math.sqrt(result); - } - - public static double squaredEuclidianDistance(double[] v1, double[] v2) { - double tmp, result = 0; - for (int i = 0; (i < v1.length) && (i < v2.length); i++) { - tmp=v1[i] - v2[i]; - result += (tmp*tmp); - } - return result; - } - - public static double normedDistance(double[] pos1, double[][] range1, double[] pos2, double[][] range2) { - double tmpResult = 0, tmp=0; - - for (int i = 0; (i < pos1.length) && (i < pos2.length); i++) { - tmp=((pos1[i] - range1[i][0])/(range1[i][1] - range1[i][0])) - ((pos2[i] - range2[i][0])/(range2[i][1] - range2[i][0])); - tmpResult += (tmp*tmp); - } - return Math.sqrt(tmpResult); - } public static double norm(AbstractEAIndividual indy) { double result = 0; diff --git a/src/eva2/server/go/operators/mutation/MutateESLocal.java b/src/eva2/server/go/operators/mutation/MutateESLocal.java index d8b2ea00..8efdef95 100644 --- a/src/eva2/server/go/operators/mutation/MutateESLocal.java +++ b/src/eva2/server/go/operators/mutation/MutateESLocal.java @@ -202,7 +202,7 @@ public class MutateESLocal implements InterfaceMutation, java.io.Serializable { return this.m_MutationStepSize; } public String mutationStepSizeTipText() { - return "Choose the initial mutation step size."; + return "Choose the initial mutation step size sigma."; } /** Set the lower limit for the mutation step size with this method. diff --git a/src/eva2/server/go/operators/mutation/MutateESSuccessRule.java b/src/eva2/server/go/operators/mutation/MutateESSuccessRule.java index 85773140..fa588bac 100644 --- a/src/eva2/server/go/operators/mutation/MutateESSuccessRule.java +++ b/src/eva2/server/go/operators/mutation/MutateESSuccessRule.java @@ -120,6 +120,11 @@ public class MutateESSuccessRule extends MutateESFixedStepSize implements Interf public String alphaTipText() { return "Choose the factor > 1 by which the mutation step size is to be increased/decreased."; } + + @Override + public String sigmaTipText() { + return "The initial step size."; + } public void adaptAfterSelection(Population oldGen, Population selected) { // nothing to do here diff --git a/src/eva2/server/go/operators/postprocess/PostProcess.java b/src/eva2/server/go/operators/postprocess/PostProcess.java index e8bc6ed6..967f66e8 100644 --- a/src/eva2/server/go/operators/postprocess/PostProcess.java +++ b/src/eva2/server/go/operators/postprocess/PostProcess.java @@ -20,6 +20,7 @@ import eva2.server.go.individuals.InterfaceESIndividual; import eva2.server.go.operators.cluster.ClusteringDensityBased; import eva2.server.go.operators.cluster.InterfaceClustering; import eva2.server.go.operators.crossover.CrossoverESDefault; +import eva2.server.go.operators.distancemetric.EuclideanMetric; import eva2.server.go.operators.distancemetric.InterfaceDistanceMetric; import eva2.server.go.operators.distancemetric.PhenotypeMetric; import eva2.server.go.operators.mutation.InterfaceMutation; @@ -845,7 +846,7 @@ public class PostProcess { clust.SetFunctionCalls(evalsBefore + evalsDone); - double improvement = PhenotypeMetric.euclidianDistance(meanFit, clust.getMeanFitness()); + double improvement = EuclideanMetric.euclideanDistance(meanFit, clust.getMeanFitness()); if (TRACE) System.out.println("improvement by " + improvement + " funcalls done: " + evalsDone); return new Pair(clust, improvement); } @@ -1007,7 +1008,7 @@ public class PostProcess { boolean found=false; for (int k=0; k= 1)) this.m_History.add(this.getBestEAIndividual()); + if (useHistory && (this.size() >= 1)) this.m_History.add((AbstractEAIndividual)this.getBestEAIndividual().clone()); for (int i=0; i curDist))) { dist = curDist; @@ -1411,7 +1417,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea for (int i = 0; i < size(); ++i){ AbstractEAIndividual currentindy = getEAIndividual(i); if (!indy.equals(currentindy)){ // dont compare particle to itself or a copy of itself - double dist = PhenotypeMetric.euclidianDistance(AbstractEAIndividual.getDoublePositionShallow(indy), + double dist = EuclideanMetric.euclideanDistance(AbstractEAIndividual.getDoublePositionShallow(indy), AbstractEAIndividual.getDoublePositionShallow(currentindy)); if (dist < mindist){ mindist = dist; @@ -1448,7 +1454,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea if (normalizedPhenoMetric){ d = metric.distance(indy, neighbor); } else { - d = PhenotypeMetric.euclidianDistance(AbstractEAIndividual.getDoublePositionShallow(indy), + d = EuclideanMetric.euclideanDistance(AbstractEAIndividual.getDoublePositionShallow(indy), AbstractEAIndividual.getDoublePositionShallow(neighbor)); } if (calcVariance) distances.add(d); diff --git a/src/eva2/server/go/problems/AbstractMultiModalProblemKnown.java b/src/eva2/server/go/problems/AbstractMultiModalProblemKnown.java index cc18713f..fd7dfdb7 100644 --- a/src/eva2/server/go/problems/AbstractMultiModalProblemKnown.java +++ b/src/eva2/server/go/problems/AbstractMultiModalProblemKnown.java @@ -17,7 +17,7 @@ import eva2.tools.EVAERROR; public abstract class AbstractMultiModalProblemKnown extends AbstractProblemDouble implements Interface2DBorderProblem, InterfaceMultimodalProblemKnown { protected static InterfaceDistanceMetric m_Metric = new PhenotypeMetric(); private double m_GlobalOpt = 0; - protected Population m_Optima; + protected Population m_ListOfOptima; protected double m_Epsilon = 0.05; // protected double[][] m_Range; // protected double[] m_Extrema; @@ -36,8 +36,8 @@ public abstract class AbstractMultiModalProblemKnown extends AbstractProblemDoub protected void cloneObjects(AbstractMultiModalProblemKnown b) { super.cloneObjects(b); - if (b.m_Optima != null) - this.m_Optima = (Population)((Population)b.m_Optima).clone(); + if (b.m_ListOfOptima != null) + this.m_ListOfOptima = (Population)((Population)b.m_ListOfOptima).clone(); // if (b.m_Range != null) { // this.m_Range = new double[b.m_Range.length][b.m_Range[0].length]; // for (int i = 0; i < this.m_Range.length; i++) { @@ -87,9 +87,9 @@ public abstract class AbstractMultiModalProblemKnown extends AbstractProblemDoub // population init must be last // it set's fitcalls and generation to zero population.init(); - if (m_Optima == null) { + if (m_ListOfOptima == null) { this.m_GlobalOpt = Double.NEGATIVE_INFINITY; - m_Optima = new Population(); + m_ListOfOptima = new Population(); this.initListOfOptima(); } } @@ -97,7 +97,7 @@ public abstract class AbstractMultiModalProblemKnown extends AbstractProblemDoub public void initProblem() { super.initProblem(); this.m_GlobalOpt = Double.NEGATIVE_INFINITY; - m_Optima = new Population(); + m_ListOfOptima = new Population(); this.initListOfOptima(); } @@ -194,7 +194,7 @@ public abstract class AbstractMultiModalProblemKnown extends AbstractProblemDoub m_GlobalOpt = tmp; } } - this.m_Optima.add(tmpIndy); + this.m_ListOfOptima.add(tmpIndy); } /** @@ -210,7 +210,7 @@ public abstract class AbstractMultiModalProblemKnown extends AbstractProblemDoub * @return population */ public Population getRealOptima() { - return this.m_Optima; + return this.m_ListOfOptima; } /** This method returns the Number of Identified optima diff --git a/src/eva2/server/go/problems/AbstractProblemBinary.java b/src/eva2/server/go/problems/AbstractProblemBinary.java index bf3c33fe..fb9cf087 100644 --- a/src/eva2/server/go/problems/AbstractProblemBinary.java +++ b/src/eva2/server/go/problems/AbstractProblemBinary.java @@ -5,6 +5,7 @@ import java.util.BitSet; import eva2.server.go.individuals.AbstractEAIndividual; import eva2.server.go.individuals.GAIndividualBinaryData; import eva2.server.go.individuals.InterfaceDataTypeBinary; +import eva2.server.go.individuals.InterfaceGAIndividual; import eva2.server.go.populations.Population; import eva2.server.go.strategies.InterfaceOptimizer; @@ -16,8 +17,10 @@ public abstract class AbstractProblemBinary extends AbstractOptimizationProblem } protected void initTemplate() { - this.m_Template = new GAIndividualBinaryData(); - ((InterfaceDataTypeBinary)this.m_Template).setBinaryDataLength(this.getProblemDimension()); + if (m_Template == null) this.m_Template = new GAIndividualBinaryData(); + if (((InterfaceGAIndividual)this.m_Template).getGenotypeLength()!=this.getProblemDimension()) { + ((InterfaceDataTypeBinary)this.m_Template).setBinaryDataLength(this.getProblemDimension()); + } } public void cloneObjects(AbstractProblemBinary o) { diff --git a/src/eva2/server/go/problems/ExternalRuntimeProblem.java b/src/eva2/server/go/problems/ExternalRuntimeProblem.java index 0468f9da..55ae54c0 100644 --- a/src/eva2/server/go/problems/ExternalRuntimeProblem.java +++ b/src/eva2/server/go/problems/ExternalRuntimeProblem.java @@ -23,7 +23,7 @@ import eva2.server.go.strategies.InterfaceOptimizer; import eva2.server.go.problems.Interface2DBorderProblem; -public class ExternalRuntimeProblem extends AbstractOptimizationProblem implements Interface2DBorderProblem { +public class ExternalRuntimeProblem extends AbstractOptimizationProblem implements Interface2DBorderProblem, InterfaceProblemDouble { protected AbstractEAIndividual m_OverallBest = null; protected int m_ProblemDimension = 10; @@ -53,8 +53,17 @@ public class ExternalRuntimeProblem extends AbstractOptimizationProblem implemen writer.write(c); writer.flush(); } +// System.out.println("monitor-thread finished!"); } catch (IOException ioe) { ioe.printStackTrace(System.err); + } finally { + try { + reader.close(); + writer.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } } } @@ -115,7 +124,7 @@ public class ExternalRuntimeProblem extends AbstractOptimizationProblem implemen population.init(); } - protected double[][] makeRange() { + public double[][] makeRange() { double[][] range = new double[this.m_ProblemDimension][2]; for (int i = 0; i < range.length; i++) { range[i][0] = getRangeLowerBound(i); @@ -124,11 +133,11 @@ public class ExternalRuntimeProblem extends AbstractOptimizationProblem implemen return range; } - protected double getRangeLowerBound(int dim) { + public double getRangeLowerBound(int dim) { return m_lowerBound; } - protected double getRangeUpperBound(int dim) { + public double getRangeUpperBound(int dim) { return m_upperBound; } @@ -137,14 +146,13 @@ public class ExternalRuntimeProblem extends AbstractOptimizationProblem implemen } /** This method evaluate a single individual and sets the fitness values - * @param individual The individual that is to be evalutated + * @param individual The individual that is to be evaluatated */ public void evaluate(AbstractEAIndividual individual) { double[] x; // double[] fitness; - x = new double[((InterfaceDataTypeDouble) individual).getDoubleData().length]; - System.arraycopy(((InterfaceDataTypeDouble) individual).getDoubleData(), 0, x, 0, x.length); + x = getXVector(individual); //TODO call external runtime double[] fit = eval(x); @@ -158,22 +166,20 @@ public class ExternalRuntimeProblem extends AbstractOptimizationProblem implemen } } - protected double[] eval(double[] x) { + protected double[] getXVector(AbstractEAIndividual individual) { + double[] x; + x = new double[((InterfaceDataTypeDouble) individual).getDoubleData().length]; + System.arraycopy(((InterfaceDataTypeDouble) individual).getDoubleData(), 0, x, 0, x.length); + return x; + } + + public static List runProcess(List parameters, String workingDir) { Process process; ProcessBuilder pb; - - ArrayList fitList = new ArrayList(); + List results = new ArrayList(); try { - List parameters=new ArrayList(); - parameters.add(this.m_Command); - if (additionalArg!=null && (additionalArg.length()>0)) { - parameters.add(additionalArg); - } - for(int i=0;i fitList = new ArrayList(); + + List parameters=new ArrayList(); + parameters.add(this.m_Command); + if (additionalArg!=null && (additionalArg.length()>0)) parameters.add(additionalArg); + for(int i=0;i res = runProcess(parameters, m_WorkingDir); + try { + for (String str : res) { + fitList.add(new Double(str)); + } + } catch (NumberFormatException e) { + System.err.println("Error: " + m_Command + " delivered malformatted output for " + BeanInspector.toString(x)); + e.printStackTrace(); + } + double[] fit = new double[fitList.size()]; + for (int i=0; i 0) && (this.m_Problem instanceof InterfaceLocalSearchable)) { // here the local search is performed if (TRACE) @@ -282,7 +281,9 @@ public class MemeticAlgorithm implements InterfaceOptimizer, * @return description */ public String globalInfo() { - return "This is a basic generational Memetic Algorithm."; + return "This is a basic generational Memetic Algorithm. Local search steps are performed on a selected subset " + + "of individuals after certain numbers of global search iterations. Note " + + "that the problem class must implement InterfaceLocalSearchable."; } /** @@ -291,7 +292,7 @@ public class MemeticAlgorithm implements InterfaceOptimizer, * @return The name of the algorithm */ public String getName() { - return "Memetic-Algorithm"; + return "MemeticAlgorithm"; } /** @@ -332,18 +333,16 @@ public class MemeticAlgorithm implements InterfaceOptimizer, } /** - * Choose the number of local search steps to perform per selected individual + * Choose the number of local search steps to perform per selected individual. * * @param localSearchSteps */ public void setLocalSearchSteps(int localSearchSteps) { this.localSearchSteps = localSearchSteps; } - public int getLocalSearchSteps() { return localSearchSteps; } - public String localSearchStepsTipText() { return "Choose the number of local search steps to perform per selected individual."; } @@ -353,18 +352,20 @@ public class MemeticAlgorithm implements InterfaceOptimizer, * * @param globalSearchSteps */ - public void setGlobalSearchSteps(int globalSearchSteps) { - this.globalSearchSteps = globalSearchSteps; + public void setGlobalSearchIterations(int globalSearchSteps) { + this.globalSearchIterations = globalSearchSteps; } - - public int getGlobalSearchSteps() { - return globalSearchSteps; + public int getGlobalSearchIterations() { + return globalSearchIterations; } - - public String globalSearchStepsTipText() { + public String globalSearchIterationsTipText() { return "Choose the interval between the application of the local search."; } + public InterfaceSolutionSet getAllSolutions() { + return new SolutionSet(getPopulation()); + } + /** * Choose the number of individual to be locally optimized * @@ -373,36 +374,35 @@ public class MemeticAlgorithm implements InterfaceOptimizer, public void setSubsetsize(int subsetsize) { this.subsetsize = subsetsize; } - - public InterfaceSolutionSet getAllSolutions() { - return new SolutionSet(getPopulation()); - } - public int getSubsetsize() { + public int getSubsetsize() { return subsetsize; } - public String subsetsizeTipText() { - return "Choose the number of individual to be locally optimized."; + return "Choose the number of individuals to be locally optimized."; } /** - * Toggel between Lamarcksim and the Baldwin Effect + * Toggle between Lamarckism and the Baldwin Effect * * @param lamarckism */ public void setLamarckism(boolean lamarckism) { this.lamarckism = lamarckism; } - - public boolean getLamarckism() { - return this.lamarckism; - } - public String lamarckismTipText() { - return "Toggel between Lamarcksim and the Baldwin Effect."; + return "Toggle between Lamarckism and the Baldwin Effect."; } - public boolean isLamarckism() { return lamarckism; } + + public InterfaceSelection getSubSetSelector() { + return selectorPlug; + } + public void setSubSetSelector(InterfaceSelection selectorPlug) { + this.selectorPlug = selectorPlug; + } + public String subSetSelectorTipText() { + return "Selection method to select the subset on which local search is to be performed."; + } } diff --git a/src/eva2/server/go/strategies/ParticleSwarmOptimization.java b/src/eva2/server/go/strategies/ParticleSwarmOptimization.java index 499448e5..88016abd 100644 --- a/src/eva2/server/go/strategies/ParticleSwarmOptimization.java +++ b/src/eva2/server/go/strategies/ParticleSwarmOptimization.java @@ -95,7 +95,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se public static final int defaultType = 0; public static final int resetType = 99; transient final static String partTypeKey = "ParticleType"; - transient final static String partBestPosKey = "BestPosition"; + public transient final static String partBestPosKey = "BestPosition"; transient final static String partBestFitKey = "BestFitness"; transient final static String partVelKey = "Velocity"; transient final static String multiSwTypeKey="MultiSwarmType"; @@ -1580,7 +1580,8 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se public void setPopulation(Population pop){ this.m_Population = pop; if (pop.size() != pop.getPopulationSize()) { // new particle count! - init(); + tracedVelocity = null; + initByPopulation(null, false); } else for (int i=0; i