From b24dbac6a19bb56165a6afa6dd505d369d4ba52b Mon Sep 17 00:00:00 2001 From: Fabian Becker Date: Tue, 28 Jan 2014 16:44:33 +0100 Subject: [PATCH] Fixing several broken observer pattern implementations --- src/eva2/optimization/problems/F6Problem.java | 2 +- .../DynamicParticleSwarmOptimization.java | 26 ++--- .../strategies/EvolutionStrategies.java | 22 +++- .../strategies/EvolutionaryProgramming.java | 88 +++++++------- .../strategies/GeneticAlgorithm.java | 22 ++-- .../optimization/strategies/NichePSO.java | 2 +- .../ParticleSubSwarmOptimization.java | 28 ++--- .../strategies/ParticleSwarmOptimization.java | 108 ++++++++++-------- 8 files changed, 164 insertions(+), 134 deletions(-) diff --git a/src/eva2/optimization/problems/F6Problem.java b/src/eva2/optimization/problems/F6Problem.java index 40627d12..159fbed1 100644 --- a/src/eva2/optimization/problems/F6Problem.java +++ b/src/eva2/optimization/problems/F6Problem.java @@ -11,7 +11,7 @@ import java.io.Serializable; /** * Generalized Rastrigin's function. */ -@Description("Generalized Rastrigins's function.") +@Description("Generalized Rastrigin's function.") public class F6Problem extends AbstractProblemDoubleOffset implements InterfaceMultimodalProblem, InterfaceFirstOrderDerivableProblem, InterfaceLocalSearchable, Serializable, InterfaceInterestingHistogram { private double m_A = 10; diff --git a/src/eva2/optimization/strategies/DynamicParticleSwarmOptimization.java b/src/eva2/optimization/strategies/DynamicParticleSwarmOptimization.java index 2d0eca55..08309339 100644 --- a/src/eva2/optimization/strategies/DynamicParticleSwarmOptimization.java +++ b/src/eva2/optimization/strategies/DynamicParticleSwarmOptimization.java @@ -173,7 +173,7 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization private void plotBestIndy() { if (m_Plot != null) { - double[] curPosition = ((InterfaceDataTypeDouble) m_Population.getBestEAIndividual()).getDoubleData(); + double[] curPosition = ((InterfaceDataTypeDouble) population.getBestEAIndividual()).getDoubleData(); if (lastBestPlot != null) { this.m_Plot.setConnectedPoint(lastBestPlot[0], lastBestPlot[1], 0); @@ -187,7 +187,7 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization protected void plotIndy(double[] curPosition, double[] curVelocity, int index) { if (this.m_Show) { if (plotBestOnly) { - if (index != ((Integer) (m_Population.getBestEAIndividual().getData(indexKey)))) { + if (index != ((Integer) (population.getBestEAIndividual().getData(indexKey)))) { return; } else { // if (lastBestPlot != null) this.m_Plot.setConnectedPoint(lastBestPlot[0], lastBestPlot[1], index); @@ -314,7 +314,7 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization */ @Override protected double getSpeedLimit(int index) { - if (index >= ((double) (m_Population.size() * highEnergyRatio))) { + if (index >= ((double) (population.size() * highEnergyRatio))) { return speedLimit; } else { if (highEnergyRaise == 0.) { @@ -330,11 +330,11 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization protected void startOptimize() { super.startOptimize(); if (detectAnchor >= 0) { // set the new detection anchor individual - detectAnchor = RNG.randomInt(0, m_Population.size() - 1); + detectAnchor = RNG.randomInt(0, population.size() - 1); if (detectFit == null) { - detectFit = (m_Population.getIndividual(detectAnchor).getFitness()).clone(); + detectFit = (population.getIndividual(detectAnchor).getFitness()).clone(); } else { - System.arraycopy(m_Population.getIndividual(detectAnchor).getFitness(), 0, detectFit, 0, detectFit.length); + System.arraycopy(population.getIndividual(detectAnchor).getFitness(), 0, detectFit, 0, detectFit.length); } } } @@ -351,8 +351,8 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization double quantumCount = 0.; // do what the usual function does plus announce quantum particles if (quantumRatio > 0.) { - for (int i = 0; i < this.m_Population.size(); i++) { - AbstractEAIndividual indy = (AbstractEAIndividual) m_Population.get(i); + for (int i = 0; i < this.population.size(); i++) { + AbstractEAIndividual indy = (AbstractEAIndividual) population.get(i); if (i >= quantumCount) { indy.putData(partTypeKey, quantumType); quantumCount += 1. / quantumRatio; @@ -405,7 +405,7 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization plotBestIndy(); } - envHasChanged = detectChange(m_Population); + envHasChanged = detectChange(this.population); // if (envHasChanged) { // System.out.println("environmental change detected!"); @@ -427,8 +427,8 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization @Override protected void logBestIndividual() { // log the best individual of the population - if (envHasChanged || (this.m_Population.getBestEAIndividual().isDominatingDebConstraints(this.m_BestIndividual))) { - this.m_BestIndividual = (AbstractEAIndividual) this.m_Population.getBestEAIndividual().clone(); + if (envHasChanged || (this.population.getBestEAIndividual().isDominatingDebConstraints(this.m_BestIndividual))) { + this.m_BestIndividual = (AbstractEAIndividual) this.population.getBestEAIndividual().clone(); this.m_BestIndividual.putData(partBestFitKey, this.m_BestIndividual.getFitness()); this.m_BestIndividual.putData(partBestPosKey, ((InterfaceDataTypeDouble) this.m_BestIndividual).getDoubleData()); //System.out.println("-- best ind set to " + ((InterfaceDataTypeDouble)this.m_BestIndividual).getDoubleData()[0] + "/" + ((InterfaceDataTypeDouble)this.m_BestIndividual).getDoubleData()[1]); @@ -449,7 +449,7 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization switch (changeDetectStrategy.getSelectedTag().getID()) { case 0: if (detectAnchor >= 0) { - return !(java.util.Arrays.equals(detectFit, m_Population.getIndividual(detectAnchor).getFitness())); + return !(java.util.Arrays.equals(detectFit, this.population.getIndividual(detectAnchor).getFitness())); } else { System.err.println("warning, inconsistency in detectChange"); } @@ -501,7 +501,7 @@ public class DynamicParticleSwarmOptimization extends ParticleSwarmOptimization strB.append("Dynamic Particle Swarm Optimization:\nOptimization Problem: "); strB.append(this.m_Problem.getStringRepresentationForProblem(this)); strB.append("\n"); - strB.append(this.m_Population.getStringRepresentation()); + strB.append(this.population.getStringRepresentation()); return strB.toString(); } diff --git a/src/eva2/optimization/strategies/EvolutionStrategies.java b/src/eva2/optimization/strategies/EvolutionStrategies.java index 094776cb..0e1d5a5a 100644 --- a/src/eva2/optimization/strategies/EvolutionStrategies.java +++ b/src/eva2/optimization/strategies/EvolutionStrategies.java @@ -14,6 +14,8 @@ import eva2.optimization.problems.InterfaceOptimizationProblem; import eva2.util.annotation.Description; import eva2.util.annotation.Parameter; +import java.util.Vector; + /** * Evolution strategies by Rechenberg and Schwefel, but please remember that * this only gives the generation strategy and not the coding. But this is the @@ -35,6 +37,7 @@ public class EvolutionStrategies implements InterfaceOptimizer, java.io.Serializ @Parameter(description = "Determines whether the +-Strategy should be used.", name = "usePlus") protected boolean usePlusStrategy = false; + protected Population population = new Population(); protected InterfaceOptimizationProblem optimizationProblem = new B1Problem(); private InterfaceSelection parentSelection = new SelectRandom(); @@ -44,7 +47,7 @@ public class EvolutionStrategies implements InterfaceOptimizer, java.io.Serializ protected int origPopSize = -1; // especially for CBN private boolean forceOrigPopSize = true;// especially for CBN transient private String identifier = ""; - transient private InterfacePopulationChangedEventListener changeListener; + transient private Vector changeListener; public static final String esMuParam = "EvolutionStrategyMuParameter"; public static final String esLambdaParam = "EvolutionStrategyLambdaParameter"; @@ -247,13 +250,16 @@ public class EvolutionStrategies implements InterfaceOptimizer, java.io.Serializ */ @Override public void addPopulationChangedEventListener(InterfacePopulationChangedEventListener ea) { - this.changeListener = ea; + if (this.changeListener == null) { + this.changeListener = new Vector(); + } + this.changeListener.add(ea); } @Override - public boolean removePopulationChangedEventListener(InterfacePopulationChangedEventListener ea) { - if (changeListener == ea) { - changeListener = null; + public boolean removePopulationChangedEventListener( + InterfacePopulationChangedEventListener ea) { + if (changeListener != null && changeListener.removeElement(ea)) { return true; } else { return false; @@ -262,10 +268,14 @@ public class EvolutionStrategies implements InterfaceOptimizer, java.io.Serializ /** * Something has changed + * + * @param name */ protected void firePropertyChangedEvent(String name) { if (this.changeListener != null) { - this.changeListener.registerPopulationStateChanged(this, name); + for (int i = 0; i < this.changeListener.size(); i++) { + this.changeListener.get(i).registerPopulationStateChanged(this, name); + } } } diff --git a/src/eva2/optimization/strategies/EvolutionaryProgramming.java b/src/eva2/optimization/strategies/EvolutionaryProgramming.java index 55f2a839..6e94f75d 100644 --- a/src/eva2/optimization/strategies/EvolutionaryProgramming.java +++ b/src/eva2/optimization/strategies/EvolutionaryProgramming.java @@ -11,6 +11,9 @@ import eva2.optimization.problems.F1Problem; import eva2.optimization.problems.InterfaceOptimizationProblem; import eva2.util.annotation.Description; +import java.util.ArrayList; +import java.util.List; + /** * Evolutionary programming by Fogel. Works fine but is actually a quite greedy * local search strategy solely based on mutation. To prevent any confusion, the @@ -20,21 +23,21 @@ import eva2.util.annotation.Description; @Description("This is a basic Evolutionary Programming scheme.") public class EvolutionaryProgramming implements InterfaceOptimizer, java.io.Serializable { - private int m_PopulationSize = 0; - private Population m_Population = new Population(); - private InterfaceOptimizationProblem m_Problem = new F1Problem(); - private InterfaceSelection m_EnvironmentSelection = new SelectEPTournaments(); - private String m_Identifier = ""; - transient private InterfacePopulationChangedEventListener m_Listener; + private int populationSize = 0; + private Population population = new Population(); + private InterfaceOptimizationProblem optimizationProblem = new F1Problem(); + private InterfaceSelection environmentSelection = new SelectEPTournaments(); + private String identifier = ""; + transient private List populationChangedEventListeners = new ArrayList<>(); public EvolutionaryProgramming() { } public EvolutionaryProgramming(EvolutionaryProgramming a) { - this.m_Population = (Population) a.m_Population.clone(); - this.m_Problem = (InterfaceOptimizationProblem) a.m_Problem.clone(); - this.m_Identifier = a.m_Identifier; - this.m_EnvironmentSelection = (InterfaceSelection) a.m_EnvironmentSelection.clone(); + this.population = (Population) a.population.clone(); + this.optimizationProblem = (InterfaceOptimizationProblem) a.optimizationProblem.clone(); + this.identifier = a.identifier; + this.environmentSelection = (InterfaceSelection)a.environmentSelection.clone(); } @Override @@ -44,9 +47,9 @@ public class EvolutionaryProgramming implements InterfaceOptimizer, java.io.Seri @Override public void init() { - this.m_Problem.initializePopulation(this.m_Population); - this.evaluatePopulation(this.m_Population); - this.m_PopulationSize = this.m_Population.size(); + this.optimizationProblem.initializePopulation(this.population); + this.evaluatePopulation(this.population); + this.populationSize = this.population.size(); this.firePropertyChangedEvent(Population.NEXT_GENERATION_PERFORMED); } @@ -57,10 +60,10 @@ public class EvolutionaryProgramming implements InterfaceOptimizer, java.io.Seri */ @Override public void initByPopulation(Population pop, boolean reset) { - this.m_Population = (Population) pop.clone(); + this.population = (Population) pop.clone(); if (reset) { - this.m_Population.init(); - this.evaluatePopulation(this.m_Population); + this.population.init(); + this.evaluatePopulation(this.population); this.firePropertyChangedEvent(Population.NEXT_GENERATION_PERFORMED); } } @@ -71,7 +74,7 @@ public class EvolutionaryProgramming implements InterfaceOptimizer, java.io.Seri * @param population The population that is to be evaluated */ private void evaluatePopulation(Population population) { - this.m_Problem.evaluate(population); + this.optimizationProblem.evaluate(population); population.incrGeneration(); } @@ -80,12 +83,12 @@ public class EvolutionaryProgramming implements InterfaceOptimizer, java.io.Seri * population of evaluated individuals. */ private Population generateChildren() { - Population result = (Population) this.m_Population.cloneWithoutInds(); + Population result = (Population) this.population.cloneWithoutInds(); AbstractEAIndividual mutant; result.clear(); - for (int i = 0; i < this.m_Population.size(); i++) { - mutant = (AbstractEAIndividual) ((AbstractEAIndividual) this.m_Population.get(i)).clone(); + for (int i = 0; i < this.population.size(); i++) { + mutant = (AbstractEAIndividual) ((AbstractEAIndividual) this.population.get(i)).clone(); double tmpD = mutant.getMutationProbability(); mutant.setMutationProbability(1.0); mutant.mutate(); @@ -99,14 +102,14 @@ public class EvolutionaryProgramming implements InterfaceOptimizer, java.io.Seri public void optimize() { Population nextGeneration, parents; - this.m_EnvironmentSelection.prepareSelection(this.m_Population); - parents = this.m_EnvironmentSelection.selectFrom(this.m_Population, this.m_PopulationSize); - this.m_Population.clear(); - this.m_Population.addPopulation(parents); + this.environmentSelection.prepareSelection(this.population); + parents = this.environmentSelection.selectFrom(this.population, this.populationSize); + this.population.clear(); + this.population.addPopulation(parents); nextGeneration = this.generateChildren(); this.evaluatePopulation(nextGeneration); - nextGeneration.addPopulation(this.m_Population); - this.m_Population = nextGeneration; + nextGeneration.addPopulation(this.population); + this.population = nextGeneration; this.firePropertyChangedEvent(Population.NEXT_GENERATION_PERFORMED); } @@ -118,26 +121,21 @@ public class EvolutionaryProgramming implements InterfaceOptimizer, java.io.Seri */ @Override public void addPopulationChangedEventListener(InterfacePopulationChangedEventListener ea) { - this.m_Listener = ea; + this.populationChangedEventListeners.add(ea); } @Override public boolean removePopulationChangedEventListener( InterfacePopulationChangedEventListener ea) { - if (m_Listener == ea) { - m_Listener = null; - return true; - } else { - return false; - } + return this.populationChangedEventListeners.remove(ea); } /** * Something has changed */ protected void firePropertyChangedEvent(String name) { - if (this.m_Listener != null) { - this.m_Listener.registerPopulationStateChanged(this, name); + for(InterfacePopulationChangedEventListener l : this.populationChangedEventListeners) { + l.registerPopulationStateChanged(this, name); } } @@ -148,12 +146,12 @@ public class EvolutionaryProgramming implements InterfaceOptimizer, java.io.Seri */ @Override public void setProblem(InterfaceOptimizationProblem problem) { - this.m_Problem = problem; + this.optimizationProblem = problem; } @Override public InterfaceOptimizationProblem getProblem() { - return this.m_Problem; + return this.optimizationProblem; } /** @@ -167,8 +165,8 @@ public class EvolutionaryProgramming implements InterfaceOptimizer, java.io.Seri String result = ""; result += "Evolutionary Programming:\n"; result += "Optimization Problem: "; - result += this.m_Problem.getStringRepresentationForProblem(this) + "\n"; - result += this.m_Population.getStringRepresentation(); + result += this.optimizationProblem.getStringRepresentationForProblem(this) + "\n"; + result += this.population.getStringRepresentation(); return result; } @@ -179,12 +177,12 @@ public class EvolutionaryProgramming implements InterfaceOptimizer, java.io.Seri */ @Override public void setIdentifier(String name) { - this.m_Identifier = name; + this.identifier = name; } @Override public String getIdentifier() { - return this.m_Identifier; + return this.identifier; } /** @@ -206,12 +204,12 @@ public class EvolutionaryProgramming implements InterfaceOptimizer, java.io.Seri */ @Override public Population getPopulation() { - return this.m_Population; + return this.population; } @Override public void setPopulation(Population pop) { - this.m_Population = pop; + this.population = pop; } public String populationTipText() { @@ -229,11 +227,11 @@ public class EvolutionaryProgramming implements InterfaceOptimizer, java.io.Seri * @param selection */ public void setEnvironmentSelection(InterfaceSelection selection) { - this.m_EnvironmentSelection = selection; + this.environmentSelection = selection; } public InterfaceSelection getEnvironmentSelection() { - return this.m_EnvironmentSelection; + return this.environmentSelection; } public String environmentSelectionTipText() { diff --git a/src/eva2/optimization/strategies/GeneticAlgorithm.java b/src/eva2/optimization/strategies/GeneticAlgorithm.java index 5352f90e..92dfdb94 100644 --- a/src/eva2/optimization/strategies/GeneticAlgorithm.java +++ b/src/eva2/optimization/strategies/GeneticAlgorithm.java @@ -13,6 +13,8 @@ import eva2.optimization.problems.F1Problem; import eva2.optimization.problems.InterfaceOptimizationProblem; import eva2.util.annotation.Description; +import java.util.Vector; + /** * The traditional genetic algorithms as devised by Holland. To only special * here it the plague factor which reduces the population size to tune from a @@ -30,7 +32,7 @@ public class GeneticAlgorithm implements InterfaceOptimizer, java.io.Serializabl private int plague = 0; private int numberOfPartners = 1; private String identifier = ""; - transient private InterfacePopulationChangedEventListener popChangedListener; + transient private Vector changeListener; public GeneticAlgorithm() { } @@ -163,14 +165,16 @@ public class GeneticAlgorithm implements InterfaceOptimizer, java.io.Serializabl */ @Override public void addPopulationChangedEventListener(InterfacePopulationChangedEventListener ea) { - this.popChangedListener = ea; + if (this.changeListener == null) { + this.changeListener = new Vector(); + } + this.changeListener.add(ea); } @Override public boolean removePopulationChangedEventListener( InterfacePopulationChangedEventListener ea) { - if (popChangedListener == ea) { - popChangedListener = null; + if (changeListener != null && changeListener.removeElement(ea)) { return true; } else { return false; @@ -178,11 +182,15 @@ public class GeneticAlgorithm implements InterfaceOptimizer, java.io.Serializabl } /** - * Something has changed. + * Something has changed + * + * @param name */ protected void firePropertyChangedEvent(String name) { - if (this.popChangedListener != null) { - this.popChangedListener.registerPopulationStateChanged(this, name); + if (this.changeListener != null) { + for (int i = 0; i < this.changeListener.size(); i++) { + this.changeListener.get(i).registerPopulationStateChanged(this, name); + } } } diff --git a/src/eva2/optimization/strategies/NichePSO.java b/src/eva2/optimization/strategies/NichePSO.java index c2fbdbe3..8e464988 100644 --- a/src/eva2/optimization/strategies/NichePSO.java +++ b/src/eva2/optimization/strategies/NichePSO.java @@ -537,7 +537,7 @@ public class NichePSO implements InterfaceAdditionalPopulationInformer, Interfac ParticleSubSwarmOptimization currentsubswarm = getSubSwarms().get(i); if (currentsubswarm.isActive()) { actCnt++; - avgSize += currentsubswarm.m_Population.size(); + avgSize += currentsubswarm.population.size(); } } if (actCnt > 0) { diff --git a/src/eva2/optimization/strategies/ParticleSubSwarmOptimization.java b/src/eva2/optimization/strategies/ParticleSubSwarmOptimization.java index 5d7cce23..10d987d4 100644 --- a/src/eva2/optimization/strategies/ParticleSubSwarmOptimization.java +++ b/src/eva2/optimization/strategies/ParticleSubSwarmOptimization.java @@ -114,8 +114,8 @@ public class ParticleSubSwarmOptimization extends ParticleSwarmOptimizationGCPSO * and sets the current fitness as the first value */ protected void initIndividuals() { - for (int i = 0; i < m_Population.size(); ++i) { - AbstractEAIndividual indy = (AbstractEAIndividual) (m_Population.getEAIndividual(i)); + for (int i = 0; i < population.size(); ++i) { + AbstractEAIndividual indy = (AbstractEAIndividual) (population.getEAIndividual(i)); initSubSwarmDefaultsOf(indy); } } @@ -283,8 +283,8 @@ public class ParticleSubSwarmOptimization extends ParticleSwarmOptimizationGCPSO */ public void updateFitnessArchives() { //int lim = 3; // maximal number of fitnessvalues remembered from former iterations - for (int i = 0; i < m_Population.size(); ++i) { - AbstractEAIndividual indy = (AbstractEAIndividual) m_Population.getEAIndividual(i); + for (int i = 0; i < population.size(); ++i) { + AbstractEAIndividual indy = (AbstractEAIndividual) population.getEAIndividual(i); Vector fitArchive_old = (Vector) (indy.getData(NichePSO.fitArchiveKey)); double scalarFitness = sum(indy.getFitness()); // if multiobjective, use the sum of all fitnessvalues (dont use the norm because fitnessvalues may be negative) Double fitness = new Double(scalarFitness); @@ -310,8 +310,8 @@ public class ParticleSubSwarmOptimization extends ParticleSwarmOptimizationGCPSO * to the std deviation over the last 3 fitness values */ public void updateFitnessStdDev() { - for (int i = 0; i < m_Population.size(); ++i) { - AbstractEAIndividual currentindy = m_Population.getEAIndividual(i); + for (int i = 0; i < population.size(); ++i) { + AbstractEAIndividual currentindy = population.getEAIndividual(i); Vector fitnessArchive = (Vector) (currentindy.getData(NichePSO.fitArchiveKey)); // the stddev is computed over 3 values as suggested in // "a niching particle swarm optimizer" by Brits et al. @@ -325,8 +325,8 @@ public class ParticleSubSwarmOptimization extends ParticleSwarmOptimizationGCPSO * update the personal best representation if the current individual is better than the pbest */ public void updatePersonalBest() { - for (int i = 0; i < m_Population.size(); ++i) { - AbstractEAIndividual currentindy = m_Population.getEAIndividual(i); + for (int i = 0; i < population.size(); ++i) { + AbstractEAIndividual currentindy = population.getEAIndividual(i); AbstractEAIndividual pbest = (AbstractEAIndividual) currentindy.getData("PersonalBestKey"); if (currentindy.isDominating(pbest)) { initPersonalBestOf(currentindy); @@ -529,10 +529,10 @@ public class ParticleSubSwarmOptimization extends ParticleSwarmOptimizationGCPSO * adds a population and its function calls to this.population */ public void addPopulation(Population pop) { - m_Population.addPopulation(pop); + population.addPopulation(pop); // dont peculate the function calls from the added population (which is going to be deleted in NichePSO) - m_Population.incrFunctionCallsBy(pop.getFunctionCalls()); + population.incrFunctionCallsBy(pop.getFunctionCalls()); } /** @@ -544,7 +544,7 @@ public class ParticleSubSwarmOptimization extends ParticleSwarmOptimizationGCPSO public boolean addIndividual(IndividualInterface ind) { // nothing to do regarding function calls // old calls were counted in old population new calls are now counted in this population - return m_Population.addIndividual(ind); + return population.addIndividual(ind); } /** @@ -571,7 +571,7 @@ public class ParticleSubSwarmOptimization extends ParticleSwarmOptimizationGCPSO * removes an individual */ public boolean removeSubIndividual(IndividualInterface ind) { - return m_Population.removeMember(ind); + return population.removeMember(ind); } public void removeSubPopulation(Population pop, boolean allowMissing) { // this is very slow... @@ -621,8 +621,8 @@ public class ParticleSubSwarmOptimization extends ParticleSwarmOptimizationGCPSO double max = Double.NEGATIVE_INFINITY; //PhenotypeMetric metric = new PhenotypeMetric(); - for (int i = 0; i < m_Population.size(); ++i) { - AbstractEAIndividual indy = m_Population.getEAIndividual(i); + for (int i = 0; i < population.size(); ++i) { + AbstractEAIndividual indy = population.getEAIndividual(i); //double dist = metric.distance(m_BestIndividual, indy); double sqrdDist = EuclideanMetric.squaredEuclideanDistance(AbstractEAIndividual.getDoublePositionShallow(m_BestIndividual), AbstractEAIndividual.getDoublePositionShallow(indy)); diff --git a/src/eva2/optimization/strategies/ParticleSwarmOptimization.java b/src/eva2/optimization/strategies/ParticleSwarmOptimization.java index 9034559e..c87c0084 100644 --- a/src/eva2/optimization/strategies/ParticleSwarmOptimization.java +++ b/src/eva2/optimization/strategies/ParticleSwarmOptimization.java @@ -46,7 +46,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se * Generated serial version uid. */ private static final long serialVersionUID = -149996122795669589L; - protected Population m_Population = new Population(); + protected Population population = new Population(); Object[] sortedPop = null; protected AbstractEAIndividual m_BestIndividual = null; protected InterfaceOptimizationProblem m_Problem = new F1Problem(); @@ -94,7 +94,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se transient final static String sortedIndexKey = "sortedParticleIndex"; transient final static String dmsGroupIndexKey = "dmsGroupIndex"; protected String m_Identifier = ""; - transient private InterfacePopulationChangedEventListener m_Listener; + transient private Vector changeListener; transient private TopoPlot topoPlot = null; /// sleep time so that visual plot can be followed easier protected int sleepTime = 0; @@ -128,7 +128,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se if (a.algType != null) { this.algType = (SelectedTag) a.algType.clone(); } - this.m_Population = (Population) a.m_Population.clone(); + this.population = (Population) a.population.clone(); this.m_Problem = a.m_Problem; this.m_Identifier = a.m_Identifier; this.initialVelocity = a.initialVelocity; @@ -153,7 +153,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se public ParticleSwarmOptimization(int popSize, double p1, double p2, PSOTopologyEnum topo, int topoRange) { this(); algType.setSelectedTag(1); // set to constriction - m_Population = new Population(popSize); + population = new Population(popSize); setPhiValues(p1, p2); topologyRange = topoRange; topology = topo; @@ -205,13 +205,13 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se } tracedVelocity = null; if (!externalInitialPop) { - this.m_Problem.initializePopulation(this.m_Population); + this.m_Problem.initializePopulation(this.population); } // evaluation needs to be done here now, as its omitted if reset is false - initDefaults(this.m_Population); - this.evaluatePopulation(this.m_Population); + initDefaults(this.population); + this.evaluatePopulation(this.population); if (m_BestIndividual == null) { - m_BestIndividual = m_Population.getBestEAIndividual(); + m_BestIndividual = population.getBestEAIndividual(); } initByPopulation(null, false); externalInitialPop = false; @@ -409,7 +409,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se } protected boolean isParticleTypeByIndex(int index, int type) { - return isParticleType((AbstractEAIndividual) m_Population.get(index), type); + return isParticleType((AbstractEAIndividual) population.get(index), type); } protected boolean isParticleType(AbstractEAIndividual indy, int type) { @@ -448,31 +448,31 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se @Override public void initByPopulation(Population pop, boolean reset) { if (pop != null) { - this.m_Population = (Population) pop.clone(); + this.population = (Population) pop.clone(); externalInitialPop = true; } if (reset) { - this.m_Population.init(); + this.population.init(); } AbstractEAIndividual indy; - if (!defaultsDone(m_Population.getEAIndividual(0))) { - initDefaults(m_Population); + if (!defaultsDone(population.getEAIndividual(0))) { + initDefaults(population); } if (reset) { - this.evaluatePopulation(this.m_Population); + this.evaluatePopulation(this.population); } - for (int i = 0; i < this.m_Population.size(); i++) { - indy = (AbstractEAIndividual) this.m_Population.get(i); + for (int i = 0; i < this.population.size(); i++) { + indy = (AbstractEAIndividual) this.population.get(i); if (indy instanceof InterfaceDataTypeDouble) { initIndividualMemory(indy); } } - this.m_BestIndividual = (AbstractEAIndividual) this.m_Population.getBestEAIndividual().clone(); + this.m_BestIndividual = (AbstractEAIndividual) this.population.getBestEAIndividual().clone(); if (reset) { this.firePropertyChangedEvent(Population.NEXT_GENERATION_PERFORMED); @@ -484,15 +484,15 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se if (topologyRange < 2) { System.err.println("Error, tree/hpso requires topology range of at least 2!"); } else { - while (getMaxNodes(topologyRange, treeLevels) < m_Population.size()) { + while (getMaxNodes(topologyRange, treeLevels) < population.size()) { treeLevels++; } - treeOrphans = m_Population.size() - getMaxNodes(topologyRange, treeLevels - 1); + treeOrphans = population.size() - getMaxNodes(topologyRange, treeLevels - 1); treeLastFullLevelNodeCnt = (int) Math.pow(topologyRange, treeLevels - 1); } } if (getTopology() == PSOTopologyEnum.dms) { - dmsLinks = regroupSwarm(m_Population, getTopologyRange()); + dmsLinks = regroupSwarm(population, getTopologyRange()); } } @@ -871,18 +871,18 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se private double[] getSuccessfulVel(int index) { if (true) { - return (double[]) m_Population.getEAIndividual(index).getData(lastSuccessKey); + return (double[]) population.getEAIndividual(index).getData(lastSuccessKey); } else { // random one ArrayList successes = new ArrayList(); - for (int i = 0; i < this.m_Population.size(); i++) { - double[] succVel = (double[]) m_Population.getEAIndividual(i).getData(lastSuccessKey); + for (int i = 0; i < this.population.size(); i++) { + double[] succVel = (double[]) population.getEAIndividual(i).getData(lastSuccessKey); if (succVel != null) { successes.add(new Integer(i)); } } if (successes.size() > 0) { int i = successes.get(RNG.randomInt(successes.size())); - return (double[]) m_Population.getEAIndividual(i).getData(lastSuccessKey); + return (double[]) population.getEAIndividual(i).getData(lastSuccessKey); } else { return null; } @@ -1360,10 +1360,10 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se updatePopulation(); // evaluate the population - this.evaluatePopulation(this.m_Population); + this.evaluatePopulation(this.population); // update the individual memory - updateSwarmMemory(m_Population); + updateSwarmMemory(population); // log the best individual of the population logBestIndividual(); @@ -1403,9 +1403,9 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se } protected void maybeClearPlot() { - if (((m_Population.getGeneration() % 23) == 0) && isShow() && (m_Plot != null)) { + if (((population.getGeneration() % 23) == 0) && isShow() && (m_Plot != null)) { m_Plot.clearAll(); - InterfaceDataTypeDouble indy = (InterfaceDataTypeDouble) this.m_Population.get(0); + InterfaceDataTypeDouble indy = (InterfaceDataTypeDouble) this.population.get(0); double[][] range = indy.getDoubleRange(); m_Plot.setCornerPoints(range, 0); } @@ -1416,8 +1416,8 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se */ protected void startOptimize() { if (TRACE) { - for (int i = 0; i < m_Population.size(); i++) { - AbstractEAIndividual indy = m_Population.getEAIndividual(i); + for (int i = 0; i < population.size(); i++) { + AbstractEAIndividual indy = population.getEAIndividual(i); System.out.println(BeanInspector.toString(indy.getData(partTypeKey))); System.out.println(BeanInspector.toString(indy.getData(partBestPosKey))); System.out.println(BeanInspector.toString(indy.getData(partBestFitKey))); @@ -1434,8 +1434,8 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se * Log the best individual so far. */ protected void logBestIndividual() { - if (this.m_Population.getBestEAIndividual().isDominatingDebConstraints(this.m_BestIndividual)) { - this.m_BestIndividual = (AbstractEAIndividual) this.m_Population.getBestEAIndividual().clone(); + if (this.population.getBestEAIndividual().isDominatingDebConstraints(this.m_BestIndividual)) { + this.m_BestIndividual = (AbstractEAIndividual) this.population.getBestEAIndividual().clone(); this.m_BestIndividual.putData(partBestFitKey, this.m_BestIndividual.getFitness().clone()); this.m_BestIndividual.putData(partBestPosKey, ((InterfaceDataTypeDouble) this.m_BestIndividual).getDoubleData()); // System.out.println("new best: "+m_BestIndividual.toString()); @@ -1447,10 +1447,10 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se */ protected void updatePopulation() { - updateTopology(this.m_Population); + updateTopology(this.population); - for (int i = 0; i < this.m_Population.size(); i++) { - this.updateIndividual(i, (AbstractEAIndividual) m_Population.get(i), this.m_Population); + for (int i = 0; i < this.population.size(); i++) { + this.updateIndividual(i, (AbstractEAIndividual) population.get(i), this.population); } if (m_Show) { @@ -1467,8 +1467,8 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se this.topoPlot.setTopology((Interface2DBorderProblem) this.m_Problem); } - for (int i = 0; i < this.m_Population.size(); i++) { - tmpIndy1 = (InterfaceDataTypeDouble) this.m_Population.get(i); + for (int i = 0; i < this.population.size(); i++) { + tmpIndy1 = (InterfaceDataTypeDouble) this.population.get(i); popRep.addDPoint(new DPoint(tmpIndy1.getDoubleData()[0], tmpIndy1.getDoubleData()[1])); } this.topoPlot.getFunctionArea().addDElement(popRep); @@ -1651,33 +1651,47 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se */ protected void show() { if (this.m_Plot == null) { - InterfaceDataTypeDouble indy = (InterfaceDataTypeDouble) this.m_Population.get(0); + InterfaceDataTypeDouble indy = (InterfaceDataTypeDouble) this.population.get(0); double[][] range = indy.getDoubleRange(); - this.m_Plot = new Plot("PSO " + m_Population.getGeneration(), "x1", "x2", range[0], range[1]); + this.m_Plot = new Plot("PSO " + population.getGeneration(), "x1", "x2", range[0], range[1]); // this.m_Plot.setUnconnectedPoint(range[0][0], range[1][0], 0); // this.m_Plot.setUnconnectedPoint(range[0][1], range[1][1], 0); } } + /** + * This method allows you to add the LectureGUI as listener to the Optimizer + * + * @param ea + */ @Override public void addPopulationChangedEventListener(InterfacePopulationChangedEventListener ea) { - this.m_Listener = ea; + if (this.changeListener == null) { + this.changeListener = new Vector(); + } + this.changeListener.add(ea); } @Override public boolean removePopulationChangedEventListener( InterfacePopulationChangedEventListener ea) { - if (m_Listener == ea) { - m_Listener = null; + if (changeListener != null && changeListener.removeElement(ea)) { return true; } else { return false; } } + /** + * Something has changed + * + * @param name + */ protected void firePropertyChangedEvent(String name) { - if (this.m_Listener != null) { - this.m_Listener.registerPopulationStateChanged(this, name); + if (this.changeListener != null) { + for (int i = 0; i < this.changeListener.size(); i++) { + this.changeListener.get(i).registerPopulationStateChanged(this, name); + } } } @@ -1708,7 +1722,7 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se result += "Particle Swarm Optimization:\n"; result += "Optimization Problem: "; result += this.m_Problem.getStringRepresentationForProblem(this) + "\n"; - result += this.m_Population.getStringRepresentation(); + result += this.population.getStringRepresentation(); return result; } @@ -1740,12 +1754,12 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se @Override public Population getPopulation() { - return this.m_Population; + return this.population; } @Override public void setPopulation(Population pop) { - this.m_Population = pop; + this.population = pop; if (pop.size() != pop.getTargetSize()) { // new particle count! tracedVelocity = null; initByPopulation(null, false);