CBN should now also work with (m+l)-ES

This commit is contained in:
Marcel Kronfeld 2008-03-31 16:22:07 +00:00
parent ae0c66c212
commit a62b85ec29
3 changed files with 51 additions and 18 deletions

View File

@ -321,14 +321,16 @@ public class PostProcess {
* @param maxSteps * @param maxSteps
* @param fixedStepSize * @param fixedStepSize
*/ */
public static void processWithHC(Population pop, AbstractOptimizationProblem problem, int maxSteps, double fixedStepSize) { public static int processWithHC(Population pop, AbstractOptimizationProblem problem, int maxSteps, double fixedStepSize) {
// pop.SetFunctionCalls(0); // or else optimization wont restart on an "old" population // pop.SetFunctionCalls(0); // or else optimization wont restart on an "old" population
// pop.setGenerationTo(0); // pop.setGenerationTo(0);
int stepsBef = pop.getFunctionCalls();
processWithHC(pop, problem, new EvaluationTerminator(pop.getFunctionCalls()+maxSteps), new MutateESFixedStepSize(fixedStepSize)); processWithHC(pop, problem, new EvaluationTerminator(pop.getFunctionCalls()+maxSteps), new MutateESFixedStepSize(fixedStepSize));
return pop.getFunctionCalls()-stepsBef;
} }
public static void processWithHC(Population pop, AbstractOptimizationProblem problem, int maxSteps) { public static int processWithHC(Population pop, AbstractOptimizationProblem problem, int maxSteps) {
processWithHC(pop, problem, maxSteps, defaultMutationStepSize); return processWithHC(pop, problem, maxSteps, defaultMutationStepSize);
} }
/** /**
* Optimize a population with a default hill-climbing heuristic with a given termination criterion and mutation operator. * Optimize a population with a default hill-climbing heuristic with a given termination criterion and mutation operator.
@ -504,8 +506,8 @@ public class PostProcess {
} else clusteredPop = inputPop; } else clusteredPop = inputPop;
if (params.getPostProcessSteps() > 0) { if (params.getPostProcessSteps() > 0) {
processWithHC(clusteredPop, problem, params.getPostProcessSteps()); int stepsDone = processWithHC(clusteredPop, problem, params.getPostProcessSteps());
if (listener != null) listener.println("HC post processing: " + params.getPostProcessSteps() + " steps done."); if (listener != null) listener.println("HC post processing: " + stepsDone + " steps done.");
// some individuals may have now converged again // some individuals may have now converged again
if (params.getPostProcessClusterSigma() > 0) { if (params.getPostProcessClusterSigma() > 0) {
// so if wished, cluster again. // so if wished, cluster again.

View File

@ -307,22 +307,30 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
// m_Optimizer.initByPopulation(species, false); // m_Optimizer.initByPopulation(species, false);
if (m_Optimizer instanceof EvolutionStrategies) { if (m_Optimizer instanceof EvolutionStrategies) {
EvolutionStrategies es = (EvolutionStrategies)m_Optimizer; EvolutionStrategies es = (EvolutionStrategies)m_Optimizer;
int mu = (int)(muLambdaRatio*species.size()); int mu = Math.max(1,(int)(muLambdaRatio*species.size()));
if (mu < 1) mu = 1; if (mu >= species.size()) {
else if (mu >= species.size()) {
if (TRACE) System.err.println("warning, muLambdaRatio produced mu >= lambda.. reducing to mu=lambda-1"); if (TRACE) System.err.println("warning, muLambdaRatio produced mu >= lambda.. reducing to mu=lambda-1");
mu = species.size() - 1; mu = species.size() - 1;
} }
es.setMu(mu); es.setMu(mu);
es.setLambda(species.size()); es.setLambda(species.size());
if (TRACE) System.out.println("mu: "+es.getMu() + " / lambda: " + es.getLambda());
} }
if (TRACE) { if (TRACE) {
System.out.println("spec size: " + species.size() + ", says its " + species.getPopulationSize()); System.out.println("Bef: spec size: " + species.size() + ", says its " + species.getPopulationSize());
System.out.println("Best bef: " + BeanInspector.toString(m_Optimizer.getPopulation().getBestFitness())); System.out.println("Best bef: " + BeanInspector.toString(m_Optimizer.getPopulation().getBestFitness()));
} }
this.m_Optimizer.optimize(); this.m_Optimizer.optimize();
if (TRACE) System.out.println("Best aft: " + BeanInspector.toString(m_Optimizer.getPopulation().getBestFitness())); Population retPop = m_Optimizer.getPopulation();
return m_Optimizer.getPopulation(); if (TRACE) {
System.out.println("Aft: spec size: " + retPop.size() + ", says its " + retPop.getPopulationSize());
System.out.println("Best aft: " + BeanInspector.toString(retPop.getBestFitness()));
}
if (retPop.size() != retPop.getPopulationSize()) {
if (TRACE) System.out.println("correcting popsize after opt: " + retPop.getPopulationSize() + " to " + retPop.size());
retPop.setPopulationSize(retPop.size());
}
return retPop;
} }
public void optimize() { public void optimize() {

View File

@ -39,7 +39,9 @@ public class EvolutionStrategies implements InterfaceOptimizer, java.io.Serializ
private InterfaceSelection m_PartnerSelection = new SelectRandom(); private InterfaceSelection m_PartnerSelection = new SelectRandom();
private InterfaceSelection m_EnvironmentSelection = new SelectBestIndividuals(); private InterfaceSelection m_EnvironmentSelection = new SelectBestIndividuals();
private int m_NumberOfPartners = 1; private int m_NumberOfPartners = 1;
private int origPopSize = -1; // especially for CBN
private double[] m_FitnessOfParents = null; private double[] m_FitnessOfParents = null;
private boolean forceOrigPopSize = true;// especially for CBN
transient private String m_Identifier = ""; transient private String m_Identifier = "";
transient private InterfacePopulationChangedEventListener m_Listener; transient private InterfacePopulationChangedEventListener m_Listener;
@ -75,14 +77,14 @@ public class EvolutionStrategies implements InterfaceOptimizer, java.io.Serializ
public void init() { public void init() {
// @todo In case of CBN-ES i need to read the population size!? // @todo In case of CBN-ES i need to read the population size!?
// @todo but how!? I guess this will never do... // @todo but how!? I guess this will never do...
int orgPopSize = this.m_Population.getPopulationSize(); // int orgPopSize = this.m_Population.getPopulationSize();
if (this.m_InitialPopulationSize > orgPopSize) { // if (this.m_InitialPopulationSize > orgPopSize) {
this.m_Population.setPopulationSize(this.m_InitialPopulationSize); // this.m_Population.setPopulationSize(this.m_InitialPopulationSize);
} // }
//System.out.println("init"); //System.out.println("init");
this.m_Problem.initPopulation(this.m_Population); this.m_Problem.initPopulation(this.m_Population);
this.evaluatePopulation(this.m_Population); this.evaluatePopulation(this.m_Population);
this.m_Population.setPopulationSize(orgPopSize); // this.m_Population.setPopulationSize(orgPopSize);
this.firePropertyChangedEvent("NextGenerationPerformed"); this.firePropertyChangedEvent("NextGenerationPerformed");
// int myu = this.m_Population.getPopulationSize(); // int myu = this.m_Population.getPopulationSize();
// int initPopSize = 0; // int initPopSize = 0;
@ -101,6 +103,8 @@ public class EvolutionStrategies implements InterfaceOptimizer, java.io.Serializ
* @param reset If true the population is reset. * @param reset If true the population is reset.
*/ */
public void initByPopulation(Population pop, boolean reset) { public void initByPopulation(Population pop, boolean reset) {
origPopSize = pop.getPopulationSize();
// System.out.println("ES: orig popsize is " + origPopSize);
this.m_Population = (Population)pop.clone(); this.m_Population = (Population)pop.clone();
if (reset) this.m_Population.init(); if (reset) this.m_Population.init();
this.evaluatePopulation(this.m_Population); this.evaluatePopulation(this.m_Population);
@ -181,11 +185,14 @@ public class EvolutionStrategies implements InterfaceOptimizer, java.io.Serializ
//// System.out.println("Population Strategy: ("+ this.m_Myu+","+this.m_Lambda+")"); //// System.out.println("Population Strategy: ("+ this.m_Myu+","+this.m_Lambda+")");
// } // }
//System.out.println("optimize"); //System.out.println("optimize");
// first perform the environment selection to select myu parents // first perform the environment selection to select myu parents
this.m_EnvironmentSelection.prepareSelection(this.m_Population); this.m_EnvironmentSelection.prepareSelection(this.m_Population);
parents = this.m_EnvironmentSelection.selectFrom(this.m_Population, this.m_Mu); parents = this.m_EnvironmentSelection.selectFrom(this.m_Population, this.m_Mu);
this.m_Population.clear(); this.m_Population.clear();
this.m_Population.addPopulation(parents); this.m_Population.addPopulation(parents);
// now generate the lambda offsprings // now generate the lambda offsprings
this.m_FitnessOfParents = null; this.m_FitnessOfParents = null;
nextGeneration = this.generateChildren(); nextGeneration = this.generateChildren();
@ -199,7 +206,21 @@ public class EvolutionStrategies implements InterfaceOptimizer, java.io.Serializ
this.applySuccessRule((rate/((double)this.m_FitnessOfParents.length)), this.m_Population, nextGeneration); this.applySuccessRule((rate/((double)this.m_FitnessOfParents.length)), this.m_Population, nextGeneration);
} }
if (this.m_UsePlusStrategy) nextGeneration.addPopulation(this.m_Population); if (this.m_UsePlusStrategy) nextGeneration.addPopulation(this.m_Population);
this.m_Population = nextGeneration;
if (forceOrigPopSize && (origPopSize > 0) && (origPopSize < nextGeneration.size())) {
// this is especially for CBN:
this.m_EnvironmentSelection.prepareSelection(nextGeneration);
Population tmpPop = (Population)nextGeneration.clone();
nextGeneration.clear();
nextGeneration.addPopulation(this.m_EnvironmentSelection.selectFrom(tmpPop, origPopSize));
// System.out.println("ES post selection! " + origPopSize + " from " + tmpPop.size());
m_Population = nextGeneration;
} else {
if ((origPopSize > 0) && (origPopSize != nextGeneration.size())) {
System.err.println("Warning in ES! orig: " + origPopSize + " / " + nextGeneration.size());
}
this.m_Population = nextGeneration;
}
//System.out.println("Population size: " + this.m_Population.size()); //System.out.println("Population size: " + this.m_Population.size());
//System.out.println("-- Best Fitness " + this.m_Population.getBestFitness()[0]); //System.out.println("-- Best Fitness " + this.m_Population.getBestFitness()[0]);
@ -208,7 +229,7 @@ public class EvolutionStrategies implements InterfaceOptimizer, java.io.Serializ
/** This method is just a shortcut to set the mutation step size for /** This method is just a shortcut to set the mutation step size for
* all individuals of these two populations for the 1/5 Success rule. * all individuals of these two populations for the 1/5 Success rule.
* This is only necessary because i decieded to make the variable * This is only necessary because i decided to make the variable
* non static * non static
* @param successRate The success rate * @param successRate The success rate
* @param oldPop The old population * @param oldPop The old population
@ -353,6 +374,8 @@ public class EvolutionStrategies implements InterfaceOptimizer, java.io.Serializ
return this.m_Population; return this.m_Population;
} }
public void setPopulation(Population pop){ public void setPopulation(Population pop){
origPopSize = pop.size();
// System.out.println("ES: orig popsize is " + origPopSize);
this.m_Population = pop; this.m_Population = pop;
} }
public String populationTipText() { public String populationTipText() {