From 2db50903f83cecce231352f83a72da97c42b1a65 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andreas=20Dr=C3=A4ger?=
Date: Thu, 27 Mar 2008 15:55:39 +0000
Subject: [PATCH] Improved the OptimizerFactory. However, the optimizer.init()
methods have to be called after all settings were applied to the certain
optimizer.
---
src/javaeva/OptimizerFactory.java | 176 +++++++++++++++---------------
1 file changed, 88 insertions(+), 88 deletions(-)
diff --git a/src/javaeva/OptimizerFactory.java b/src/javaeva/OptimizerFactory.java
index ba7ff4a2..b6c2ee5d 100644
--- a/src/javaeva/OptimizerFactory.java
+++ b/src/javaeva/OptimizerFactory.java
@@ -1,3 +1,6 @@
+/*
+ * Copyright (c) ZBiT, University of Tübingen, Germany
+ */
package javaeva;
import java.util.BitSet;
@@ -59,37 +62,47 @@ import javaeva.server.modules.GOParameters;
* while (!terminator.isTerminated(mc.getPopulation())) mc.optimize();
*
*
- *
+ *
* @version 0.1
* @since 2.0
* @author mkron
* @author Andreas Dräger
- * @date 17.04.2007 Copyright (c) ZBiT, University of Tübingen, Germany
- * Compiler: JDK 1.5.0_10
+ * @date 17.04.2007
*/
public class OptimizerFactory {
private static InterfaceTerminator term = null;
public final static int STD_ES = 1;
+
public final static int CMA_ES = 2;
+
public final static int STD_GA = 3;
+
public final static int PSO = 4;
+
public final static int DE = 5;
+
public final static int TRIBES = 6;
+
public final static int RANDOM = 7;
+
public final static int HILLCL = 8;
+
public final static int CBN_ES = 9;
+
public final static int CL_HILLCL = 10;
public final static int defaultFitCalls = 10000;
+
public final static int randSeed = 0;
+
private static OptimizerRunnable lastRunnable = null;
/**
* Add an InterfaceTerminator to any new optimizer in a boolean combination.
* The old and the given terminator will be combined as in (TOld && TNew) if
* bAnd is true, and as in (TOld || TNew) if bAnd is false.
- *
+ *
* @param newTerm
* a new InterfaceTerminator instance
* @param bAnd
@@ -102,7 +115,7 @@ public class OptimizerFactory {
bAnd));
}
- public static GOParameters cbnES(AbstractOptimizationProblem problem) {
+ public static final GOParameters cbnES(AbstractOptimizationProblem problem) {
ClusterBasedNichingEA cbn = new ClusterBasedNichingEA();
EvolutionStrategies es = new EvolutionStrategies();
es.setMu(15);
@@ -112,7 +125,7 @@ public class OptimizerFactory {
ClusteringDensityBased clustering = new ClusteringDensityBased(0.1);
cbn.setConvergenceCA((ClusteringDensityBased) clustering.clone());
cbn.setDifferentationCA(clustering);
- cbn.setShowCycle(0); // dont do graphical output
+ cbn.setShowCycle(0); // don't do graphical output
Population pop = new Population();
pop.setPopulationSize(100);
@@ -121,7 +134,7 @@ public class OptimizerFactory {
return makeParams(cbn, pop, problem, randSeed, defaultTerminator());
}
- public static GOParameters clusteringHillClimbing(
+ public static final GOParameters clusteringHillClimbing(
AbstractOptimizationProblem problem) {
ClusteringHillClimbing chc = new ClusteringHillClimbing();
chc.SetProblem(problem);
@@ -138,35 +151,37 @@ public class OptimizerFactory {
return makeParams(chc, pop, problem, randSeed, defaultTerminator());
}
- public static GOParameters cmaES(AbstractOptimizationProblem problem) {
+ public static final GOParameters cmaES(AbstractOptimizationProblem problem) {
EvolutionStrategies es = new EvolutionStrategies();
es.setMu(15);
es.setLambda(50);
es.setPlusStrategy(false);
-
- // TODO improve this by adding getEAIndividual to AbstractEAIndividual?
- AbstractEAIndividual indyTemplate = problem.getIndividualTemplate();
- if ((indyTemplate != null) && (indyTemplate instanceof InterfaceESIndividual)) {
+
+ // TODO improve this by adding getEAIndividual to AbstractEAIndividual?
+ AbstractEAIndividual indyTemplate = problem.getIndividualTemplate();
+ if ((indyTemplate != null)
+ && (indyTemplate instanceof InterfaceESIndividual)) {
// Set CMA operator for mutation
- AbstractEAIndividual indy = (AbstractEAIndividual)indyTemplate;
+ AbstractEAIndividual indy = (AbstractEAIndividual) indyTemplate;
MutateESCovarianceMartixAdaption cmaMut = new MutateESCovarianceMartixAdaption();
cmaMut.setCheckConstraints(true);
indy.setMutationOperator(cmaMut);
indy.setCrossoverOperator(new CrossoverESDefault());
} else {
- System.err.println("Error, CMA-ES is implemented for ES individuals only (requires double data types)");
+ System.err
+ .println("Error, CMA-ES is implemented for ES individuals only (requires double data types)");
return null;
}
-
+
Population pop = new Population();
pop.setPopulationSize(es.getLambda());
-
+
return makeParams(es, pop, problem, randSeed, defaultTerminator());
}
/**
* This method optimizes the given problem using differential evolution.
- *
+ *
* @param problem
* @param popsize
* @param f
@@ -204,7 +219,7 @@ public class OptimizerFactory {
/**
* This method performs the optimization using an Evolution strategy.
- *
+ *
* @param mu
* @param lambda
* @param plus
@@ -248,7 +263,7 @@ public class OptimizerFactory {
/**
* This method performs a Genetic Algorithm.
- *
+ *
* @param mut
* @param pm
* @param cross
@@ -288,7 +303,7 @@ public class OptimizerFactory {
/**
* This starts a Gradient Descent.
- *
+ *
* @param problem
* @return An optimization algorithm that performs gradient descent.
*/
@@ -312,7 +327,7 @@ public class OptimizerFactory {
/**
* This method performs a Hill Climber algorithm.
- *
+ *
* @param pop
* The size of the population
* @param problem
@@ -335,7 +350,6 @@ public class OptimizerFactory {
tmpIndi.setCrossoverProbability(0);
HillClimbing hc = new HillClimbing();
- // System.out.println(hc.getStringRepresentation());
hc.getPopulation().setPopulationSize(pop);
hc.addPopulationChangedEventListener(listener);
hc.SetProblem(problem);
@@ -349,7 +363,7 @@ public class OptimizerFactory {
/**
* This method performs a Monte Carlo Search with the given number of
* fitnesscalls.
- *
+ *
* @param problem
* @param listener
* @return An optimization procedure that performes the random walk.
@@ -377,7 +391,7 @@ public class OptimizerFactory {
/**
* This method performs a particle swarm optimization.
- *
+ *
* @param problem
* @param mut
* @param popsize
@@ -421,7 +435,7 @@ public class OptimizerFactory {
* This method performs a Simulated Annealing Optimization and prints the
* result as R output. It uses real valued individuals. The mutation
* probability is always 1.0.
- *
+ *
* @param problem
* @param popsize
* @param alpha
@@ -467,35 +481,36 @@ public class OptimizerFactory {
/**
* The default Terminator finishes after n fitness calls, the default n is
* returned here.
- *
+ *
* @return the default number of fitness call done before termination
*/
- public static int getDefaultFitCalls() {
+ public static final int getDefaultFitCalls() {
return defaultFitCalls;
}
-
-///////////////////////////// constructing a default OptimizerRunnable
- public static GOParameters getParams(final int optType, AbstractOptimizationProblem problem) {
+ // /////////////////////////// constructing a default OptimizerRunnable
+
+ public static GOParameters getParams(final int optType,
+ AbstractOptimizationProblem problem) {
switch (optType) {
case STD_ES:
- return standardES(problem);
+ return standardES(problem);
case CMA_ES:
- return cmaES(problem);
+ return cmaES(problem);
case STD_GA:
- return standardGA(problem);
+ return standardGA(problem);
case PSO:
return standardPSO(problem);
case DE:
- return standardDE(problem);
+ return standardDE(problem);
case TRIBES:
- return tribes(problem);
+ return tribes(problem);
case RANDOM:
- return monteCarlo(problem);
+ return monteCarlo(problem);
case HILLCL:
- return hillClimbing(problem);
+ return hillClimbing(problem);
case CBN_ES:
- return cbnES(problem);
+ return cbnES(problem);
case CL_HILLCL:
return clusteringHillClimbing(problem);
default:
@@ -503,13 +518,15 @@ public class OptimizerFactory {
return null;
}
}
-
- public static OptimizerRunnable getOptRunnable(final int optType, AbstractOptimizationProblem problem, int fitCalls, String outputFilePrefix) {
+
+ public static OptimizerRunnable getOptRunnable(final int optType,
+ AbstractOptimizationProblem problem, int fitCalls, String outputFilePrefix) {
OptimizerRunnable opt = null;
GOParameters params = getParams(optType, problem);
if (params != null) {
opt = new OptimizerRunnable(params, outputFilePrefix);
- if (fitCalls != defaultFitCalls) opt.getGOParams().setTerminator(new EvaluationTerminator(fitCalls));
+ if (fitCalls != defaultFitCalls)
+ opt.getGOParams().setTerminator(new EvaluationTerminator(fitCalls));
}
return opt;
}
@@ -524,7 +541,8 @@ public class OptimizerFactory {
return OptimizerFactory.term;
}
- public static GOParameters hillClimbing(AbstractOptimizationProblem problem) {
+ public static final GOParameters hillClimbing(
+ AbstractOptimizationProblem problem) {
HillClimbing hc = new HillClimbing();
hc.SetProblem(problem);
Population pop = new Population();
@@ -534,9 +552,7 @@ public class OptimizerFactory {
}
public static int lastEvalsPerformed() {
- if (lastRunnable != null)
- return lastRunnable.getProgress();
- else return -1;
+ return (lastRunnable != null) ? lastRunnable.getProgress() : -1;
}
// /////////////////////// Creating default strategies
@@ -552,7 +568,8 @@ public class OptimizerFactory {
return params;
}
- public static GOParameters monteCarlo(AbstractOptimizationProblem problem) {
+ public static final GOParameters monteCarlo(
+ AbstractOptimizationProblem problem) {
MonteCarloSearch mc = new MonteCarloSearch();
Population pop = new Population();
pop.setPopulationSize(50);
@@ -567,11 +584,10 @@ public class OptimizerFactory {
}
public static OptimizerRunnable optimize(OptimizerRunnable runnable) {
- if (runnable != null) {
- new Thread(runnable).run();
- lastRunnable = runnable;
- return runnable;
- } else return null;
+ if (runnable == null) return null;
+ new Thread(runnable).run();
+ lastRunnable = runnable;
+ return runnable;
}
/**
@@ -579,7 +595,7 @@ public class OptimizerFactory {
* thread. The Runnable will notify waiting threads and set the isFinished
* flag when the optimization is complete. If the optType is invalid, null
* will be returned.
- *
+ *
* @param optType
* @param problem
* @param outputFilePrefix
@@ -605,17 +621,13 @@ public class OptimizerFactory {
public static BitSet optimizeToBinary(final int optType,
AbstractOptimizationProblem problem, String outputFilePrefix) {
OptimizerRunnable runnable = optimize(optType, problem, outputFilePrefix);
- if (runnable != null)
- return runnable.getBinarySolution();
- else return null;
+ return (runnable != null) ? runnable.getBinarySolution() : null;
}
// ///////////////////////////// Optimize a given runnable
public static BitSet optimizeToBinary(OptimizerRunnable runnable) {
optimize(runnable);
- if (runnable != null)
- return runnable.getBinarySolution();
- else return null;
+ return (runnable != null) ? runnable.getBinarySolution() : null;
}
public static double[] optimizeToDouble(GOParameters params,
@@ -628,16 +640,12 @@ public class OptimizerFactory {
public static double[] optimizeToDouble(final int optType,
AbstractOptimizationProblem problem, String outputFilePrefix) {
OptimizerRunnable runnable = optimize(optType, problem, outputFilePrefix);
- if (runnable != null)
- return runnable.getDoubleSolution();
- else return null;
+ return (runnable != null) ? runnable.getDoubleSolution() : null;
}
public static double[] optimizeToDouble(OptimizerRunnable runnable) {
optimize(runnable);
- if (runnable != null)
- return runnable.getDoubleSolution();
- else return null;
+ return (runnable != null) ? runnable.getDoubleSolution() : null;
}
public static IndividualInterface optimizeToInd(GOParameters params,
@@ -650,16 +658,12 @@ public class OptimizerFactory {
public static IndividualInterface optimizeToInd(final int optType,
AbstractOptimizationProblem problem, String outputFilePrefix) {
OptimizerRunnable runnable = optimize(optType, problem, outputFilePrefix);
- if (runnable != null)
- return runnable.getResult();
- else return null;
+ return (runnable != null) ? runnable.getResult() : null;
}
public static IndividualInterface optimizeToInd(OptimizerRunnable runnable) {
optimize(runnable);
- if (runnable != null)
- return runnable.getResult();
- else return null;
+ return (runnable != null) ? runnable.getResult() : null;
}
public static Population optimizeToPop(GOParameters params,
@@ -672,16 +676,12 @@ public class OptimizerFactory {
public static Population optimizeToPop(final int optType,
AbstractOptimizationProblem problem, String outputFilePrefix) {
OptimizerRunnable runnable = optimize(optType, problem, outputFilePrefix);
- if (runnable != null)
- return runnable.getSolutionSet();
- else return null;
+ return (runnable != null) ? runnable.getSolutionSet() : null;
}
public static Population optimizeToPop(OptimizerRunnable runnable) {
optimize(runnable);
- if (runnable != null)
- return runnable.getSolutionSet();
- else return null;
+ return (runnable != null) ? runnable.getSolutionSet() : null;
}
public static Population postProcess(int steps, double sigma, int nBest) {
@@ -746,9 +746,7 @@ public class OptimizerFactory {
public static Vector postProcessDblVec(
InterfacePostProcessParams ppp) {
- if (lastRunnable != null)
- return postProcessDblVec(lastRunnable, ppp);
- else return null;
+ return (lastRunnable != null) ? postProcessDblVec(lastRunnable, ppp) : null;
}
public static Vector postProcessDblVec(OptimizerRunnable runnable,
@@ -817,7 +815,7 @@ public class OptimizerFactory {
/**
* Return a simple String showing the accessible optimizers. For external
* access."
- *
+ *
* @return a String listing the accessible optimizers
*/
public static String showOptimizers() {
@@ -825,7 +823,8 @@ public class OptimizerFactory {
+ "\n8: Hill-Climbing \n9: Cluster-based niching ES \n10: Clustering Hill-Climbing";
}
- public static GOParameters standardDE(AbstractOptimizationProblem problem) {
+ public static final GOParameters standardDE(
+ AbstractOptimizationProblem problem) {
DifferentialEvolution de = new DifferentialEvolution();
Population pop = new Population();
pop.setPopulationSize(50);
@@ -839,7 +838,8 @@ public class OptimizerFactory {
return makeParams(de, pop, problem, randSeed, defaultTerminator());
}
- public static GOParameters standardES(AbstractOptimizationProblem problem) {
+ public static final GOParameters standardES(
+ AbstractOptimizationProblem problem) {
EvolutionStrategies es = new EvolutionStrategies();
es.setMu(15);
es.setLambda(50);
@@ -863,7 +863,8 @@ public class OptimizerFactory {
return makeParams(es, pop, problem, randSeed, defaultTerminator());
}
- public static GOParameters standardGA(AbstractOptimizationProblem problem) {
+ public static final GOParameters standardGA(
+ AbstractOptimizationProblem problem) {
GeneticAlgorithm ga = new GeneticAlgorithm();
Population pop = new Population();
pop.setPopulationSize(100);
@@ -873,7 +874,8 @@ public class OptimizerFactory {
return makeParams(ga, pop, problem, randSeed, defaultTerminator());
}
- public static GOParameters standardPSO(AbstractOptimizationProblem problem) {
+ public static final GOParameters standardPSO(
+ AbstractOptimizationProblem problem) {
ParticleSwarmOptimization pso = new ParticleSwarmOptimization();
Population pop = new Population();
pop.setPopulationSize(30);
@@ -884,12 +886,10 @@ public class OptimizerFactory {
}
public static String terminatedBecause() {
- if (lastRunnable != null)
- return lastRunnable.terminatedBecause();
- else return null;
+ return (lastRunnable != null) ? lastRunnable.terminatedBecause() : null;
}
- public static GOParameters tribes(AbstractOptimizationProblem problem) {
+ public static final GOParameters tribes(AbstractOptimizationProblem problem) {
Tribes tr = new Tribes();
Population pop = new Population();
pop.setPopulationSize(1); // only for init