From 2f33a002e2c2735638caed5e915c71094ab79358 Mon Sep 17 00:00:00 2001 From: Marcel Kronfeld Date: Wed, 24 Feb 2010 16:22:16 +0000 Subject: [PATCH] Merging MK branch revs. 214,447-448,451,452,456-459. --- src/eva2/OptimizerFactory.java | 140 +++++-- src/eva2/OptimizerRunnable.java | 9 + src/eva2/gui/BeanInspector.java | 78 ++-- src/eva2/gui/GenericArrayEditor.java | 69 +++- src/eva2/gui/PropertyDialog.java | 6 +- src/eva2/gui/TopoPlot.java | 5 +- .../go/enums/ESMutationInitialSigma.java | 2 +- .../go/individuals/AbstractEAIndividual.java | 95 +++-- .../AbstractEAIndividualComparator.java | 63 +++- .../cluster/ClusteringDensityBased.java | 10 + .../cluster/ClusteringNearestBetter.java | 38 +- .../crossover/CrossoverESDefault.java | 3 +- .../MutateESCovarianceMatrixAdaption.java | 33 +- .../operators/mutation/MutateESRankMuCMA.java | 28 +- .../operators/mutation/MutateGIOrdinal.java | 2 +- .../paramcontrol/ParameterControlManager.java | 23 ++ .../go/operators/postprocess/PostProcess.java | 196 +++++++--- .../postprocess/SolutionHistogram.java | 166 +++++++++ .../terminators/CombinedTerminator.java | 3 +- .../FitnessConvergenceTerminator.java | 13 +- .../HistoryConvergenceTerminator.java | 149 ++++++++ .../server/go/populations/Population.java | 348 +++++++++++++----- .../go/populations/PopulationInitMethod.java | 2 +- .../AbstractMultiModalProblemKnown.java | 52 ++- .../problems/AbstractOptimizationProblem.java | 94 +++-- .../go/problems/AbstractProblemDouble.java | 74 +++- .../problems/AbstractProblemDoubleOffset.java | 7 - .../go/problems/ConstrHimmelblauProblem.java | 1 + src/eva2/server/go/problems/F10Problem.java | 1 + src/eva2/server/go/problems/F11Problem.java | 1 + src/eva2/server/go/problems/F12Problem.java | 5 +- src/eva2/server/go/problems/F13Problem.java | 41 ++- src/eva2/server/go/problems/F15Problem.java | 102 +++++ src/eva2/server/go/problems/F16Problem.java | 3 +- src/eva2/server/go/problems/F17Problem.java | 24 +- src/eva2/server/go/problems/F18Problem.java | 1 + src/eva2/server/go/problems/F19Problem.java | 37 +- src/eva2/server/go/problems/F1Problem.java | 2 + src/eva2/server/go/problems/F20Problem.java | 117 ++++++ src/eva2/server/go/problems/F21Problem.java | 77 ++++ src/eva2/server/go/problems/F2Problem.java | 33 +- src/eva2/server/go/problems/F3Problem.java | 1 + src/eva2/server/go/problems/F4Problem.java | 1 + src/eva2/server/go/problems/F5Problem.java | 1 + src/eva2/server/go/problems/F6Problem.java | 77 ++-- src/eva2/server/go/problems/F7Problem.java | 1 + src/eva2/server/go/problems/F8Problem.java | 1 + src/eva2/server/go/problems/F9Problem.java | 1 + .../server/go/problems/GPFunctionProblem.java | 1 + .../InterfaceFirstOrderDerivableProblem.java | 2 + .../InterfaceInterestingHistogram.java | 20 + .../InterfaceMultimodalProblemKnown.java | 8 +- .../go/problems/SimpleProblemWrapper.java | 9 +- .../go/strategies/ClusterBasedNichingEA.java | 8 +- .../go/strategies/EvolutionStrategyIPOP.java | 9 +- .../go/strategies/GeneticAlgorithm.java | 7 +- .../strategies/GradientDescentAlgorithm.java | 23 +- .../go/strategies/MemeticAlgorithm.java | 2 +- .../go/strategies/NelderMeadSimplex.java | 19 +- .../strategies/ParticleSwarmOptimization.java | 132 +++++-- src/eva2/server/stat/AbstractStatistics.java | 42 ++- src/eva2/tools/StringTools.java | 52 ++- src/eva2/tools/chart2d/DArea.java | 30 +- src/eva2/tools/chart2d/DGrid.java | 16 +- src/eva2/tools/chart2d/DRectangle.java | 40 +- src/eva2/tools/chart2d/ScaledBorder.java | 9 +- src/eva2/tools/chart2d/SlimRect.java | 4 +- src/eva2/tools/math/Mathematics.java | 128 +++++-- src/eva2/tools/math/RNG.java | 144 +++++--- 69 files changed, 2318 insertions(+), 623 deletions(-) create mode 100644 src/eva2/server/go/operators/postprocess/SolutionHistogram.java create mode 100644 src/eva2/server/go/operators/terminators/HistoryConvergenceTerminator.java create mode 100644 src/eva2/server/go/problems/F15Problem.java create mode 100644 src/eva2/server/go/problems/F20Problem.java create mode 100644 src/eva2/server/go/problems/F21Problem.java create mode 100644 src/eva2/server/go/problems/InterfaceInterestingHistogram.java diff --git a/src/eva2/OptimizerFactory.java b/src/eva2/OptimizerFactory.java index 4ab78031..1870507d 100644 --- a/src/eva2/OptimizerFactory.java +++ b/src/eva2/OptimizerFactory.java @@ -21,9 +21,11 @@ import eva2.server.go.operators.archiving.InformationRetrievalInserting; import eva2.server.go.operators.archiving.InterfaceArchiving; import eva2.server.go.operators.archiving.InterfaceInformationRetrieval; 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.crossover.InterfaceCrossover; import eva2.server.go.operators.crossover.NoCrossover; +import eva2.server.go.operators.distancemetric.IndividualDataMetric; import eva2.server.go.operators.mutation.InterfaceMutation; import eva2.server.go.operators.mutation.MutateESCovarianceMatrixAdaption; import eva2.server.go.operators.mutation.MutateESFixedStepSize; @@ -50,6 +52,7 @@ import eva2.server.go.strategies.HillClimbing; import eva2.server.go.strategies.InterfaceOptimizer; import eva2.server.go.strategies.MonteCarloSearch; import eva2.server.go.strategies.MultiObjectiveEA; +import eva2.server.go.strategies.NelderMeadSimplex; import eva2.server.go.strategies.ParticleSwarmOptimization; import eva2.server.go.strategies.PopulationBasedIncrementalLearning; import eva2.server.go.strategies.SimulatedAnnealing; @@ -117,6 +120,12 @@ public class OptimizerFactory { private static OptimizerRunnable lastRunnable = null; + private static final int cbnDefaultHaltingWindowLength=new ClusterBasedNichingEA().getHaltingWindow(); + private static final double cbnDefaultHaltingWindowEpsilon=new ClusterBasedNichingEA().getEpsilonBound(); + private static final double cbnDefaultClusterSigma = 0.1; + private static final int cbnDefaultMinGroupSize = 5; + private static final int cbnDefaultMaxGroupSize = -1; + /** * This method optimizes the given problem using differential evolution. * @@ -424,7 +433,7 @@ public class OptimizerFactory { * @param popsize * @param phi1 * @param phi2 - * @param k + * @param speedLim * @param listener * @param topology * @see ParticleSwarmOpimization @@ -433,9 +442,8 @@ public class OptimizerFactory { */ public static final ParticleSwarmOptimization createParticleSwarmOptimization( AbstractOptimizationProblem problem, int popsize, double phi1, - double phi2, double k, - InterfacePopulationChangedEventListener listener, - PSOTopologyEnum selectedTopology) { + double phi2, double speedLim, PSOTopologyEnum selectedTopology, int topologyRange, + InterfacePopulationChangedEventListener listener) { problem.initProblem(); @@ -450,9 +458,10 @@ public class OptimizerFactory { pso.getPopulation().setTargetSize(popsize); pso.setPhi1(phi1); pso.setPhi2(phi2); - pso.setSpeedLimit(k); + pso.setSpeedLimit(speedLim); // pso.getTopology().setSelectedTag(selectedTopology); pso.setTopology(selectedTopology); + pso.setTopologyRange(topologyRange); pso.addPopulationChangedEventListener(listener); pso.init(); @@ -581,13 +590,13 @@ public class OptimizerFactory { case HILLCL: return hillClimbing(problem); case CBN_ES: - return cbnES(problem); + return standardCbnES(problem); case CL_HILLCL: return stdClusteringHillClimbing(problem); case CMA_ES_IPOP: return cmaESIPOP(problem); case CBN_GA: - return cbnGA(problem); + return standardCbnGA(problem); case PBIL: return standardPBIL(problem); default: @@ -1171,31 +1180,99 @@ public class OptimizerFactory { return makeParams(new MonteCarloSearch(), 50, problem, randSeed, makeDefaultTerminator()); } - public static final GOParameters cbnES(AbstractOptimizationProblem problem) { + /** + * Create a generic Clustering-based Niching EA with given parameters. Uses ClusteringDensityBased as + * a default clustering algorithm. + * + * @param problem + * @param opt + * @param clusterSigma + * @param minClustSize + * @param haltingWindowLength + * @param haltingWindowEpsilon + * @param popSize + * @return + */ + public static final GOParameters createCbn(AbstractOptimizationProblem problem, InterfaceOptimizer opt, + double clusterSigma, int minClustSize, int maxSpecSize, int haltingWindowLength, double haltingWindowEpsilon, int popSize) { + return createCbn(problem, opt, new ClusteringDensityBased(clusterSigma, minClustSize), maxSpecSize, + new ClusteringDensityBased(clusterSigma, minClustSize), haltingWindowLength, haltingWindowEpsilon, popSize); + } + + /** + * Create a generic Clustering-based Niching EA with given parameters. + * + * @param problem + * @param opt + * @param clustDifferentiate + * @param clustMerge + * @param haltingWindowLength + * @param haltingWindowEpsilon + * @param popSize + * @return + */ + public static final GOParameters createCbn(AbstractOptimizationProblem problem, InterfaceOptimizer opt, + InterfaceClustering clustDifferentiate, int maxSpecSize, InterfaceClustering clustMerge, int haltingWindowLength, + double haltingWindowEpsilon, int popSize) { ClusterBasedNichingEA cbn = new ClusterBasedNichingEA(); + cbn.setOptimizer(opt); + cbn.setMergingCA(clustMerge); + cbn.setMaxSpeciesSize(maxSpecSize); + cbn.setDifferentiationCA(clustDifferentiate); + if (clustMerge!=null) cbn.setUseMerging(true); + cbn.setShowCycle(0); // don't do graphical output + cbn.setHaltingWindow(haltingWindowLength); + cbn.setEpsilonBound(haltingWindowEpsilon); + return makeParams(cbn, popSize, problem, randSeed, makeDefaultTerminator()); + } + + /** + * A standard CBNES which employs a (15,50)-ES with further parameters as set by the EvA2 framework. + * + * @param problem + * @return + */ + public static final GOParameters standardCbnES(AbstractOptimizationProblem problem) { EvolutionStrategies es = new EvolutionStrategies(); es.setMu(15); es.setLambda(50); es.setPlusStrategy(false); - cbn.setOptimizer(es); - ClusteringDensityBased clustering = new ClusteringDensityBased(0.1); - cbn.setMergingCA((ClusteringDensityBased) clustering.clone()); - cbn.setDifferentiationCA(clustering); - cbn.setShowCycle(0); // don't do graphical output - - return makeParams(cbn, 100, problem, randSeed, makeDefaultTerminator()); + return createCbn(problem, es, cbnDefaultClusterSigma, cbnDefaultMinGroupSize, cbnDefaultMaxGroupSize, cbnDefaultHaltingWindowLength, cbnDefaultHaltingWindowEpsilon, 100); } - public static final GOParameters cbnGA(AbstractOptimizationProblem problem) { - ClusterBasedNichingEA cbn = new ClusterBasedNichingEA(); - GeneticAlgorithm ga = new GeneticAlgorithm(); - cbn.setOptimizer(ga); - ClusteringDensityBased clustering = new ClusteringDensityBased(0.1); - cbn.setMergingCA((ClusteringDensityBased) clustering.clone()); - cbn.setDifferentiationCA(clustering); - cbn.setShowCycle(0); // don't do graphical output - - return makeParams(cbn, 100, problem, randSeed, makeDefaultTerminator()); + /** + * A standard CBNES which employs a CMA-ES, see {@link #cmaES(AbstractOptimizationProblem)}. + * + * @param problem + * @return + */ + public static final GOParameters standardCbnCmaES(AbstractOptimizationProblem problem) { + GOParameters cmaEsParams = cmaES(problem); + EvolutionStrategies cmaES = (EvolutionStrategies)cmaEsParams.getOptimizer(); + return createCbn(problem, cmaES, cbnDefaultClusterSigma, cbnDefaultMinGroupSize, cbnDefaultMaxGroupSize, cbnDefaultHaltingWindowLength, cbnDefaultHaltingWindowEpsilon, 100); + } + + /** + * A standard CBNGA with a GA and further parameters as set by the EvA2 framework. + * @param problem + * @return + */ + public static final GOParameters standardCbnGA(AbstractOptimizationProblem problem) { + GeneticAlgorithm ga = new GeneticAlgorithm(); + return createCbn(problem, ga, cbnDefaultClusterSigma, cbnDefaultMinGroupSize, cbnDefaultMaxGroupSize, cbnDefaultHaltingWindowLength, cbnDefaultHaltingWindowEpsilon, 100); + } + + /** + * A standard CBNPSO with density based clustering working on personal best positions. + * + * @param problem + * @return + */ + public static final GOParameters standardCbnPSO(AbstractOptimizationProblem problem) { + GOParameters psoParams = standardPSO(problem); + ParticleSwarmOptimization pso = (ParticleSwarmOptimization)psoParams.getOptimizer(); + ClusteringDensityBased clust = new ClusteringDensityBased(cbnDefaultClusterSigma, cbnDefaultMinGroupSize, new IndividualDataMetric(ParticleSwarmOptimization.partBestPosKey)); + return createCbn(problem, pso, clust, cbnDefaultMaxGroupSize, new ClusteringDensityBased(clust), cbnDefaultHaltingWindowLength, cbnDefaultHaltingWindowEpsilon, 100); } public static final GOParameters standardPBIL(AbstractOptimizationProblem problem) { @@ -1306,6 +1383,10 @@ public class OptimizerFactory { * @return */ public static final GOParameters cmaESIPOP(AbstractOptimizationProblem problem) { + return createCmaEsIPop(problem, 2.); + } + + public static final GOParameters createCmaEsIPop(AbstractOptimizationProblem problem, double incLambdaFact) { EvolutionStrategies es = new EvolutionStrategyIPOP(); AbstractEAIndividual indyTemplate = problem.getIndividualTemplate(); @@ -1317,6 +1398,7 @@ public class OptimizerFactory { int lambda = (int) (4.0 + 3.0 * Math.log(dim)); es.setGenerationStrategy((int)Math.floor(lambda/2.),lambda, false); es.setForceOrigPopSize(false); + ((EvolutionStrategyIPOP)es).setIncPopSizeFact(incLambdaFact); // Set CMA operator for mutation AbstractEAIndividual indy = (AbstractEAIndividual) indyTemplate; MutateESRankMuCMA cmaMut = new MutateESRankMuCMA(); @@ -1330,6 +1412,11 @@ public class OptimizerFactory { return makeESParams(es, problem); } + public static final GOParameters standardNMS(AbstractOptimizationProblem problem) { + NelderMeadSimplex nms = NelderMeadSimplex.createNelderMeadSimplex(problem, null); + return makeParams(nms, 50, problem, randSeed, makeDefaultTerminator()); + } + public static final GOParameters standardDE( AbstractOptimizationProblem problem) { DifferentialEvolution de = new DifferentialEvolution(); @@ -1370,13 +1457,14 @@ public class OptimizerFactory { return makeParams(ga, 100, problem, randSeed, makeDefaultTerminator()); } - + public static final GOParameters standardPSO( AbstractOptimizationProblem problem) { ParticleSwarmOptimization pso = new ParticleSwarmOptimization(); pso.setPhiValues(2.05, 2.05); // pso.getTopology().setSelectedTag("Grid"); pso.setTopology(PSOTopologyEnum.grid); + pso.setTopologyRange(1); return makeParams(pso, 30, problem, randSeed, makeDefaultTerminator()); } diff --git a/src/eva2/OptimizerRunnable.java b/src/eva2/OptimizerRunnable.java index 7afc8382..b52b2884 100644 --- a/src/eva2/OptimizerRunnable.java +++ b/src/eva2/OptimizerRunnable.java @@ -37,6 +37,7 @@ public class OptimizerRunnable implements Runnable { private boolean doRestart = false; // indicate whether start or restart should be done --> whether pop will be reinitialized. private boolean postProcessOnly = false; private InterfaceTextListener listener = null; + private String ident="OptimizerRunnable"; /** * Construct an OptimizerRunnable with given parameters and a StatisticsStandalone instance without restart, @@ -87,6 +88,14 @@ public class OptimizerRunnable implements Runnable { doRestart = restart; } + public void setIdentifier(String id) { + ident=id; + } + + public String getIdentifier() { + return ident; + } + public InterfaceGOParameters getGOParams() { return proc.getGOParams(); } diff --git a/src/eva2/gui/BeanInspector.java b/src/eva2/gui/BeanInspector.java index bb6321d4..de1b86d9 100644 --- a/src/eva2/gui/BeanInspector.java +++ b/src/eva2/gui/BeanInspector.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.List; import eva2.server.go.populations.Population; +import eva2.tools.Pair; import eva2.tools.SelectedTag; import eva2.tools.Tag; @@ -131,7 +132,9 @@ public class BeanInspector { return true; } - + public static String toString(Object Target) { + return toString(Target, ';', false); + } /** * Collect the accessible properties of an object and their values in a string. * Special cases: Arrays and Lists are concatenations of their elements, Population is excepted from lists. @@ -141,7 +144,7 @@ public class BeanInspector { * @param Target Description of the Parameter * @return Description of the Return Value */ - public static String toString(Object Target) { + public static String toString(Object Target, char delim, boolean tight) { String ret = ""; if (Target == null) return "null"; // try the object itself @@ -149,13 +152,18 @@ public class BeanInspector { Class type = Target.getClass(); if (type.isArray()) { // handle the array case - StringBuffer sbuf = new StringBuffer("[ "); + StringBuffer sbuf = new StringBuffer("["); + if (!tight) sbuf.append(" "); int len = Array.getLength(Target); for (int i=0; i lst = (List)Target; for (Object o : lst) { sbuf.append(o.toString()); - sbuf.append("; "); + sbuf.append(delim); + if (!tight) sbuf.append(" "); } - sbuf.setCharAt(sbuf.length()-2, ' '); + if (!tight) sbuf.setCharAt(sbuf.length()-2, ' '); sbuf.setCharAt(sbuf.length()-1, ']'); return sbuf.toString(); } @@ -192,20 +202,48 @@ public class BeanInspector { } // otherwise try introspection and collect all public properties as strings + + Pair nameVals = getPublicPropertiesOf(Target, true); + + StringBuffer sbuf = new StringBuffer(type.getName()); + sbuf.append("{"); + for (int i=0; i