Fix GUI hidden properties (setProblem) in Optimizers

This commit is contained in:
Fabian Becker 2014-10-30 16:27:35 +01:00
parent 6465afb3e9
commit b9e43e1174
16 changed files with 26 additions and 187 deletions

View File

@ -20,7 +20,7 @@ import java.util.ArrayList;
* Yu, Shen, Chen, et.al. in 2014 (IEEE Transaction on Cybernetics, DOI: 10.1109/TCYB.2013.2279211). * Yu, Shen, Chen, et.al. in 2014 (IEEE Transaction on Cybernetics, DOI: 10.1109/TCYB.2013.2279211).
*/ */
@Description("Differential Evolution with Two-Level Parameter Adaption (Yu, Shen, Chen, et.al., 2014") @Description("Differential Evolution with Two-Level Parameter Adaption (Yu, Shen, Chen, et.al., 2014")
public class AdaptiveDifferentialEvolution implements InterfaceOptimizer { public class AdaptiveDifferentialEvolution extends AbstractOptimizer {
protected Population population; protected Population population;
@Parameter(name = "groups", description = "Number of sub-groups to use during optimization.") @Parameter(name = "groups", description = "Number of sub-groups to use during optimization.")
@ -153,36 +153,11 @@ public class AdaptiveDifferentialEvolution implements InterfaceOptimizer {
} }
} }
@Override
public Population getPopulation() {
return population;
}
@Override
public void setPopulation(Population pop) {
this.population = pop;
}
@Override @Override
public InterfaceSolutionSet getAllSolutions() { public InterfaceSolutionSet getAllSolutions() {
return null; return null;
} }
/**
* Sets the optimization problem. Will cast to AbstractOptimizationProblem.
*
* @param problem The optimization problem.
*/
@Override
public void setProblem(InterfaceOptimizationProblem problem) {
this.optimizationProblem = (AbstractOptimizationProblem) problem;
}
@Override
public InterfaceOptimizationProblem getProblem() {
return this.optimizationProblem;
}
@Override @Override
public String getStringRepresentation() { public String getStringRepresentation() {
return null; return null;

View File

@ -81,8 +81,6 @@ public class CBNPSO extends ClusterBasedNichingEA implements Serializable {
/** /**
* Return the period of the sinusoidal sigma adaption or -1 if not applicable. * Return the period of the sinusoidal sigma adaption or -1 if not applicable.
*
* @param p
*/ */
public int getSigmaAdaptionPeriod() { public int getSigmaAdaptionPeriod() {
ParamAdaption[] prmAd = getParameterControl(); ParamAdaption[] prmAd = getParameterControl();
@ -177,10 +175,6 @@ public class CBNPSO extends ClusterBasedNichingEA implements Serializable {
* is in [0,1] if any solutions have been identified, or -1 if the archive * is in [0,1] if any solutions have been identified, or -1 if the archive
* is empty. * is empty.
* *
* @param cbpso
* @param pop
* @param iteration
* @param maxIteration
* @return * @return
*/ */
public double getInterestingSolutionRatio() { public double getInterestingSolutionRatio() {
@ -196,9 +190,6 @@ public class CBNPSO extends ClusterBasedNichingEA implements Serializable {
Population archived = solSet.getSolutions(); Population archived = solSet.getSolutions();
Population interesting = archived.filterByFitness(fitThres, 0); Population interesting = archived.filterByFitness(fitThres, 0);
// Population archived = getArchivedSolutions();
// Population interesting = archived.filterByFitness(fitThres, 0);
if (archived.size() > 0) { if (archived.size() > 0) {
return ((double) interesting.size()) / ((double) archived.size()); return ((double) interesting.size()) / ((double) archived.size());
} else { } else {

View File

@ -27,6 +27,7 @@ import eva2.tools.EVAERROR;
import eva2.tools.chart2d.*; import eva2.tools.chart2d.*;
import eva2.tools.math.Mathematics; import eva2.tools.math.Mathematics;
import eva2.util.annotation.Description; import eva2.util.annotation.Description;
import eva2.util.annotation.Hidden;
import java.util.*; import java.util.*;
@ -786,6 +787,7 @@ public class ClusterBasedNichingEA extends AbstractOptimizer implements Interfac
* @param problem * @param problem
*/ */
@Override @Override
@Hidden
public void setProblem(InterfaceOptimizationProblem problem) { public void setProblem(InterfaceOptimizationProblem problem) {
this.optimizationProblem = problem; this.optimizationProblem = problem;
this.optimizer.setProblem(this.optimizationProblem); this.optimizer.setProblem(this.optimizationProblem);

View File

@ -10,7 +10,6 @@ import eva2.optimization.population.Population;
import eva2.optimization.population.PopulationInterface; import eva2.optimization.population.PopulationInterface;
import eva2.optimization.population.SolutionSet; import eva2.optimization.population.SolutionSet;
import eva2.problems.AbstractOptimizationProblem; import eva2.problems.AbstractOptimizationProblem;
import eva2.problems.F1Problem;
import eva2.problems.InterfaceAdditionalPopulationInformer; import eva2.problems.InterfaceAdditionalPopulationInformer;
import eva2.problems.InterfaceOptimizationProblem; import eva2.problems.InterfaceOptimizationProblem;
import eva2.tools.Pair; import eva2.tools.Pair;
@ -36,17 +35,11 @@ import java.io.Serializable;
*/ */
@Description("Similar to multi-start HC, but clusters the population during optimization to remove redundant individuals for efficiency." @Description("Similar to multi-start HC, but clusters the population during optimization to remove redundant individuals for efficiency."
+ "If the local search step does not achieve a minimum improvement, the population may be reinitialized.") + "If the local search step does not achieve a minimum improvement, the population may be reinitialized.")
public class ClusteringHillClimbing implements InterfacePopulationChangedEventListener, public class ClusteringHillClimbing extends AbstractOptimizer implements InterfacePopulationChangedEventListener, Serializable, InterfaceAdditionalPopulationInformer {
InterfaceOptimizer, Serializable, InterfaceAdditionalPopulationInformer {
transient private InterfacePopulationChangedEventListener populationChangedEventListener;
transient private String identifier = "";
private Population population = new Population();
private transient Population archive = new Population(); private transient Population archive = new Population();
private InterfaceOptimizationProblem optimizationProblem = new F1Problem();
private int hcEvalCycle = 1000; private int hcEvalCycle = 1000;
private int initialPopSize = 100; private int initialPopSize = 100;
private int loopCnt = 0;
private int notifyGuiEvery = 50; private int notifyGuiEvery = 50;
private double sigmaClust = 0.01; private double sigmaClust = 0.01;
private double minImprovement = 0.000001; private double minImprovement = 0.000001;
@ -82,7 +75,6 @@ public class ClusteringHillClimbing implements InterfacePopulationChangedEventLi
initialStepSize = other.initialStepSize; initialStepSize = other.initialStepSize;
reduceFactor = other.reduceFactor; reduceFactor = other.reduceFactor;
mutator = (MutateESFixedStepSize) other.mutator.clone(); mutator = (MutateESFixedStepSize) other.mutator.clone();
loopCnt = 0;
} }
@Override @Override
@ -99,40 +91,8 @@ public class ClusteringHillClimbing implements InterfacePopulationChangedEventLi
setLocalSearchMethod(getLocalSearchMethod()); setLocalSearchMethod(getLocalSearchMethod());
} }
/**
* This method will set the problem that is to be optimized
*
* @param problem
*/
@Override
public void setProblem(InterfaceOptimizationProblem problem) {
this.optimizationProblem = problem;
}
@Override
public InterfaceOptimizationProblem getProblem() {
return this.optimizationProblem;
}
@Override
public void addPopulationChangedEventListener(InterfacePopulationChangedEventListener ea) {
this.populationChangedEventListener = ea;
}
@Override
public boolean removePopulationChangedEventListener(
InterfacePopulationChangedEventListener ea) {
if (populationChangedEventListener == ea) {
populationChangedEventListener = null;
return true;
} else {
return false;
}
}
@Override @Override
public void initialize() { public void initialize() {
loopCnt = 0;
mutator = new MutateESFixedStepSize(initialStepSize); mutator = new MutateESFixedStepSize(initialStepSize);
archive = new Population(); archive = new Population();
hideHideable(); hideHideable();
@ -151,7 +111,6 @@ public class ClusteringHillClimbing implements InterfacePopulationChangedEventLi
*/ */
@Override @Override
public void initializeByPopulation(Population pop, boolean reset) { public void initializeByPopulation(Population pop, boolean reset) {
loopCnt = 0;
this.population = (Population) pop.clone(); this.population = (Population) pop.clone();
population.addPopulationChangedEventListener(null); population.addPopulationChangedEventListener(null);
if (reset) { if (reset) {
@ -161,20 +120,10 @@ public class ClusteringHillClimbing implements InterfacePopulationChangedEventLi
} }
} }
/**
* Something has changed
*/
protected void firePropertyChangedEvent(String name) {
if (this.populationChangedEventListener != null) {
this.populationChangedEventListener.registerPopulationStateChanged(this, name);
}
}
@Override @Override
public void optimize() { public void optimize() {
double improvement; double improvement;
loopCnt++;
population.addPopulationChangedEventListener(this); population.addPopulationChangedEventListener(this);
population.setNotifyEvalInterval(notifyGuiEvery); population.setNotifyEvalInterval(notifyGuiEvery);
Pair<Population, Double> popD; Pair<Population, Double> popD;
@ -244,23 +193,6 @@ public class ClusteringHillClimbing implements InterfacePopulationChangedEventLi
} }
} }
/**
* Assuming that all optimizer will store thier data in a population we will
* allow acess to this population to query to current state of the
* optimizer.
*
* @return The population of current solutions to a given problem.
*/
@Override
public Population getPopulation() {
return this.population;
}
@Override
public void setPopulation(Population pop) {
this.population = pop;
}
@Override @Override
public InterfaceSolutionSet getAllSolutions() { public InterfaceSolutionSet getAllSolutions() {
Population tmp = new Population(); Population tmp = new Population();

View File

@ -11,6 +11,7 @@ import eva2.tools.SelectedTag;
import eva2.tools.math.Mathematics; import eva2.tools.math.Mathematics;
import eva2.tools.math.RNG; import eva2.tools.math.RNG;
import eva2.util.annotation.Description; import eva2.util.annotation.Description;
import eva2.util.annotation.Hidden;
/** /**
* This extends our particle swarm implementation to dynamic optimization problems. * This extends our particle swarm implementation to dynamic optimization problems.
@ -130,7 +131,7 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization
* *
* @param index The individual to update. * @param index The individual to update.
* @param pop The current population. * @param pop The current population.
* @param best The best individual found so far. * @param indy The best individual found so far.
*/ */
private void updateQuantumIndividual(int index, AbstractEAIndividual indy, Population pop) { private void updateQuantumIndividual(int index, AbstractEAIndividual indy, Population pop) {
InterfaceDataTypeDouble endy = (InterfaceDataTypeDouble) indy; InterfaceDataTypeDouble endy = (InterfaceDataTypeDouble) indy;
@ -473,6 +474,7 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization
@Override @Override
@Hidden
public void setProblem(InterfaceOptimizationProblem problem) { public void setProblem(InterfaceOptimizationProblem problem) {
super.setProblem(problem); super.setProblem(problem);
if (problem instanceof AbstractOptimizationProblem) { if (problem instanceof AbstractOptimizationProblem) {

View File

@ -186,16 +186,6 @@ public class GeneticAlgorithm extends AbstractOptimizer implements java.io.Seria
} }
} }
/**
* This method will set the problem that is to be optimized
*
* @param problem
*/
@Override
public void setProblem(InterfaceOptimizationProblem problem) {
this.optimizationProblem = problem;
}
@Override @Override
public InterfaceOptimizationProblem getProblem() { public InterfaceOptimizationProblem getProblem() {
return this.optimizationProblem; return this.optimizationProblem;

View File

@ -12,6 +12,7 @@ import eva2.problems.F8Problem;
import eva2.problems.InterfaceOptimizationProblem; import eva2.problems.InterfaceOptimizationProblem;
import eva2.problems.TF1Problem; import eva2.problems.TF1Problem;
import eva2.util.annotation.Description; import eva2.util.annotation.Description;
import eva2.util.annotation.Hidden;
/** /**
* The one and only island model for parallelization. Since parallelization * The one and only island model for parallelization. Since parallelization
@ -297,6 +298,7 @@ public class IslandModelEA implements InterfacePopulationChangedEventListener, I
* @param problem * @param problem
*/ */
@Override @Override
@Hidden
public void setProblem(InterfaceOptimizationProblem problem) { public void setProblem(InterfaceOptimizationProblem problem) {
this.optimizationProblem = problem; this.optimizationProblem = problem;
this.optimizer.setProblem(problem); this.optimizer.setProblem(problem);

View File

@ -11,6 +11,7 @@ import eva2.problems.F1Problem;
import eva2.problems.InterfaceLocalSearchable; import eva2.problems.InterfaceLocalSearchable;
import eva2.problems.InterfaceOptimizationProblem; import eva2.problems.InterfaceOptimizationProblem;
import eva2.util.annotation.Description; import eva2.util.annotation.Description;
import eva2.util.annotation.Hidden;
import java.util.Hashtable; import java.util.Hashtable;
@ -196,6 +197,7 @@ public class MemeticAlgorithm implements InterfaceOptimizer, java.io.Serializabl
* @param problem * @param problem
*/ */
@Override @Override
@Hidden
public void setProblem(InterfaceOptimizationProblem problem) { public void setProblem(InterfaceOptimizationProblem problem) {
this.optimizationProblem = problem; this.optimizationProblem = problem;
this.globalOptimizer.setProblem(this.optimizationProblem); this.globalOptimizer.setProblem(this.optimizationProblem);

View File

@ -15,6 +15,7 @@ import eva2.problems.AbstractOptimizationProblem;
import eva2.problems.FM0Problem; import eva2.problems.FM0Problem;
import eva2.problems.InterfaceOptimizationProblem; import eva2.problems.InterfaceOptimizationProblem;
import eva2.util.annotation.Description; import eva2.util.annotation.Description;
import eva2.util.annotation.Hidden;
/** /**
* A generic framework for multi-objecitve optimization, you need to specify an * A generic framework for multi-objecitve optimization, you need to specify an
@ -183,6 +184,7 @@ public class MultiObjectiveEA implements InterfaceOptimizer, java.io.Serializabl
* @param problem * @param problem
*/ */
@Override @Override
@Hidden
public void setProblem(InterfaceOptimizationProblem problem) { public void setProblem(InterfaceOptimizationProblem problem) {
this.optimizationProblem = problem; this.optimizationProblem = problem;
this.optimizer.setProblem(problem); this.optimizer.setProblem(problem);

View File

@ -52,11 +52,6 @@ public class NelderMeadSimplex extends AbstractOptimizer implements Serializable
return new NelderMeadSimplex(this); return new NelderMeadSimplex(this);
} }
@Override
public void setProblem(InterfaceOptimizationProblem problem) {
optimizationProblem = (AbstractOptimizationProblem) problem;
}
public boolean setProblemAndPopSize(InterfaceOptimizationProblem problem) { public boolean setProblemAndPopSize(InterfaceOptimizationProblem problem) {
setProblem(problem); setProblem(problem);
if (optimizationProblem instanceof AbstractProblemDouble) { if (optimizationProblem instanceof AbstractProblemDouble) {
@ -77,8 +72,6 @@ public class NelderMeadSimplex extends AbstractOptimizer implements Serializable
for (int i = 0; i < r.length; i++) { for (int i = 0; i < r.length; i++) {
r[i] = 2 * centroid[i] - refX[i]; r[i] = 2 * centroid[i] - refX[i];
} }
// double alpha = 1.3;
// for (int i=0; i<r.length; i++) r[i] = centroid[i] + alpha*(centroid[i] - refX[i]);
return r; return r;
} }

View File

@ -30,6 +30,7 @@ import eva2.problems.*;
import eva2.tools.SelectedTag; import eva2.tools.SelectedTag;
import eva2.tools.chart2d.*; import eva2.tools.chart2d.*;
import eva2.util.annotation.Description; import eva2.util.annotation.Description;
import eva2.util.annotation.Hidden;
import java.io.*; import java.io.*;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -1194,6 +1195,7 @@ public class NichePSO extends AbstractOptimizer implements InterfaceAdditionalPo
* @tested ps This method will set the problem that is to be optimized * @tested ps This method will set the problem that is to be optimized
*/ */
@Override @Override
@Hidden
public void setProblem(InterfaceOptimizationProblem problem) { public void setProblem(InterfaceOptimizationProblem problem) {
// set member // set member
this.optimizationProblem = problem; this.optimizationProblem = problem;

View File

@ -16,6 +16,7 @@ import eva2.problems.AbstractOptimizationProblem;
import eva2.problems.F1Problem; import eva2.problems.F1Problem;
import eva2.problems.InterfaceOptimizationProblem; import eva2.problems.InterfaceOptimizationProblem;
import eva2.util.annotation.Description; import eva2.util.annotation.Description;
import eva2.util.annotation.Hidden;
/** /**
* This is a Particle Filter implemented by Frank Senke, only some documentation * This is a Particle Filter implemented by Frank Senke, only some documentation
@ -236,6 +237,7 @@ public class ParticleFilterOptimization extends AbstractOptimizer implements jav
* @param problem * @param problem
*/ */
@Override @Override
@Hidden
public void setProblem(InterfaceOptimizationProblem problem) { public void setProblem(InterfaceOptimizationProblem problem) {
this.optimizationProblem = problem; this.optimizationProblem = problem;
if (problem instanceof AbstractOptimizationProblem) { if (problem instanceof AbstractOptimizationProblem) {

View File

@ -13,6 +13,9 @@ import eva2.problems.AbstractOptimizationProblem;
import eva2.problems.B1Problem; import eva2.problems.B1Problem;
import eva2.problems.InterfaceOptimizationProblem; import eva2.problems.InterfaceOptimizationProblem;
import eva2.util.annotation.Description; import eva2.util.annotation.Description;
import eva2.util.annotation.Hidden;
import java.util.logging.Logger;
/** /**
* Population based incremental learning in the PSM by Monmarche version with * Population based incremental learning in the PSM by Monmarche version with
@ -27,6 +30,7 @@ import eva2.util.annotation.Description;
@Description("The Population based incremental learning is based on a statistical distribution of bit positions. Please note: This optimizer requires a binary genotype!") @Description("The Population based incremental learning is based on a statistical distribution of bit positions. Please note: This optimizer requires a binary genotype!")
public class PopulationBasedIncrementalLearning extends AbstractOptimizer implements java.io.Serializable { public class PopulationBasedIncrementalLearning extends AbstractOptimizer implements java.io.Serializable {
private final static Logger LOGGER = Logger.getLogger(PopulationBasedIncrementalLearning.class.getName());
// These variables are necessary for the simple testcase // These variables are necessary for the simple testcase
private InterfaceOptimizationProblem optimizationProblem = new B1Problem(); private InterfaceOptimizationProblem optimizationProblem = new B1Problem();
private boolean useElitism = true; private boolean useElitism = true;
@ -144,11 +148,12 @@ public class PopulationBasedIncrementalLearning extends AbstractOptimizer implem
* @param problem * @param problem
*/ */
@Override @Override
@Hidden
public void setProblem(InterfaceOptimizationProblem problem) { public void setProblem(InterfaceOptimizationProblem problem) {
this.optimizationProblem = problem; this.optimizationProblem = problem;
if (optimizationProblem instanceof AbstractOptimizationProblem) { if (optimizationProblem instanceof AbstractOptimizationProblem) {
if (!(((AbstractOptimizationProblem) optimizationProblem).getIndividualTemplate() instanceof InterfaceGAIndividual)) { if (!(((AbstractOptimizationProblem) optimizationProblem).getIndividualTemplate() instanceof InterfaceGAIndividual)) {
System.err.println("Error: PBIL only works with GAIndividuals!"); LOGGER.warning("PBIL only works with GAIndividuals!");
} }
} }
} }

View File

@ -23,6 +23,7 @@ import eva2.tools.SelectedTag;
import eva2.tools.math.Mathematics; import eva2.tools.math.Mathematics;
import eva2.tools.math.RNG; import eva2.tools.math.RNG;
import eva2.util.annotation.Description; import eva2.util.annotation.Description;
import eva2.util.annotation.Hidden;
import java.util.ArrayList; import java.util.ArrayList;
@ -102,6 +103,7 @@ public class ScatterSearch implements InterfaceOptimizer, java.io.Serializable,
} }
@Override @Override
@Hidden
public void setProblem(InterfaceOptimizationProblem problem) { public void setProblem(InterfaceOptimizationProblem problem) {
this.optimizationProblem = (AbstractOptimizationProblem) problem; this.optimizationProblem = (AbstractOptimizationProblem) problem;
} }

View File

@ -115,21 +115,6 @@ public class ThresholdAlgorithm extends AbstractOptimizer implements java.io.Ser
return result; return result;
} }
/**
* This method will set the problem that is to be optimized
*
* @param problem
*/
@Override
public void setProblem(InterfaceOptimizationProblem problem) {
this.optimizationProblem = problem;
}
@Override
public InterfaceOptimizationProblem getProblem() {
return this.optimizationProblem;
}
/** /**
* This method will initialize the HillClimber * This method will initialize the HillClimber
*/ */

View File

@ -20,16 +20,13 @@ import eva2.util.annotation.Description;
* performance of this algorithm strongly depends on the optimization problem. * performance of this algorithm strongly depends on the optimization problem.
*/ */
@Description("This is Evolutionary Multi-Criteria Optimization Algorithm hybridized with Local Searchers to span the Pareto-Front.") @Description("This is Evolutionary Multi-Criteria Optimization Algorithm hybridized with Local Searchers to span the Pareto-Front.")
public class WingedMultiObjectiveEA implements InterfaceOptimizer, java.io.Serializable { public class WingedMultiObjectiveEA extends AbstractOptimizer implements java.io.Serializable {
private InterfaceOptimizer multiObjectiveEA = new MultiObjectiveEA(); private InterfaceOptimizer multiObjectiveEA = new MultiObjectiveEA();
private InterfaceOptimizer singleObjectiveEA = new GeneticAlgorithm(); private InterfaceOptimizer singleObjectiveEA = new GeneticAlgorithm();
private InterfaceOptimizer[] singleObjectiveOptimizers; private InterfaceOptimizer[] singleObjectiveOptimizers;
private Population population = new Population();
private int migrationRate = 5; private int migrationRate = 5;
private int outputDimension = 2; private int outputDimension = 2;
private InterfaceOptimizationProblem optimizationProblem = new FM0Problem();
transient private InterfacePopulationChangedEventListener populationChangedEventListener;
public WingedMultiObjectiveEA() { public WingedMultiObjectiveEA() {
} }
@ -207,51 +204,6 @@ public class WingedMultiObjectiveEA implements InterfaceOptimizer, java.io.Seria
} }
} }
/**
* This method allows you to add the LectureGUI as listener to the Optimizer
*
* @param ea
*/
@Override
public void addPopulationChangedEventListener(InterfacePopulationChangedEventListener ea) {
this.populationChangedEventListener = ea;
}
@Override
public boolean removePopulationChangedEventListener(
InterfacePopulationChangedEventListener ea) {
if (populationChangedEventListener == ea) {
populationChangedEventListener = null;
return true;
} else {
return false;
}
}
/**
* Something has changed
*/
protected void firePropertyChangedEvent(String name) {
if (this.populationChangedEventListener != null) {
this.populationChangedEventListener.registerPopulationStateChanged(this, name);
}
}
/**
* This method will set the problem that is to be optimized
*
* @param problem
*/
@Override
public void setProblem(InterfaceOptimizationProblem problem) {
this.optimizationProblem = problem;
}
@Override
public InterfaceOptimizationProblem getProblem() {
return this.optimizationProblem;
}
/** /**
* This method will return a string describing all properties of the * This method will return a string describing all properties of the
* optimizer and the applied methods. * optimizer and the applied methods.