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.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

View File

@ -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;
}

View File

@ -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;
}
}