From 89975518efa0f1b90ea1bf8f13af73e47d2ca3cd Mon Sep 17 00:00:00 2001 From: Marcel Kronfeld Date: Mon, 31 May 2010 12:03:42 +0000 Subject: [PATCH] Merging mk branch revs. 543:546 (except niching constructors in OptimizerFactory) --- src/eva2/OptimizerFactory.java | 123 +++++++++--------- src/eva2/OptimizerRunnable.java | 21 ++- .../MutateESCovarianceMatrixAdaption.java | 11 +- .../go/problems/WaitForEvARunnable.java | 2 +- 4 files changed, 90 insertions(+), 67 deletions(-) diff --git a/src/eva2/OptimizerFactory.java b/src/eva2/OptimizerFactory.java index 0106a942..48236972 100644 --- a/src/eva2/OptimizerFactory.java +++ b/src/eva2/OptimizerFactory.java @@ -10,6 +10,7 @@ import eva2.server.go.IndividualInterface; import eva2.server.go.InterfacePopulationChangedEventListener; import eva2.server.go.InterfaceTerminator; import eva2.server.go.enums.DETypeEnum; +import eva2.server.go.enums.MutateESCrossoverTypeEnum; import eva2.server.go.enums.PSOTopologyEnum; import eva2.server.go.enums.PostProcessMethod; import eva2.server.go.individuals.AbstractEAIndividual; @@ -144,11 +145,7 @@ public class OptimizerFactory { problem.initProblem(); - AbstractEAIndividual tmpIndi = problem.getIndividualTemplate(); - tmpIndi.setCrossoverOperator(new NoCrossover()); - tmpIndi.setCrossoverProbability(0.0); - tmpIndi.setMutationOperator(new NoMutation()); - tmpIndi.setMutationProbability(0.0); + setTemplateOperators(problem, new NoMutation(), 0, new NoCrossover(), 0); DifferentialEvolution de = new DifferentialEvolution(); de.SetProblem(problem); @@ -261,11 +258,7 @@ public class OptimizerFactory { problem.initProblem(); - AbstractEAIndividual tmpIndi = problem.getIndividualTemplate(); - tmpIndi.setCrossoverOperator(cross); - tmpIndi.setCrossoverProbability(pc); - tmpIndi.setMutationOperator(mut); - tmpIndi.setMutationProbability(pm); + setTemplateOperators(problem, mut, pm, cross, pc); GeneticAlgorithm ga = new GeneticAlgorithm(); ga.SetProblem(problem); @@ -374,13 +367,7 @@ public class OptimizerFactory { problem.initProblem(); - MutateESFixedStepSize mutator = new MutateESFixedStepSize(); - mutator.setSigma(0.2); // mutations step size - AbstractEAIndividual tmpIndi = problem.getIndividualTemplate(); - tmpIndi.setMutationOperator(mutator); - tmpIndi.setMutationProbability(1.0); - tmpIndi.setCrossoverOperator(new NoCrossover()); - tmpIndi.setCrossoverProbability(0); + setTemplateOperators(problem, new MutateESFixedStepSize(0.2), 1., new NoCrossover(), 0); HillClimbing hc = new HillClimbing(); hc.getPopulation().setTargetSize(pop); @@ -395,7 +382,7 @@ public class OptimizerFactory { /** * This method performs a Monte Carlo Search with the given number of - * fitnesscalls. + * fitness calls. * * @param problem * @param popsize @@ -407,11 +394,7 @@ public class OptimizerFactory { InterfacePopulationChangedEventListener listener) { problem.initProblem(); - AbstractEAIndividual tmpIndi = problem.getIndividualTemplate(); - tmpIndi.setMutationOperator(new NoMutation()); - tmpIndi.setMutationProbability(0); - tmpIndi.setCrossoverOperator(new NoCrossover()); - tmpIndi.setCrossoverProbability(0); + setTemplateOperators(problem, new NoMutation(), 0, new NoCrossover(), 0); MonteCarloSearch mc = new MonteCarloSearch(); mc.getPopulation().setTargetSize(popsize); @@ -426,7 +409,7 @@ public class OptimizerFactory { /** * This method performs a particle swarm optimization. Standard topologies are - * linear (0), grid (1) and star (2). + * linear, grid and star. * * @param problem * @param mut @@ -447,11 +430,7 @@ public class OptimizerFactory { problem.initProblem(); - AbstractEAIndividual tmpIndi = problem.getIndividualTemplate(); - tmpIndi.setCrossoverOperator(new NoCrossover()); - tmpIndi.setCrossoverProbability(0.0); - tmpIndi.setMutationOperator(new NoMutation()); - tmpIndi.setMutationProbability(0.0); + setTemplateOperators(problem, new NoMutation(), 0, new NoCrossover(), 0); ParticleSwarmOptimization pso = new ParticleSwarmOptimization(); pso.SetProblem(problem); @@ -492,11 +471,7 @@ public class OptimizerFactory { problem.initProblem(); - AbstractEAIndividual tmpIndi = problem.getIndividualTemplate(); - tmpIndi.setCrossoverOperator(new NoCrossover()); - tmpIndi.setCrossoverProbability(0.0); - tmpIndi.setMutationOperator(mut); - tmpIndi.setMutationProbability(1.0); + setTemplateOperators(problem, mut, 1, new NoCrossover(), 0); SimulatedAnnealing sa = new SimulatedAnnealing(); sa.setAlpha(alpha); @@ -927,19 +902,19 @@ public class OptimizerFactory { String outputFilePrefix) { OptimizerRunnable runnable = optimize(new OptimizerRunnable(params, outputFilePrefix)); - return runnable.getSolutionSet(); + return runnable.getResultPopulation(); } public static Population optimizeToPop(final int optType, AbstractOptimizationProblem problem, String outputFilePrefix) { OptimizerRunnable runnable = optimize(optType, problem, outputFilePrefix); - return (runnable != null) ? runnable.getSolutionSet() : null; + return (runnable != null) ? runnable.getResultPopulation() : null; } public static Population optimizeToPop(OptimizerRunnable runnable) { optimize(runnable); - return (runnable != null) ? runnable.getSolutionSet() : null; + return (runnable != null) ? runnable.getResultPopulation() : null; } ///////////////////////////// post processing @@ -985,7 +960,7 @@ public class OptimizerFactory { runnable.run(); // this run will not set the lastRunnable - // postProcessing // starts always anew - return runnable.getSolutionSet(); + return runnable.getResultPopulation(); } public static Vector postProcessBinVec(int steps, double sigma, @@ -1354,17 +1329,10 @@ public class OptimizerFactory { es.setLambda(50); es.setPlusStrategy(false); - AbstractEAIndividual indyTemplate = problem.getIndividualTemplate(); - if ((indyTemplate != null) - && (indyTemplate instanceof InterfaceESIndividual)) { - // Set CMA operator for mutation - AbstractEAIndividual indy = (AbstractEAIndividual) indyTemplate; - MutateESCovarianceMatrixAdaption cmaMut = new MutateESCovarianceMatrixAdaption(); - cmaMut.setCheckConstraints(true); - AbstractEAIndividual.setOperators(indy, cmaMut, 1., new CrossoverESDefault(), 0.); - } else { - System.err - .println("Error, CMA-ES is implemented for ES individuals only (requires double data types)"); + if (assertIndyType(problem,InterfaceESIndividual.class)) { + setTemplateOperators(problem, new MutateESCovarianceMatrixAdaption(true), 1, new CrossoverESDefault(), 0); + } else { + System.err.println("Error, CMA-ES is implemented for ES individuals only (requires double data types)"); return null; } @@ -1417,6 +1385,12 @@ public class OptimizerFactory { return makeParams(nms, 50, problem, randSeed, makeDefaultTerminator()); } + /** + * This constructs a standard DE variant with current-to-best/1 scheme, F=0.8, + * k=0.6, lambda=0.6. The population size is 50 by default. + * @param problem + * @return + */ public static final GOParameters standardDE( AbstractOptimizationProblem problem) { DifferentialEvolution de = new DifferentialEvolution(); @@ -1424,7 +1398,7 @@ public class OptimizerFactory { de.setF(0.8); de.setK(0.6); de.setLambda(0.6); - de.setMt(0.05); + de.setMt(0.05); // this is not really employed for currentToBest return makeParams(de, 50, problem, randSeed, makeDefaultTerminator()); } @@ -1434,19 +1408,13 @@ public class OptimizerFactory { es.setMu(15); es.setLambda(50); es.setPlusStrategy(false); - - AbstractEAIndividual indy = problem.getIndividualTemplate(); - - if ((indy != null) && (indy instanceof InterfaceESIndividual)) { - // Set CMA operator for mutation - indy.setMutationOperator(new MutateESGlobal()); - indy.setCrossoverOperator(new CrossoverESDefault()); - } else { - System.err - .println("Error, standard ES is implemented for ES individuals only (requires double data types)"); + + if (assertIndyType(problem,InterfaceESIndividual.class)) { + setTemplateOperators(problem, new MutateESGlobal(0.2, MutateESCrossoverTypeEnum.intermediate), 0.9, new CrossoverESDefault(), 0.2); + } else { + System.err.println("Error, standard ES is implemented for ES individuals only (requires double data types)"); return null; } - return makeESParams(es, problem); } @@ -1458,6 +1426,12 @@ public class OptimizerFactory { return makeParams(ga, 100, problem, randSeed, makeDefaultTerminator()); } + /** + * A standard constricted PSO instance with phi1=phi2=2.05, grid topology of range 1 and + * a population size of 30. The chi parameter is set to approx. 0.73 automatically. + * @param problem + * @return + */ public static final GOParameters standardPSO( AbstractOptimizationProblem problem) { ParticleSwarmOptimization pso = new ParticleSwarmOptimization(); @@ -1471,4 +1445,31 @@ public class OptimizerFactory { public static final GOParameters tribes(AbstractOptimizationProblem problem) { return makeParams(new Tribes(), 1, problem, randSeed, makeDefaultTerminator()); } + + /** + * Check if a given problem instance has a template individual matching the given class. + * + * @param prob + * @param cls + * @return + */ + private static boolean assertIndyType(AbstractOptimizationProblem prob, + Class cls) { + return cls.isAssignableFrom(prob.getIndividualTemplate().getClass()); + } + + /** + * Set the evolutionary operators of the individual template of the given problem instance. + * @param prob + * @param mute + * @param pMut + * @param cross + * @param pCross + */ + public static void setTemplateOperators(AbstractOptimizationProblem prob, InterfaceMutation mute, double pMut, InterfaceCrossover cross, double pCross) { + AbstractEAIndividual indy = prob.getIndividualTemplate(); + if ((indy != null)) { + indy.setOperators(mute, pMut, cross, pCross); + } + } } diff --git a/src/eva2/OptimizerRunnable.java b/src/eva2/OptimizerRunnable.java index 5dd8cb04..2961bfd5 100644 --- a/src/eva2/OptimizerRunnable.java +++ b/src/eva2/OptimizerRunnable.java @@ -4,9 +4,9 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.util.BitSet; - import eva2.server.go.IndividualInterface; import eva2.server.go.InterfaceGOParameters; +import eva2.server.go.InterfaceNotifyOnInformers; import eva2.server.go.InterfaceTerminator; import eva2.server.go.individuals.InterfaceDataTypeBinary; import eva2.server.go.individuals.InterfaceDataTypeDouble; @@ -14,12 +14,13 @@ import eva2.server.go.individuals.InterfaceDataTypeInteger; import eva2.server.go.operators.postprocess.InterfacePostProcessParams; import eva2.server.go.operators.postprocess.PostProcessParams; import eva2.server.go.populations.Population; +import eva2.server.go.populations.SolutionSet; import eva2.server.modules.GOParameters; import eva2.server.modules.Processor; import eva2.server.stat.AbstractStatistics; import eva2.server.stat.InterfaceStatistics; -import eva2.server.stat.StatisticsDummy; import eva2.server.stat.InterfaceTextListener; +import eva2.server.stat.StatisticsDummy; import eva2.server.stat.StatisticsStandalone; import eva2.server.stat.StatsParameter; import eva2.tools.jproxy.RemoteStateListener; @@ -86,7 +87,11 @@ public class OptimizerRunnable implements Runnable { */ public OptimizerRunnable(GOParameters params, InterfaceStatistics stats, boolean restart) { rnblID = cntID; - cntID++; + cntID++; + if (stats.getStatisticsParameter() instanceof InterfaceNotifyOnInformers) { + // addition for the statistics revision with selectable strings - make sure the go parameters are represented within the statistics + params.addInformableInstance((InterfaceNotifyOnInformers)(stats.getStatisticsParameter())); + } proc = new Processor(stats, null, params); if (proc.getStatistics() instanceof AbstractStatistics) ((AbstractStatistics)proc.getStatistics()).setSaveParams(false); doRestart = restart; @@ -121,6 +126,10 @@ public class OptimizerRunnable implements Runnable { InterfaceGOParameters params = proc.getGOParams(); proc = new Processor(stats, null, params); if (proc.getStatistics() instanceof AbstractStatistics) ((AbstractStatistics)proc.getStatistics()).setSaveParams(false); + if (stats.getStatisticsParameter() instanceof InterfaceNotifyOnInformers) { + // addition for the statistics revision with selectable strings - make sure the go parameters are represented within the statistics + params.addInformableInstance((InterfaceNotifyOnInformers)(stats.getStatisticsParameter())); + } } public void setTextListener(InterfaceTextListener lsnr) { @@ -184,10 +193,14 @@ public class OptimizerRunnable implements Runnable { return proc.getStatistics().getBestSolution(); } - public Population getSolutionSet() { + public Population getResultPopulation() { return proc.getResultPopulation(); } + public SolutionSet getSolutionSet() { + return (SolutionSet)proc.getGOParams().getOptimizer().getAllSolutions(); + } + public void setPostProcessingParams(InterfacePostProcessParams ppp) { proc.getGOParams().setPostProcessParams(ppp); } diff --git a/src/eva2/server/go/operators/mutation/MutateESCovarianceMatrixAdaption.java b/src/eva2/server/go/operators/mutation/MutateESCovarianceMatrixAdaption.java index a97134ca..454761d3 100644 --- a/src/eva2/server/go/operators/mutation/MutateESCovarianceMatrixAdaption.java +++ b/src/eva2/server/go/operators/mutation/MutateESCovarianceMatrixAdaption.java @@ -65,7 +65,16 @@ public class MutateESCovarianceMatrixAdaption implements InterfaceMutation, java if (mutator.m_Eigenvalues != null) this.m_Eigenvalues = (double[]) mutator.m_Eigenvalues.clone(); } - /** This method will enable you to clone a given mutation operator + /** + * Constructor allowing to set the range check option. + * + * @param doCheckConstraints if true, the range constraints are enforced on mutation. + */ + public MutateESCovarianceMatrixAdaption(boolean doCheckConstraints) { + setCheckConstraints(doCheckConstraints); + } + + /** This method will enable you to clone a given mutation operator * @return The clone */ public Object clone() { diff --git a/src/eva2/server/go/problems/WaitForEvARunnable.java b/src/eva2/server/go/problems/WaitForEvARunnable.java index a3c5c2a3..2302edb0 100644 --- a/src/eva2/server/go/problems/WaitForEvARunnable.java +++ b/src/eva2/server/go/problems/WaitForEvARunnable.java @@ -40,7 +40,7 @@ class WaitForEvARunnable implements Runnable { mp.log("\n"); // write results back to matlab mp.exportResultToMatlab(runnable); - mp.exportResultPopulationToMatlab(runnable.getSolutionSet()); + mp.exportResultPopulationToMatlab(runnable.getResultPopulation()); mp.log("reported results.\n"); mp.notifyFinished(); mp.log("notified finish.\n");