Merging MK revs 383:386 (pimpifications)

This commit is contained in:
Marcel Kronfeld 2009-11-04 09:31:15 +00:00
parent 87b8877d5d
commit 6142b21ea8
29 changed files with 293 additions and 166 deletions

View File

@ -1174,8 +1174,8 @@ public class OptimizerFactory {
es.setPlusStrategy(false); es.setPlusStrategy(false);
cbn.setOptimizer(es); cbn.setOptimizer(es);
ClusteringDensityBased clustering = new ClusteringDensityBased(0.1); ClusteringDensityBased clustering = new ClusteringDensityBased(0.1);
cbn.setConvergenceCA((ClusteringDensityBased) clustering.clone()); cbn.setMergingCA((ClusteringDensityBased) clustering.clone());
cbn.setDifferentationCA(clustering); cbn.setDifferentiationCA(clustering);
cbn.setShowCycle(0); // don't do graphical output cbn.setShowCycle(0); // don't do graphical output
return makeParams(cbn, 100, problem, randSeed, makeDefaultTerminator()); return makeParams(cbn, 100, problem, randSeed, makeDefaultTerminator());
@ -1186,8 +1186,8 @@ public class OptimizerFactory {
GeneticAlgorithm ga = new GeneticAlgorithm(); GeneticAlgorithm ga = new GeneticAlgorithm();
cbn.setOptimizer(ga); cbn.setOptimizer(ga);
ClusteringDensityBased clustering = new ClusteringDensityBased(0.1); ClusteringDensityBased clustering = new ClusteringDensityBased(0.1);
cbn.setConvergenceCA((ClusteringDensityBased) clustering.clone()); cbn.setMergingCA((ClusteringDensityBased) clustering.clone());
cbn.setDifferentationCA(clustering); cbn.setDifferentiationCA(clustering);
cbn.setShowCycle(0); // don't do graphical output cbn.setShowCycle(0); // don't do graphical output
return makeParams(cbn, 100, problem, randSeed, makeDefaultTerminator()); return makeParams(cbn, 100, problem, randSeed, makeDefaultTerminator());

View File

@ -73,7 +73,7 @@ public class GOEPanel extends JPanel implements ItemListener {
m_Support = support; m_Support = support;
m_goe = goe; 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); if (!(Proxy.isProxyClass(m_Object.getClass()))) m_Backup = copyObject(m_Object);
m_ObjectNames = new DefaultComboBoxModel(new String [0]); m_ObjectNames = new DefaultComboBoxModel(new String [0]);
m_ObjectChooser = new JComboBox(m_ObjectNames); m_ObjectChooser = new JComboBox(m_ObjectNames);

View File

@ -29,7 +29,7 @@ import eva2.tools.jproxy.RMIProxyLocal;
* CLASS DECLARATION * CLASS DECLARATION
*==========================================================================*/ *==========================================================================*/
/** /**
* * Collect available ModuleAdapter implementations and load them on request.
*/ */
public class ModuleServer { public class ModuleServer {
public static boolean TRACE = false; 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, public ModuleAdapter createModuleAdapter(String selectedModuleName,
MainAdapterClient Client, boolean runWithoutRMI, MainAdapterClient Client, boolean runWithoutRMI,

View File

@ -53,8 +53,8 @@ public abstract class AbstractEAIndividual implements IndividualInterface, java.
public boolean m_isPenalized = false; // may be set true for penalty based constraints public boolean m_isPenalized = false; // may be set true for penalty based constraints
protected double[] m_SelectionProbability = new double[1];; protected double[] m_SelectionProbability = new double[1];;
public double m_CrossoverProbability = 1.0; protected double m_CrossoverProbability = 1.0;
public double m_MutationProbability = 0.2; protected double m_MutationProbability = 0.2;
protected InterfaceMutation m_MutationOperator = new NoMutation(); protected InterfaceMutation m_MutationOperator = new NoMutation();
protected InterfaceCrossover m_CrossoverOperator = new NoCrossover(); protected InterfaceCrossover m_CrossoverOperator = new NoCrossover();
// protected String[] m_Identifiers = new String[m_ObjectIncrement]; // protected String[] m_Identifiers = new String[m_ObjectIncrement];

View File

@ -23,7 +23,7 @@ import java.util.Comparator;
public class AbstractEAIndividualComparator implements Comparator<Object>, Serializable { public class AbstractEAIndividualComparator implements Comparator<Object>, Serializable {
// flag whether a data field should be used. // flag whether a data field should be used.
String indyDataKey = null; String indyDataKey = "";
int fitCriterion = -1; int fitCriterion = -1;
/** /**
@ -34,7 +34,7 @@ public class AbstractEAIndividualComparator implements Comparator<Object>, Seria
* *
*/ */
public AbstractEAIndividualComparator() { public AbstractEAIndividualComparator() {
this(null, -1); this("", -1);
} }
/** /**
@ -57,7 +57,7 @@ public class AbstractEAIndividualComparator implements Comparator<Object>, Seria
* @param fitnessCriterion * @param fitnessCriterion
*/ */
public AbstractEAIndividualComparator(int fitnessCriterion) { public AbstractEAIndividualComparator(int fitnessCriterion) {
this(null, fitnessCriterion); this("", fitnessCriterion);
} }
/** /**
@ -92,7 +92,7 @@ public class AbstractEAIndividualComparator implements Comparator<Object>, Seria
public int compare(Object o1, Object o2) { public int compare(Object o1, Object o2) {
boolean o1domO2, o2domO1; boolean o1domO2, o2domO1;
if (indyDataKey != null) { if (indyDataKey != null && (indyDataKey.length()>0)) {
double[] fit1 = (double[])((AbstractEAIndividual)o1).getData(indyDataKey); double[] fit1 = (double[])((AbstractEAIndividual)o1).getData(indyDataKey);
double[] fit2 = (double[])((AbstractEAIndividual)o2).getData(indyDataKey); double[] fit2 = (double[])((AbstractEAIndividual)o2).getData(indyDataKey);
if (fitCriterion < 0) { if (fitCriterion < 0) {
@ -114,4 +114,31 @@ public class AbstractEAIndividualComparator implements Comparator<Object>, Seria
if (o1domO2 ^ o2domO1) return (o1domO2 ? -1 : 1); if (o1domO2 ^ o2domO1) return (o1domO2 ? -1 : 1);
else return 0; // these are not comparable 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";
}
} }

View File

@ -4,6 +4,7 @@ package eva2.server.go.individuals;
import java.util.BitSet; import java.util.BitSet;
import eva2.server.go.operators.crossover.CrossoverGANPoint; 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.InterfaceMutation;
import eva2.server.go.operators.mutation.MutateGAStandard; import eva2.server.go.operators.mutation.MutateGAStandard;
import eva2.server.go.problems.InterfaceOptimizationProblem; import eva2.server.go.problems.InterfaceOptimizationProblem;
@ -40,7 +41,7 @@ public class GAIndividualBinaryData extends AbstractEAIndividual implements Inte
// cloning the members of AbstractEAIndividual // cloning the members of AbstractEAIndividual
this.m_Age = individual.m_Age; 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_CrossoverProbability = individual.m_CrossoverProbability;
this.m_MutationOperator = (InterfaceMutation)individual.m_MutationOperator.clone(); this.m_MutationOperator = (InterfaceMutation)individual.m_MutationOperator.clone();
this.m_MutationProbability = individual.m_MutationProbability; this.m_MutationProbability = individual.m_MutationProbability;

View File

@ -6,6 +6,7 @@ import java.util.BitSet;
import eva2.server.go.individuals.codings.ga.GAStandardCodingDouble; import eva2.server.go.individuals.codings.ga.GAStandardCodingDouble;
import eva2.server.go.individuals.codings.ga.InterfaceGADoubleCoding; import eva2.server.go.individuals.codings.ga.InterfaceGADoubleCoding;
import eva2.server.go.operators.crossover.CrossoverGANPoint; 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.InterfaceMutation;
import eva2.server.go.operators.mutation.MutateGAStandard; import eva2.server.go.operators.mutation.MutateGAStandard;
import eva2.server.go.problems.InterfaceOptimizationProblem; import eva2.server.go.problems.InterfaceOptimizationProblem;
@ -55,7 +56,7 @@ public class GAIndividualDoubleData extends AbstractEAIndividual implements Inte
// cloning the members of AbstractEAIndividual // cloning the members of AbstractEAIndividual
this.m_Age = individual.m_Age; 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_CrossoverProbability = individual.m_CrossoverProbability;
this.m_MutationOperator = (InterfaceMutation)individual.m_MutationOperator.clone(); this.m_MutationOperator = (InterfaceMutation)individual.m_MutationOperator.clone();
this.m_MutationProbability = individual.m_MutationProbability; this.m_MutationProbability = individual.m_MutationProbability;

View File

@ -151,7 +151,7 @@ public class ClusteringDensityBased implements InterfaceClustering, java.io.Seri
* @param species2 The second species. * @param species2 The second species.
* @return True if species converge, else False. * @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 (m_TestConvergingSpeciesOnBestOnly) {
if (this.m_Metric.distance(species1.getBestEAIndividual(), species2.getBestEAIndividual()) < this.m_ClusterDistance) return true; if (this.m_Metric.distance(species1.getBestEAIndividual(), species2.getBestEAIndividual()) < this.m_ClusterDistance) return true;
else return false; else return false;

View File

@ -167,7 +167,7 @@ public class ClusteringHierarchical implements InterfaceClustering, Serializable
* @param species2 The second species. * @param species2 The second species.
* @return True if species converge, else False. * @return True if species converge, else False.
*/ */
public boolean convergingSpecies(Population species1, Population species2) { public boolean mergingSpecies(Population species1, Population species2) {
if (testConvergingSpeciesOnBestOnly) { if (testConvergingSpeciesOnBestOnly) {
if (this.metric.distance(species1.getBestEAIndividual(), species2.getBestEAIndividual()) < this.currentDistThreshold()) return true; if (this.metric.distance(species1.getBestEAIndividual(), species2.getBestEAIndividual()) < this.currentDistThreshold()) return true;
else return false; else return false;

View File

@ -24,7 +24,7 @@ public class ClusteringKMeans implements InterfaceClustering, java.io.Serializab
public int m_K = 5; public int m_K = 5;
public double[][] m_C = null; public double[][] m_C = null;
public boolean m_UseSearchSpace = false; public boolean m_UseSearchSpace = true;
public boolean m_ReuseC = false; public boolean m_ReuseC = false;
public boolean m_Debug = false; public boolean m_Debug = false;
@ -278,7 +278,7 @@ public class ClusteringKMeans implements InterfaceClustering, java.io.Serializab
* @param species2 The second species. * @param species2 The second species.
* @return True if species converge, else False. * @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 // @todo i could use the BIC metric from X-means to calculate this
return false; return false;
} }

View File

@ -221,7 +221,7 @@ public class ClusteringXMeans implements InterfaceClustering, java.io.Serializab
* @param species2 The second species. * @param species2 The second species.
* @return True if species converge, else False. * @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 // @todo i could use the BIC metric from X-means to calculate this
return false; return false;
} }

View File

@ -35,12 +35,12 @@ public interface InterfaceClustering {
*/ */
public Population[] cluster(Population pop); 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 species1 The first species.
* @param species2 The second species. * @param species2 The second species.
* @return True if species converge, else False. * @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. /** This method decides if an unclustered individual belongs to an already established species.
* @param indy A unclustered individual. * @param indy A unclustered individual.

View File

@ -35,6 +35,44 @@ public class EuclideanMetric implements InterfaceDistanceMetric {
return Math.sqrt(result); 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 /** This method returns a global info string
* @return description * @return description
*/ */

View File

@ -158,34 +158,6 @@ public class PhenotypeMetric implements InterfaceDistanceMetric, java.io.Seriali
return pMetric.distance(indy1, indy2); 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) { public static double norm(AbstractEAIndividual indy) {
double result = 0; double result = 0;
if (indy instanceof InterfaceDataTypeBinary) { if (indy instanceof InterfaceDataTypeBinary) {

View File

@ -202,7 +202,7 @@ public class MutateESLocal implements InterfaceMutation, java.io.Serializable {
return this.m_MutationStepSize; return this.m_MutationStepSize;
} }
public String mutationStepSizeTipText() { 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. /** Set the lower limit for the mutation step size with this method.

View File

@ -121,6 +121,11 @@ public class MutateESSuccessRule extends MutateESFixedStepSize implements Interf
return "Choose the factor > 1 by which the mutation step size is to be increased/decreased."; 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) { public void adaptAfterSelection(Population oldGen, Population selected) {
// nothing to do here // nothing to do here
} }

View File

@ -20,6 +20,7 @@ import eva2.server.go.individuals.InterfaceESIndividual;
import eva2.server.go.operators.cluster.ClusteringDensityBased; import eva2.server.go.operators.cluster.ClusteringDensityBased;
import eva2.server.go.operators.cluster.InterfaceClustering; import eva2.server.go.operators.cluster.InterfaceClustering;
import eva2.server.go.operators.crossover.CrossoverESDefault; 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.InterfaceDistanceMetric;
import eva2.server.go.operators.distancemetric.PhenotypeMetric; import eva2.server.go.operators.distancemetric.PhenotypeMetric;
import eva2.server.go.operators.mutation.InterfaceMutation; import eva2.server.go.operators.mutation.InterfaceMutation;
@ -845,7 +846,7 @@ public class PostProcess {
clust.SetFunctionCalls(evalsBefore + evalsDone); 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); if (TRACE) System.out.println("improvement by " + improvement + " funcalls done: " + evalsDone);
return new Pair<Population, Double>(clust, improvement); return new Pair<Population, Double>(clust, improvement);
} }
@ -1007,7 +1008,7 @@ public class PostProcess {
boolean found=false; boolean found=false;
for (int k=0; k<candidates.size(); k++) { for (int k=0; k<candidates.size(); k++) {
if (k!=i) { if (k!=i) {
double dist = PhenotypeMetric.euclidianDistance(AbstractEAIndividual.getDoublePositionShallow(indy), AbstractEAIndividual.getDoublePositionShallow(candidates.getEAIndividual(k))); double dist = EuclideanMetric.euclideanDistance(AbstractEAIndividual.getDoublePositionShallow(indy), AbstractEAIndividual.getDoublePositionShallow(candidates.getEAIndividual(k)));
if (dist == 0.) { if (dist == 0.) {
// System.err.println("error, equal candidates in findNMSPerturb!"); // System.err.println("error, equal candidates in findNMSPerturb!");
} else if (dist < minDistNeighbour) { } else if (dist < minDistNeighbour) {
@ -1093,7 +1094,7 @@ public class PostProcess {
else { else {
double[] indyPos = AbstractEAIndividual.getDoublePositionShallow(pop.getEAIndividual(index)); double[] indyPos = AbstractEAIndividual.getDoublePositionShallow(pop.getEAIndividual(index));
for (int i=0; i<pop.size(); i++) { for (int i=0; i<pop.size(); i++) {
if (i!=index) distSum += PhenotypeMetric.euclidianDistance(AbstractEAIndividual.getDoublePositionShallow(pop.getEAIndividual(i)), indyPos); if (i!=index) distSum += EuclideanMetric.euclideanDistance(AbstractEAIndividual.getDoublePositionShallow(pop.getEAIndividual(i)), indyPos);
} }
return distSum/((double)cnt); return distSum/((double)cnt);
} }

View File

@ -16,9 +16,9 @@ package eva2.server.go.operators.terminators;
import java.io.Serializable; import java.io.Serializable;
import eva2.gui.BeanInspector; import eva2.gui.BeanInspector;
import eva2.server.go.IndividualInterface;
import eva2.server.go.InterfaceTerminator; import eva2.server.go.InterfaceTerminator;
import eva2.server.go.PopulationInterface; import eva2.server.go.PopulationInterface;
import eva2.server.go.operators.distancemetric.EuclideanMetric;
import eva2.server.go.operators.distancemetric.PhenotypeMetric; import eva2.server.go.operators.distancemetric.PhenotypeMetric;
import eva2.server.go.populations.InterfaceSolutionSet; import eva2.server.go.populations.InterfaceSolutionSet;
import eva2.server.go.problems.InterfaceOptimizationProblem; import eva2.server.go.problems.InterfaceOptimizationProblem;
@ -139,7 +139,7 @@ Serializable {
*/ */
protected boolean isStillConverged(PopulationInterface pop) { protected boolean isStillConverged(PopulationInterface pop) {
double[] curFit = pop.getBestFitness(); double[] curFit = pop.getBestFitness();
double dist = PhenotypeMetric.euclidianDistance(oldFit, curFit); double dist = EuclideanMetric.euclideanDistance(oldFit, curFit);
boolean ret; boolean ret;
if (convergenceCondition.isSelectedString("Relative")) { if (convergenceCondition.isSelectedString("Relative")) {
ret = (dist < (oldNorm * convThresh)); ret = (dist < (oldNorm * convThresh));

View File

@ -15,6 +15,7 @@ import eva2.server.go.individuals.AbstractEAIndividual;
import eva2.server.go.individuals.AbstractEAIndividualComparator; import eva2.server.go.individuals.AbstractEAIndividualComparator;
import eva2.server.go.individuals.GAIndividualBinaryData; import eva2.server.go.individuals.GAIndividualBinaryData;
import eva2.server.go.individuals.InterfaceDataTypeDouble; import eva2.server.go.individuals.InterfaceDataTypeDouble;
import eva2.server.go.operators.distancemetric.EuclideanMetric;
import eva2.server.go.operators.distancemetric.InterfaceDistanceMetric; import eva2.server.go.operators.distancemetric.InterfaceDistanceMetric;
import eva2.server.go.operators.distancemetric.PhenotypeMetric; import eva2.server.go.operators.distancemetric.PhenotypeMetric;
import eva2.server.go.operators.selection.probability.AbstractSelProb; import eva2.server.go.operators.selection.probability.AbstractSelProb;
@ -26,7 +27,14 @@ import eva2.tools.math.Jama.Matrix;
import eva2.tools.tool.StatisticUtils; import eva2.tools.tool.StatisticUtils;
/** This is a basic implementation for a EA Population. /**
* A basic implementation of an EA population. Manage a set of potential solutions
* in form of AbstractEAIndividuals. They can be sorted using an AbstractEAIndividualComparator.
* Optionally, a history list is kept storing a clone of the best individual of any generation.
* The Population also provides for appropriate counting of function calls performed.
* For initialization, the default individual initialization method may be used, as well as a
* random latin hypercube implementation for InterfaceDataTypeDouble individuals.
*
* Copyright: Copyright (c) 2003 * Copyright: Copyright (c) 2003
* Company: University of Tuebingen, Computer Architecture * Company: University of Tuebingen, Computer Architecture
* @author Felix Streichert, Marcel Kronfeld * @author Felix Streichert, Marcel Kronfeld
@ -342,7 +350,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
* Stagnation measured etc. pp. * Stagnation measured etc. pp.
*/ */
public void incrGeneration() { public void incrGeneration() {
if (useHistory && (this.size() >= 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<size(); i++) ((AbstractEAIndividual)get(i)).incrAge(); for (int i=0; i<size(); i++) ((AbstractEAIndividual)get(i)).incrAge();
this.m_Generation++; this.m_Generation++;
firePropertyChangedEvent(nextGenerationPerformed); firePropertyChangedEvent(nextGenerationPerformed);
@ -947,9 +955,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
} }
} }
/** This method will remove double instances from the population. /** This method will remove instances with equal fitness from the population.
* This method relies on the implementation of the equals method
* in the individuals.
*/ */
public void removeDoubleInstancesUsingFitness() { public void removeDoubleInstancesUsingFitness() {
for (int i = 0; i < this.size(); i++) { for (int i = 0; i < this.size(); i++) {
@ -1255,7 +1261,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
for (int i = 0; i < this.size(); i++) { for (int i = 0; i < this.size(); i++) {
for (int j = i+1; j < this.size(); j++) { for (int j = i+1; j < this.size(); j++) {
if (metric == null) d = PhenotypeMetric.euclidianDistance(AbstractEAIndividual.getDoublePositionShallow(getEAIndividual(i)), if (metric == null) d = EuclideanMetric.euclideanDistance(AbstractEAIndividual.getDoublePositionShallow(getEAIndividual(i)),
AbstractEAIndividual.getDoublePositionShallow(getEAIndividual(j))); AbstractEAIndividual.getDoublePositionShallow(getEAIndividual(j)));
else d = metric.distance((AbstractEAIndividual)this.get(i), (AbstractEAIndividual)this.get(j)); else d = metric.distance((AbstractEAIndividual)this.get(i), (AbstractEAIndividual)this.get(j));
meanDist += d; meanDist += d;
@ -1329,7 +1335,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
for (int i = 0; i < pop.size(); i++) { for (int i = 0; i < pop.size(); i++) {
AbstractEAIndividual indy = pop.getEAIndividual(i); AbstractEAIndividual indy = pop.getEAIndividual(i);
double[] indyPos = AbstractEAIndividual.getDoublePositionShallow(indy); double[] indyPos = AbstractEAIndividual.getDoublePositionShallow(indy);
double curDist = PhenotypeMetric.euclidianDistance(pos, indyPos); double curDist = EuclideanMetric.euclideanDistance(pos, indyPos);
if ((dist<0) || (!closestOrFarthest && (dist < curDist)) if ((dist<0) || (!closestOrFarthest && (dist < curDist))
|| (closestOrFarthest && (dist > curDist))) { || (closestOrFarthest && (dist > curDist))) {
dist = curDist; dist = curDist;
@ -1411,7 +1417,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
for (int i = 0; i < size(); ++i){ for (int i = 0; i < size(); ++i){
AbstractEAIndividual currentindy = getEAIndividual(i); AbstractEAIndividual currentindy = getEAIndividual(i);
if (!indy.equals(currentindy)){ // dont compare particle to itself or a copy of itself 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)); AbstractEAIndividual.getDoublePositionShallow(currentindy));
if (dist < mindist){ if (dist < mindist){
mindist = dist; mindist = dist;
@ -1448,7 +1454,7 @@ public class Population extends ArrayList implements PopulationInterface, Clonea
if (normalizedPhenoMetric){ if (normalizedPhenoMetric){
d = metric.distance(indy, neighbor); d = metric.distance(indy, neighbor);
} else { } else {
d = PhenotypeMetric.euclidianDistance(AbstractEAIndividual.getDoublePositionShallow(indy), d = EuclideanMetric.euclideanDistance(AbstractEAIndividual.getDoublePositionShallow(indy),
AbstractEAIndividual.getDoublePositionShallow(neighbor)); AbstractEAIndividual.getDoublePositionShallow(neighbor));
} }
if (calcVariance) distances.add(d); if (calcVariance) distances.add(d);

View File

@ -17,7 +17,7 @@ import eva2.tools.EVAERROR;
public abstract class AbstractMultiModalProblemKnown extends AbstractProblemDouble implements Interface2DBorderProblem, InterfaceMultimodalProblemKnown { public abstract class AbstractMultiModalProblemKnown extends AbstractProblemDouble implements Interface2DBorderProblem, InterfaceMultimodalProblemKnown {
protected static InterfaceDistanceMetric m_Metric = new PhenotypeMetric(); protected static InterfaceDistanceMetric m_Metric = new PhenotypeMetric();
private double m_GlobalOpt = 0; private double m_GlobalOpt = 0;
protected Population m_Optima; protected Population m_ListOfOptima;
protected double m_Epsilon = 0.05; protected double m_Epsilon = 0.05;
// protected double[][] m_Range; // protected double[][] m_Range;
// protected double[] m_Extrema; // protected double[] m_Extrema;
@ -36,8 +36,8 @@ public abstract class AbstractMultiModalProblemKnown extends AbstractProblemDoub
protected void cloneObjects(AbstractMultiModalProblemKnown b) { protected void cloneObjects(AbstractMultiModalProblemKnown b) {
super.cloneObjects(b); super.cloneObjects(b);
if (b.m_Optima != null) if (b.m_ListOfOptima != null)
this.m_Optima = (Population)((Population)b.m_Optima).clone(); this.m_ListOfOptima = (Population)((Population)b.m_ListOfOptima).clone();
// if (b.m_Range != null) { // if (b.m_Range != null) {
// this.m_Range = new double[b.m_Range.length][b.m_Range[0].length]; // this.m_Range = new double[b.m_Range.length][b.m_Range[0].length];
// for (int i = 0; i < this.m_Range.length; i++) { // 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 // population init must be last
// it set's fitcalls and generation to zero // it set's fitcalls and generation to zero
population.init(); population.init();
if (m_Optima == null) { if (m_ListOfOptima == null) {
this.m_GlobalOpt = Double.NEGATIVE_INFINITY; this.m_GlobalOpt = Double.NEGATIVE_INFINITY;
m_Optima = new Population(); m_ListOfOptima = new Population();
this.initListOfOptima(); this.initListOfOptima();
} }
} }
@ -97,7 +97,7 @@ public abstract class AbstractMultiModalProblemKnown extends AbstractProblemDoub
public void initProblem() { public void initProblem() {
super.initProblem(); super.initProblem();
this.m_GlobalOpt = Double.NEGATIVE_INFINITY; this.m_GlobalOpt = Double.NEGATIVE_INFINITY;
m_Optima = new Population(); m_ListOfOptima = new Population();
this.initListOfOptima(); this.initListOfOptima();
} }
@ -194,7 +194,7 @@ public abstract class AbstractMultiModalProblemKnown extends AbstractProblemDoub
m_GlobalOpt = tmp; 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 * @return population
*/ */
public Population getRealOptima() { public Population getRealOptima() {
return this.m_Optima; return this.m_ListOfOptima;
} }
/** This method returns the Number of Identified optima /** This method returns the Number of Identified optima

View File

@ -5,6 +5,7 @@ import java.util.BitSet;
import eva2.server.go.individuals.AbstractEAIndividual; import eva2.server.go.individuals.AbstractEAIndividual;
import eva2.server.go.individuals.GAIndividualBinaryData; import eva2.server.go.individuals.GAIndividualBinaryData;
import eva2.server.go.individuals.InterfaceDataTypeBinary; import eva2.server.go.individuals.InterfaceDataTypeBinary;
import eva2.server.go.individuals.InterfaceGAIndividual;
import eva2.server.go.populations.Population; import eva2.server.go.populations.Population;
import eva2.server.go.strategies.InterfaceOptimizer; import eva2.server.go.strategies.InterfaceOptimizer;
@ -16,8 +17,10 @@ public abstract class AbstractProblemBinary extends AbstractOptimizationProblem
} }
protected void initTemplate() { protected void initTemplate() {
this.m_Template = new GAIndividualBinaryData(); if (m_Template == null) this.m_Template = new GAIndividualBinaryData();
((InterfaceDataTypeBinary)this.m_Template).setBinaryDataLength(this.getProblemDimension()); if (((InterfaceGAIndividual)this.m_Template).getGenotypeLength()!=this.getProblemDimension()) {
((InterfaceDataTypeBinary)this.m_Template).setBinaryDataLength(this.getProblemDimension());
}
} }
public void cloneObjects(AbstractProblemBinary o) { public void cloneObjects(AbstractProblemBinary o) {

View File

@ -23,7 +23,7 @@ import eva2.server.go.strategies.InterfaceOptimizer;
import eva2.server.go.problems.Interface2DBorderProblem; 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 AbstractEAIndividual m_OverallBest = null;
protected int m_ProblemDimension = 10; protected int m_ProblemDimension = 10;
@ -53,8 +53,17 @@ public class ExternalRuntimeProblem extends AbstractOptimizationProblem implemen
writer.write(c); writer.write(c);
writer.flush(); writer.flush();
} }
// System.out.println("monitor-thread finished!");
} catch (IOException ioe) { } catch (IOException ioe) {
ioe.printStackTrace(System.err); 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(); population.init();
} }
protected double[][] makeRange() { public double[][] makeRange() {
double[][] range = new double[this.m_ProblemDimension][2]; double[][] range = new double[this.m_ProblemDimension][2];
for (int i = 0; i < range.length; i++) { for (int i = 0; i < range.length; i++) {
range[i][0] = getRangeLowerBound(i); range[i][0] = getRangeLowerBound(i);
@ -124,11 +133,11 @@ public class ExternalRuntimeProblem extends AbstractOptimizationProblem implemen
return range; return range;
} }
protected double getRangeLowerBound(int dim) { public double getRangeLowerBound(int dim) {
return m_lowerBound; return m_lowerBound;
} }
protected double getRangeUpperBound(int dim) { public double getRangeUpperBound(int dim) {
return m_upperBound; return m_upperBound;
} }
@ -137,14 +146,13 @@ public class ExternalRuntimeProblem extends AbstractOptimizationProblem implemen
} }
/** This method evaluate a single individual and sets the fitness values /** 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) { public void evaluate(AbstractEAIndividual individual) {
double[] x; double[] x;
// double[] fitness; // double[] fitness;
x = new double[((InterfaceDataTypeDouble) individual).getDoubleData().length]; x = getXVector(individual);
System.arraycopy(((InterfaceDataTypeDouble) individual).getDoubleData(), 0, x, 0, x.length);
//TODO call external runtime //TODO call external runtime
double[] fit = eval(x); 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<String> runProcess(List<String> parameters, String workingDir) {
Process process; Process process;
ProcessBuilder pb; ProcessBuilder pb;
List<String> results = new ArrayList<String>();
ArrayList<Double> fitList = new ArrayList<Double>();
try { try {
List<String> parameters=new ArrayList<String>();
parameters.add(this.m_Command);
if (additionalArg!=null && (additionalArg.length()>0)) {
parameters.add(additionalArg);
}
for(int i=0;i<this.m_ProblemDimension;i++){
parameters.add(new String(""+x[i]));
}
pb = new ProcessBuilder(parameters); pb = new ProcessBuilder(parameters);
pb.directory(new File(this.m_WorkingDir)); pb.directory(new File(workingDir));
process=pb.start(); process=pb.start();
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
Thread thread = new MonitorInputStreamThread(process.getErrorStream());//grab the Error Stream Thread thread = new MonitorInputStreamThread(process.getErrorStream());//grab the Error Stream
@ -184,24 +190,58 @@ public class ExternalRuntimeProblem extends AbstractOptimizationProblem implemen
if (line.contains(" ")) { if (line.contains(" ")) {
String[] parts = line.split(" "); String[] parts = line.split(" ");
for (String str : parts) { for (String str : parts) {
fitList.add(new Double(str)); results.add(str);
} }
} else { } else {
fitList.add(new Double(line)); results.add(line);
} }
} }
br.close();
} catch (IOException e) { } catch (IOException e) {
System.err.println("IO Error in ExternalRuntimeProblem!"); System.err.println("IO Error when calling external command!");
e.printStackTrace();
} catch (NumberFormatException e) {
System.err.println("Error: " + m_Command + " delivered malformatted output for " + BeanInspector.toString(x));
e.printStackTrace(); e.printStackTrace();
} }
double[] fit = new double[fitList.size()]; return results;
for (int i=0; i<fit.length; i++) { }
fit[i] = fitList.get(i);
} public double[] eval(double[] x) {
return fit; if (x==null) throw new RuntimeException("Error, x=null value received in ExternalRuntimeProblem.eval");
ArrayList<Double> fitList = new ArrayList<Double>();
List<String> parameters=new ArrayList<String>();
parameters.add(this.m_Command);
if (additionalArg!=null && (additionalArg.length()>0)) parameters.add(additionalArg);
for(int i=0;i<this.m_ProblemDimension;i++){
String p = prepareParameter(x, i);
parameters.add(p);
}
List<String> 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<fit.length; i++) {
fit[i] = fitList.get(i);
}
return fit;
}
/**
* How to prepare a given parameter within a double array to present it
* to the external program.
*
* @param x
* @param i
* @return
*/
protected String prepareParameter(double[] x, int i) {
return new String(""+x[i]);
} }
/** This method returns a string describing the optimization problem. /** This method returns a string describing the optimization problem.

View File

@ -13,9 +13,18 @@ import eva2.server.go.populations.Population;
public interface InterfaceLocalSearchable extends InterfaceOptimizationProblem { public interface InterfaceLocalSearchable extends InterfaceOptimizationProblem {
/**
* Perform a single local search step on each of the given individuals.
*
* @param pop
*/
public void doLocalSearch(Population pop); public void doLocalSearch(Population pop);
/**
* Estimate the cost of one local search step -- more precisely the cost of the doLocalSearch call per one individual.
*
* @return
*/
public double getLocalSearchStepFunctionCallEquivalent(); public double getLocalSearchStepFunctionCallEquivalent();
} }

View File

@ -5,6 +5,7 @@ import java.util.ArrayList;
import eva2.gui.BeanInspector; import eva2.gui.BeanInspector;
import eva2.gui.Chart2DDPointIconCircle; import eva2.gui.Chart2DDPointIconCircle;
import eva2.gui.Chart2DDPointIconText; import eva2.gui.Chart2DDPointIconText;
import eva2.gui.GenericObjectEditor;
import eva2.gui.GraphPointSet; import eva2.gui.GraphPointSet;
import eva2.gui.Plot; import eva2.gui.Plot;
import eva2.gui.TopoPlot; import eva2.gui.TopoPlot;
@ -65,7 +66,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
// private boolean m_UseClearing = false; // private boolean m_UseClearing = false;
private boolean m_UseArchive = true; private boolean m_UseArchive = true;
private boolean m_UseSpeciesDifferentation = true; private boolean m_UseSpeciesDifferentation = true;
private boolean m_UseSpeciesConvergence = true; private boolean m_UseSpeciesMerging = true;
// private boolean m_UseHaltingWindow = true; // private boolean m_UseHaltingWindow = true;
private int m_PopulationSize = 50; private int m_PopulationSize = 50;
private int convergedCnt = 0; private int convergedCnt = 0;
@ -96,7 +97,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
this.m_minGroupSize = a.m_minGroupSize; this.m_minGroupSize = a.m_minGroupSize;
// this.m_UseClearing = a.m_UseClearing; // this.m_UseClearing = a.m_UseClearing;
this.m_UseSpeciesDifferentation = a.m_UseSpeciesDifferentation; this.m_UseSpeciesDifferentation = a.m_UseSpeciesDifferentation;
this.m_UseSpeciesConvergence = a.m_UseSpeciesConvergence; this.m_UseSpeciesMerging = a.m_UseSpeciesMerging;
// this.m_UseHaltingWindow = a.m_UseHaltingWindow; // this.m_UseHaltingWindow = a.m_UseHaltingWindow;
this.m_PopulationSize = a.m_PopulationSize; this.m_PopulationSize = a.m_PopulationSize;
this.haltingWindow = a.haltingWindow; this.haltingWindow = a.haltingWindow;
@ -141,6 +142,10 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
this.firePropertyChangedEvent("FirstGenerationPerformed"); this.firePropertyChangedEvent("FirstGenerationPerformed");
} }
public void hideHideable() {
GenericObjectEditor.setHideProperty(this.getClass(), "population", true);
setUseMerging(isUseMerging());
}
/** This method will evaluate the current population using the /** This method will evaluate the current population using the
* given problem. * given problem.
* @param population The population that is to be evaluated * @param population The population that is to be evaluated
@ -511,7 +516,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
//if (this.m_Show) this.plot(); //if (this.m_Show) this.plot();
} }
if (this.m_UseSpeciesConvergence) { if (this.m_UseSpeciesMerging) {
///////////////////////////// species convergence phase ///////////////////////////// species convergence phase
if (TRACE) { if (TRACE) {
System.out.println("-Species convergence:"); System.out.println("-Species convergence:");
@ -549,7 +554,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
spec1 = (Population)this.m_Species.get(i1); spec1 = (Population)this.m_Species.get(i1);
for (int i2 = i1+1; i2 < this.m_Species.size(); i2++) { for (int i2 = i1+1; i2 < this.m_Species.size(); i2++) {
spec2 = (Population)this.m_Species.get(i2); spec2 = (Population)this.m_Species.get(i2);
if (this.m_CAForSpeciesConvergence.convergingSpecies(spec1, spec2)) { if (this.m_CAForSpeciesConvergence.mergingSpecies(spec1, spec2)) {
if (TRACE) System.out.println("--------------------Merging species (" + i1 +", " +i2 +") ["+spec1.size()+"/"+spec2.size()+"]"); if (TRACE) System.out.println("--------------------Merging species (" + i1 +", " +i2 +") ["+spec1.size()+"/"+spec2.size()+"]");
// this.m_CAForSpeciesConvergence.convergingSpecies(spec1, spec2); // this.m_CAForSpeciesConvergence.convergingSpecies(spec1, spec2);
if (isActive(spec1) && isActive(spec2)) { if (isActive(spec1) && isActive(spec2)) {
@ -756,13 +761,13 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
* of species differentiation. * of species differentiation.
* @return The current status of this flag * @return The current status of this flag
*/ */
public boolean getApplyDifferentation() { public boolean getApplyDifferentiation() {
return this.m_UseSpeciesDifferentation; return this.m_UseSpeciesDifferentation;
} }
public void setApplyDifferentation(boolean b){ public void setApplyDifferentiation(boolean b){
this.m_UseSpeciesDifferentation = b; this.m_UseSpeciesDifferentation = b;
} }
public String applyDifferentationTipText() { public String applyDifferentiationTipText() {
return "Toggle the species differentation mechanism."; return "Toggle the species differentation mechanism.";
} }
@ -792,18 +797,19 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
return "With a halting window converged species are frozen."; return "With a halting window converged species are frozen.";
} }
/** This method allows you to set/get the switch that toggels the use /** This method allows you to set/get the switch that toggles the use
* of species convergence. * of species convergence.
* @return The current status of this flag * @return The current status of this flag
*/ */
public boolean getApplyConvergence() { public boolean isUseMerging() {
return this.m_UseSpeciesConvergence; return this.m_UseSpeciesMerging;
} }
public void setApplyConvergence(boolean b){ public void setUseMerging(boolean b){
this.m_UseSpeciesConvergence = b; this.m_UseSpeciesMerging = b;
GenericObjectEditor.setHideProperty(this.getClass(), "mergingCA", !m_UseSpeciesMerging);
} }
public String applyConvergenceTipText() { public String useMergingTipText() {
return "Toggle the species convergence mechanism."; return "Toggle the use of species merging.";
} }
/** Choose a population based optimizing technique to use /** Choose a population based optimizing technique to use
@ -826,27 +832,27 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
/** The cluster algorithm on which the species differentiation is based /** The cluster algorithm on which the species differentiation is based
* @return The current clustering method * @return The current clustering method
*/ */
public InterfaceClustering getDifferentationCA() { public InterfaceClustering getDifferentiationCA() {
return this.m_CAForSpeciesDifferentation; return this.m_CAForSpeciesDifferentation;
} }
public void setDifferentationCA(InterfaceClustering b){ public void setDifferentiationCA(InterfaceClustering b){
this.m_CAForSpeciesDifferentation = b; this.m_CAForSpeciesDifferentation = b;
} }
public String differentationCATipText() { public String differentiationCATipText() {
return "The cluster algorithm on which the species differentation is based."; return "The cluster algorithm on which the species differentation is based.";
} }
/** The Cluster Algorithm on which the species convergence is based. /** The Cluster Algorithm on which the species convergence is based.
* @return The current clustering method * @return The current clustering method
*/ */
public InterfaceClustering getConvergenceCA() { public InterfaceClustering getMergingCA() {
return this.m_CAForSpeciesConvergence; return this.m_CAForSpeciesConvergence;
} }
public void setConvergenceCA(InterfaceClustering b){ public void setMergingCA(InterfaceClustering b){
this.m_CAForSpeciesConvergence = b; this.m_CAForSpeciesConvergence = b;
} }
public String convergenceCATipText() { public String mergingCATipText() {
return "The cluster algorithm on which the species convergence is based."; return "The cluster algorithm on which the species merging is based.";
} }
public void setUseArchive(boolean v) { public void setUseArchive(boolean v) {
@ -869,7 +875,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
this.m_SpeciesCycle = b; this.m_SpeciesCycle = b;
} }
public String speciesCycleTipText() { public String speciesCycleTipText() {
return "Determines how often species differentation/convergence is performed."; return "Determines how often species differentation/merging is performed.";
} }
/** TDetermines how often show is performed. /** TDetermines how often show is performed.
@ -884,6 +890,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
public String showCycleTipText() { public String showCycleTipText() {
return "Determines how often show is performed (generations); set to zero to deactivate."; return "Determines how often show is performed (generations); set to zero to deactivate.";
} }
/** Determines the size of the initial population. /** Determines the size of the initial population.
* @return This number gives initial population size. * @return This number gives initial population size.
*/ */
@ -922,14 +929,12 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
public int getHaltingWindow() { public int getHaltingWindow() {
return haltingWindow; return haltingWindow;
} }
/** /**
* @param haltingWindow the haltingWindow to set * @param haltingWindow the haltingWindow to set
*/ */
public void setHaltingWindow(int haltingWindow) { public void setHaltingWindow(int haltingWindow) {
this.haltingWindow = haltingWindow; this.haltingWindow = haltingWindow;
} }
public String haltingWindowTipText() { public String haltingWindowTipText() {
return "Lenght of the halting window defining when a cluster is seen as converged and frozen; set to zero to disable."; return "Lenght of the halting window defining when a cluster is seen as converged and frozen; set to zero to disable.";
} }
@ -943,4 +948,7 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
return m_Undifferentiated.size() + " \t " + actives + " \t " + (m_Species.size()-actives); return m_Undifferentiated.size() + " \t " + actives + " \t " + (m_Species.size()-actives);
} }
public String[] customPropertyOrder() {
return new String[]{"mergingCA", "differentiationCA"};
}
} }

View File

@ -690,6 +690,7 @@ public class DifferentialEvolution implements InterfaceOptimizer, java.io.Serial
public void setDEType(DETypeEnum s) { public void setDEType(DETypeEnum s) {
this.m_DEType = s; this.m_DEType = s;
// show mt for trig. DE only // show mt for trig. DE only
GenericObjectEditor.setShowProperty(this.getClass(), "lambda", s==DETypeEnum.DE2_CurrentToBest);
GenericObjectEditor.setShowProperty(this.getClass(), "mt", s==DETypeEnum.TrigonometricDE); GenericObjectEditor.setShowProperty(this.getClass(), "mt", s==DETypeEnum.TrigonometricDE);
} }
public DETypeEnum getDEType() { public DETypeEnum getDEType() {

View File

@ -47,7 +47,7 @@ public class MemeticAlgorithm implements InterfaceOptimizer,
private int subsetsize = 5; private int subsetsize = 5;
private int globalSearchSteps = 1; private int globalSearchIterations = 1;
private boolean lamarckism = true; private boolean lamarckism = true;
@ -78,7 +78,7 @@ public class MemeticAlgorithm implements InterfaceOptimizer,
this.m_Identifier = a.m_Identifier; this.m_Identifier = a.m_Identifier;
this.localSearchSteps = a.localSearchSteps; this.localSearchSteps = a.localSearchSteps;
this.subsetsize = a.subsetsize; this.subsetsize = a.subsetsize;
this.globalSearchSteps = a.globalSearchSteps; this.globalSearchIterations = a.globalSearchIterations;
this.lamarckism = a.lamarckism; this.lamarckism = a.lamarckism;
} }
@ -120,9 +120,8 @@ public class MemeticAlgorithm implements InterfaceOptimizer,
if (TRACE) System.out.println("global search"); if (TRACE) System.out.println("global search");
this.m_GlobalOptimizer.optimize(); this.m_GlobalOptimizer.optimize();
if ((this.m_GlobalOptimizer.getPopulation().getGeneration() if (((this.m_GlobalOptimizer.getPopulation().getGeneration() % this.globalSearchIterations) == 0)
% this.globalSearchSteps == 0) && (this.localSearchSteps > 0)
&& (this.localSearchSteps != 0)
&& (this.m_Problem instanceof InterfaceLocalSearchable)) { && (this.m_Problem instanceof InterfaceLocalSearchable)) {
// here the local search is performed // here the local search is performed
if (TRACE) if (TRACE)
@ -282,7 +281,9 @@ public class MemeticAlgorithm implements InterfaceOptimizer,
* @return description * @return description
*/ */
public String globalInfo() { 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 * @return The name of the algorithm
*/ */
public String getName() { 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 * @param localSearchSteps
*/ */
public void setLocalSearchSteps(int localSearchSteps) { public void setLocalSearchSteps(int localSearchSteps) {
this.localSearchSteps = localSearchSteps; this.localSearchSteps = localSearchSteps;
} }
public int getLocalSearchSteps() { public int getLocalSearchSteps() {
return localSearchSteps; return localSearchSteps;
} }
public String localSearchStepsTipText() { public String localSearchStepsTipText() {
return "Choose the number of local search steps to perform per selected individual."; return "Choose the number of local search steps to perform per selected individual.";
} }
@ -353,18 +352,20 @@ public class MemeticAlgorithm implements InterfaceOptimizer,
* *
* @param globalSearchSteps * @param globalSearchSteps
*/ */
public void setGlobalSearchSteps(int globalSearchSteps) { public void setGlobalSearchIterations(int globalSearchSteps) {
this.globalSearchSteps = globalSearchSteps; this.globalSearchIterations = globalSearchSteps;
} }
public int getGlobalSearchIterations() {
public int getGlobalSearchSteps() { return globalSearchIterations;
return globalSearchSteps;
} }
public String globalSearchIterationsTipText() {
public String globalSearchStepsTipText() {
return "Choose the interval between the application of the local search."; 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 * Choose the number of individual to be locally optimized
* *
@ -373,36 +374,35 @@ public class MemeticAlgorithm implements InterfaceOptimizer,
public void setSubsetsize(int subsetsize) { public void setSubsetsize(int subsetsize) {
this.subsetsize = subsetsize; this.subsetsize = subsetsize;
} }
public int getSubsetsize() {
public InterfaceSolutionSet getAllSolutions() {
return new SolutionSet(getPopulation());
}
public int getSubsetsize() {
return subsetsize; return subsetsize;
} }
public String subsetsizeTipText() { 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 * @param lamarckism
*/ */
public void setLamarckism(boolean lamarckism) { public void setLamarckism(boolean lamarckism) {
this.lamarckism = lamarckism; this.lamarckism = lamarckism;
} }
public boolean getLamarckism() {
return this.lamarckism;
}
public String lamarckismTipText() { public String lamarckismTipText() {
return "Toggel between Lamarcksim and the Baldwin Effect."; return "Toggle between Lamarckism and the Baldwin Effect.";
} }
public boolean isLamarckism() { public boolean isLamarckism() {
return lamarckism; 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.";
}
} }

View File

@ -95,7 +95,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
public static final int defaultType = 0; public static final int defaultType = 0;
public static final int resetType = 99; public static final int resetType = 99;
transient final static String partTypeKey = "ParticleType"; 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 partBestFitKey = "BestFitness";
transient final static String partVelKey = "Velocity"; transient final static String partVelKey = "Velocity";
transient final static String multiSwTypeKey="MultiSwarmType"; transient final static String multiSwTypeKey="MultiSwarmType";
@ -1580,7 +1580,8 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
public void setPopulation(Population pop){ public void setPopulation(Population pop){
this.m_Population = pop; this.m_Population = pop;
if (pop.size() != pop.getPopulationSize()) { // new particle count! if (pop.size() != pop.getPopulationSize()) { // new particle count!
init(); tracedVelocity = null;
initByPopulation(null, false);
} else for (int i=0; i<pop.size(); i++) { } else for (int i=0; i<pop.size(); i++) {
AbstractEAIndividual indy = pop.getEAIndividual(i); AbstractEAIndividual indy = pop.getEAIndividual(i);
if (indy==null) { if (indy==null) {

View File

@ -275,7 +275,7 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
} }
if (printFinalVerbosity() && (additionalInfoSums != null)) { if (printFinalVerbosity() && (additionalInfoSums != null)) {
printToTextListener(" Averaged additional info: "); printToTextListener(" Averaged additional info sums: ");
for (int i=0; i<additionalInfoSums.length; i++) if (additionalInfoSums[i]!=null) printToTextListener(" \t"+(additionalInfoSums[i]/optRunsPerformed)); for (int i=0; i<additionalInfoSums.length; i++) if (additionalInfoSums[i]!=null) printToTextListener(" \t"+(additionalInfoSums[i]/optRunsPerformed));
printToTextListener("\n Averaged last additional info: "); printToTextListener("\n Averaged last additional info: ");
for (int i=0; i<lastAdditionalInfoSums.length; i++) if (lastAdditionalInfoSums[i]!=null) printToTextListener(" \t"+(lastAdditionalInfoSums[i]/optRunsPerformed)); for (int i=0; i<lastAdditionalInfoSums.length; i++) if (lastAdditionalInfoSums[i]!=null) printToTextListener(" \t"+(lastAdditionalInfoSums[i]/optRunsPerformed));

View File

@ -1035,4 +1035,14 @@ public class Mathematics {
destRange[i][1] = Math.min(r1[i][1], r2[i][1]); destRange[i][1] = Math.min(r1[i][1], r2[i][1]);
} }
} }
/**
* Fill the front of an array with data from a given source array.
*
* @param dest
* @param src
*/
public static void fillFront(double[] dest, double[] src) {
System.arraycopy(src, 0, dest, 0, Math.min(dest.length, src.length));
}
} }