Making PBIL available from the Matlab interface.

This commit is contained in:
Marcel Kronfeld 2009-06-04 15:20:19 +00:00
parent 947ee034bd
commit b1a7fa7949
3 changed files with 71 additions and 3 deletions

View File

@ -36,8 +36,10 @@ import eva2.server.go.operators.selection.InterfaceSelection;
import eva2.server.go.operators.selection.SelectBestIndividuals; import eva2.server.go.operators.selection.SelectBestIndividuals;
import eva2.server.go.operators.terminators.CombinedTerminator; import eva2.server.go.operators.terminators.CombinedTerminator;
import eva2.server.go.operators.terminators.EvaluationTerminator; import eva2.server.go.operators.terminators.EvaluationTerminator;
import eva2.server.go.populations.PBILPopulation;
import eva2.server.go.populations.Population; import eva2.server.go.populations.Population;
import eva2.server.go.problems.AbstractOptimizationProblem; import eva2.server.go.problems.AbstractOptimizationProblem;
import eva2.server.go.problems.B1Problem;
import eva2.server.go.strategies.ClusterBasedNichingEA; import eva2.server.go.strategies.ClusterBasedNichingEA;
import eva2.server.go.strategies.ClusteringHillClimbing; import eva2.server.go.strategies.ClusteringHillClimbing;
import eva2.server.go.strategies.DifferentialEvolution; 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.MonteCarloSearch;
import eva2.server.go.strategies.MultiObjectiveEA; import eva2.server.go.strategies.MultiObjectiveEA;
import eva2.server.go.strategies.ParticleSwarmOptimization; import eva2.server.go.strategies.ParticleSwarmOptimization;
import eva2.server.go.strategies.PopulationBasedIncrementalLearning;
import eva2.server.go.strategies.SimulatedAnnealing; import eva2.server.go.strategies.SimulatedAnnealing;
import eva2.server.go.strategies.Tribes; import eva2.server.go.strategies.Tribes;
import eva2.server.modules.GOParameters; import eva2.server.modules.GOParameters;
@ -104,6 +107,8 @@ public class OptimizerFactory {
public final static int CMA_ES_IPOP = 11; public final static int CMA_ES_IPOP = 11;
public final static int CBN_GA = 12; public final static int CBN_GA = 12;
public final static int PBIL = 13;
public final static int defaultFitCalls = 10000; public final static int defaultFitCalls = 10000;
@ -496,6 +501,41 @@ public class OptimizerFactory {
return sa; 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 // /////////////////////////// Termination criteria
public static InterfaceTerminator makeDefaultTerminator() { public static InterfaceTerminator makeDefaultTerminator() {
return new EvaluationTerminator(defaultFitCalls); return new EvaluationTerminator(defaultFitCalls);
@ -547,6 +587,8 @@ public class OptimizerFactory {
return cmaESIPOP(problem); return cmaESIPOP(problem);
case CBN_GA: case CBN_GA:
return cbnGA(problem); return cbnGA(problem);
case PBIL:
return standardPBIL(problem);
default: default:
System.err.println("Error: optimizer type " + optType System.err.println("Error: optimizer type " + optType
+ " is unknown!"); + " is unknown!");
@ -562,7 +604,8 @@ public class OptimizerFactory {
*/ */
public static String showOptimizers() { public static String showOptimizers() {
return "1: Standard ES \n2: CMA-ES \n3: GA \n4: PSO \n5: DE \n6: Tribes \n7: Random (Monte Carlo) " 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()); 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 * Create a standard clustering hill climbing employing simple ES mutation with adaptive
* step size, starting in parallel 100 local searches and clustering intermediate populations * step size, starting in parallel 100 local searches and clustering intermediate populations

View File

@ -19,11 +19,15 @@ import wsi.ra.math.RNG;
public class PBILPopulation extends Population implements Cloneable, java.io.Serializable { 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() {
} }
public PBILPopulation(int popSize) {
super(popSize);
}
public PBILPopulation(PBILPopulation population) { public PBILPopulation(PBILPopulation population) {
this.m_Generation = population.m_Generation; this.m_Generation = population.m_Generation;
this.m_FunctionCalls = population.m_FunctionCalls; 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) { public void SetProbabilityVector(double[] pv) {
this.m_ProbabilityVector = pv; this.m_ProbabilityVector = pv;
} }
public double[] getProbabilityVector(double[] pv) { public double[] getProbabilityVector() {
return this.m_ProbabilityVector; return this.m_ProbabilityVector;
} }

View File

@ -38,6 +38,7 @@ public class PopulationBasedIncrementalLearning implements InterfaceOptimizer, j
private double m_MutationRate = 0.5; private double m_MutationRate = 0.5;
private double m_MutateSigma = 0.01; private double m_MutateSigma = 0.01;
private int m_NumberOfPositiveSamples = 1; private int m_NumberOfPositiveSamples = 1;
private double[] m_initialProbabilities = ((PBILPopulation)m_Population).getProbabilityVector();
public PopulationBasedIncrementalLearning() { public PopulationBasedIncrementalLearning() {
} }
@ -59,6 +60,11 @@ public class PopulationBasedIncrementalLearning implements InterfaceOptimizer, j
public void init() { public void init() {
this.m_Problem.initPopulation(this.m_Population); 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.evaluatePopulation(this.m_Population);
this.firePropertyChangedEvent(Population.nextGenerationPerformed); this.firePropertyChangedEvent(Population.nextGenerationPerformed);
} }
@ -308,4 +314,12 @@ public class PopulationBasedIncrementalLearning implements InterfaceOptimizer, j
public String positiveSamplesTipText() { public String positiveSamplesTipText() {
return "The number of positive samples that update the PBIL vector."; 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;
}
} }