From b1a7fa79490cf6de1fa2739cc2dde873225feb5c Mon Sep 17 00:00:00 2001 From: Marcel Kronfeld Date: Thu, 4 Jun 2009 15:20:19 +0000 Subject: [PATCH] Making PBIL available from the Matlab interface. --- src/eva2/OptimizerFactory.java | 52 ++++++++++++++++++- .../server/go/populations/PBILPopulation.java | 8 ++- .../PopulationBasedIncrementalLearning.java | 14 +++++ 3 files changed, 71 insertions(+), 3 deletions(-) diff --git a/src/eva2/OptimizerFactory.java b/src/eva2/OptimizerFactory.java index 14865594..987aaf8b 100644 --- a/src/eva2/OptimizerFactory.java +++ b/src/eva2/OptimizerFactory.java @@ -36,8 +36,10 @@ import eva2.server.go.operators.selection.InterfaceSelection; import eva2.server.go.operators.selection.SelectBestIndividuals; import eva2.server.go.operators.terminators.CombinedTerminator; import eva2.server.go.operators.terminators.EvaluationTerminator; +import eva2.server.go.populations.PBILPopulation; import eva2.server.go.populations.Population; import eva2.server.go.problems.AbstractOptimizationProblem; +import eva2.server.go.problems.B1Problem; import eva2.server.go.strategies.ClusterBasedNichingEA; import eva2.server.go.strategies.ClusteringHillClimbing; import eva2.server.go.strategies.DifferentialEvolution; @@ -50,6 +52,7 @@ import eva2.server.go.strategies.InterfaceOptimizer; import eva2.server.go.strategies.MonteCarloSearch; import eva2.server.go.strategies.MultiObjectiveEA; import eva2.server.go.strategies.ParticleSwarmOptimization; +import eva2.server.go.strategies.PopulationBasedIncrementalLearning; import eva2.server.go.strategies.SimulatedAnnealing; import eva2.server.go.strategies.Tribes; import eva2.server.modules.GOParameters; @@ -104,6 +107,8 @@ public class OptimizerFactory { public final static int CMA_ES_IPOP = 11; public final static int CBN_GA = 12; + + public final static int PBIL = 13; public final static int defaultFitCalls = 10000; @@ -496,6 +501,41 @@ public class OptimizerFactory { return sa; } + /** + * Calling init here makes problems when using the Matlab interface. + * + * @param learningRate + * @param mutateSigma + * @param mutationRate + * @param positiveSamples + * @param selection + * @param popsize + * @param problem + * @param listener + * @return + */ + public static final PopulationBasedIncrementalLearning createPBIL( + double learningRate, double mutateSigma, double mutationRate, + int positiveSamples, InterfaceSelection selection, int popsize, + AbstractOptimizationProblem problem, InterfacePopulationChangedEventListener listener) { + problem.initProblem(); + PopulationBasedIncrementalLearning pbil = new PopulationBasedIncrementalLearning(); + + pbil.setLearningRate(learningRate); + pbil.setMutateSigma(mutateSigma); + pbil.setMutationRate(mutationRate); + pbil.setPopulation(new PBILPopulation(popsize)); + pbil.setSelectionMethod(selection); + pbil.setPositiveSamples(positiveSamples); + + pbil.addPopulationChangedEventListener(listener); + pbil.SetProblem(problem); + + if (listener != null) listener.registerPopulationStateChanged(pbil.getPopulation(), ""); + + return pbil; + } + // /////////////////////////// Termination criteria public static InterfaceTerminator makeDefaultTerminator() { return new EvaluationTerminator(defaultFitCalls); @@ -547,6 +587,8 @@ public class OptimizerFactory { return cmaESIPOP(problem); case CBN_GA: return cbnGA(problem); + case PBIL: + return standardPBIL(problem); default: System.err.println("Error: optimizer type " + optType + " is unknown!"); @@ -562,7 +604,8 @@ public class OptimizerFactory { */ public static String showOptimizers() { return "1: Standard ES \n2: CMA-ES \n3: GA \n4: PSO \n5: DE \n6: Tribes \n7: Random (Monte Carlo) " - + "\n8: Hill-Climbing \n9: Cluster-based niching ES \n10: Clustering Hill-Climbing \n11: IPOP-CMA-ES."; + + "\n8: Hill-Climbing \n9: Cluster-based niching ES \n10: Clustering Hill-Climbing \n11: IPOP-CMA-ES " + + "\n12: Cluster-based niching GA \n13: PBIL"; } /** @@ -1110,6 +1153,13 @@ public class OptimizerFactory { return makeParams(cbn, 100, problem, randSeed, makeDefaultTerminator()); } + public static final GOParameters standardPBIL(AbstractOptimizationProblem problem) { + PopulationBasedIncrementalLearning pbil = createPBIL(0.04, 0.01, 0.5, 1, + new SelectBestIndividuals(), 50, problem, null); + + return makeParams(pbil, pbil.getPopulation(), problem, randSeed, makeDefaultTerminator()); + } + /** * Create a standard clustering hill climbing employing simple ES mutation with adaptive * step size, starting in parallel 100 local searches and clustering intermediate populations diff --git a/src/eva2/server/go/populations/PBILPopulation.java b/src/eva2/server/go/populations/PBILPopulation.java index ced2fea9..6ba9e972 100644 --- a/src/eva2/server/go/populations/PBILPopulation.java +++ b/src/eva2/server/go/populations/PBILPopulation.java @@ -19,11 +19,15 @@ import wsi.ra.math.RNG; public class PBILPopulation extends Population implements Cloneable, java.io.Serializable { - private double[] m_ProbabilityVector = new double[0]; + private double[] m_ProbabilityVector = new double[1]; public PBILPopulation() { } + public PBILPopulation(int popSize) { + super(popSize); + } + public PBILPopulation(PBILPopulation population) { this.m_Generation = population.m_Generation; this.m_FunctionCalls = population.m_FunctionCalls; @@ -132,7 +136,7 @@ public class PBILPopulation extends Population implements Cloneable, java.io.Ser public void SetProbabilityVector(double[] pv) { this.m_ProbabilityVector = pv; } - public double[] getProbabilityVector(double[] pv) { + public double[] getProbabilityVector() { return this.m_ProbabilityVector; } diff --git a/src/eva2/server/go/strategies/PopulationBasedIncrementalLearning.java b/src/eva2/server/go/strategies/PopulationBasedIncrementalLearning.java index f692ba21..50989205 100644 --- a/src/eva2/server/go/strategies/PopulationBasedIncrementalLearning.java +++ b/src/eva2/server/go/strategies/PopulationBasedIncrementalLearning.java @@ -38,6 +38,7 @@ public class PopulationBasedIncrementalLearning implements InterfaceOptimizer, j private double m_MutationRate = 0.5; private double m_MutateSigma = 0.01; private int m_NumberOfPositiveSamples = 1; + private double[] m_initialProbabilities = ((PBILPopulation)m_Population).getProbabilityVector(); public PopulationBasedIncrementalLearning() { } @@ -59,6 +60,11 @@ public class PopulationBasedIncrementalLearning implements InterfaceOptimizer, j public void init() { this.m_Problem.initPopulation(this.m_Population); + if ((m_initialProbabilities!=null) && (m_initialProbabilities.length==((PBILPopulation)m_Population).getProbabilityVector().length)) { + ((PBILPopulation)m_Population).SetProbabilityVector(m_initialProbabilities); + } else { + if (m_initialProbabilities!=null) System.err.println("Warning: initial probability vector doesnt match in length!"); + } this.evaluatePopulation(this.m_Population); this.firePropertyChangedEvent(Population.nextGenerationPerformed); } @@ -308,4 +314,12 @@ public class PopulationBasedIncrementalLearning implements InterfaceOptimizer, j public String positiveSamplesTipText() { return "The number of positive samples that update the PBIL vector."; } + + public double[] getInitialProbabilities() { + return m_initialProbabilities; + } + + public void setInitialProbabilities(double[] probabilities) { + m_initialProbabilities = probabilities; + } } \ No newline at end of file