From: Gary P. <gpa...@gm...> - 2009-07-21 06:40:20
|
Glad to see that this is resolved :) I particularly liked the comment about the use of Algorithm.get(). Bad static state! BAD! Thanks, Gary On Monday 20 July 2009 15:22:18 Andrich van Wyk wrote: > Fixed bug that caused the unit tests of VisualPositionUpdateStategy and > ExplorerBee to fail, the issue was related to bees leaving the function > domain, which should be allowed. The tests were also expanded. > Removed dependecy of ExplorerBee on Algorithm.get(), enabling easier > testing. Changed exactly when bees calculate fitnesses, new implementation > is slightly more efficient. Changed a number of method names and made > slight changes to the abc.xml file. Fixed a number of code style and > reported PMD issues. > --- > src/main/java/net/sourceforge/cilib/boa/ABC.java | 141 > +++++++++++++++++--- .../net/sourceforge/cilib/boa/bee/AbstractBee.java | > 34 +++++- > .../net/sourceforge/cilib/boa/bee/ExplorerBee.java | 82 ++++++++++-- > .../net/sourceforge/cilib/boa/bee/HoneyBee.java | 2 + > .../net/sourceforge/cilib/boa/bee/OnlookerBee.java | 8 +- > .../net/sourceforge/cilib/boa/bee/WorkerBee.java | 28 +++- > .../BeePositionUpdateStrategy.java | 7 + > .../VisualPositionUpdateStategy.java | 8 +- > .../java/net/sourceforge/cilib/boa/ABCTest.java | 8 +- > .../cilib/boa/bees/ExplorerBeeTest.java | 51 +++---- > .../VisualPositionUpdateStategyTest.java | 25 ++-- > xml/abc.xml | 136 > ++++++++----------- 12 files changed, 359 insertions(+), 171 deletions(-) > > diff --git a/src/main/java/net/sourceforge/cilib/boa/ABC.java > b/src/main/java/net/sourceforge/cilib/boa/ABC.java index e35e0a6..614912a > 100644 > --- a/src/main/java/net/sourceforge/cilib/boa/ABC.java > +++ b/src/main/java/net/sourceforge/cilib/boa/ABC.java > @@ -63,19 +63,16 @@ import > net.sourceforge.cilib.problem.OptimisationSolution; * > */ > public class ABC extends SinglePopulationBasedAlgorithm { > - private static final long serialVersionUID = 7918711449442012960L; > > + private static final long serialVersionUID = 7918711449442012960L; > private Topology<HoneyBee> workerBees; //keeps > references to the worker bees private Topology<HoneyBee> onlookerBees; > //keeps references to the onlooker bees private Topology<HoneyBee> > hive; //keeps references to all the bees (workers and > onlookers) - > private ExplorerBee explorerBee; //explorer bee > private SelectionStrategy dancingSelectionStrategy; //bee dancing > selection strategy - > private ControlParameter workerBeePercentage; //control > parameter for number of worker bees private ControlParameter forageLimit; > //control parameter for the forage limit private > ControlParameter explorerBeeUpdateLimit; //control parameter to limit > the explorer bee position updates per iteration - > private HoneyBee bestBee; //reference to > best solution found so far > > /** > @@ -134,7 +131,7 @@ public class ABC extends SinglePopulationBasedAlgorithm > { this.initialisationStrategy.initialise(hive, this.optimisationProblem); > > int i; > - int numWorkerBees = (int) > (workerBeePercentage.getParameter()*hive.size()); + int > numWorkerBees = (int) (workerBeePercentage.getParameter() * hive.size()); > for (i = 0; i < numWorkerBees; i++) { > WorkerBee bee = (WorkerBee) hive.get(i); > bee.setForageLimit(this.forageLimit.getClone()); > @@ -158,11 +155,9 @@ public class ABC extends > SinglePopulationBasedAlgorithm { protected void algorithmIteration() { > for (HoneyBee bee : workerBees) { > bee.updatePosition(); > - bee.calculateFitness(); > if (bestBee == null) { > bestBee = bee.getClone(); > - } > - else if > (bee.getBestFitness().compareTo(bestBee.getBestFitness()) > 0) { + > } else if (bee.getBestFitness().compareTo(bestBee.getBestFitness()) > 0) > { bestBee = bee.getClone(); > } > } > @@ -171,11 +166,9 @@ public class ABC extends > SinglePopulationBasedAlgorithm { HoneyBee selectedBee = > dancingSelectionStrategy.select(workerBees); > bee.setPosition(selectedBee.getPosition().getClone()); > bee.updatePosition(); > - bee.calculateFitness(); > if (bestBee == null) { > bestBee = bee; > - } > - else if > (bee.getBestFitness().compareTo(bestBee.getBestFitness()) > 0) { + > } else if (bee.getBestFitness().compareTo(bestBee.getBestFitness()) > 0) > { bestBee = bee; > } > } > @@ -186,8 +179,9 @@ public class ABC extends SinglePopulationBasedAlgorithm > { */ > @Override > public OptimisationSolution getBestSolution() { > - if (this.bestBee == null) > + if (this.bestBee == null) { > throw new InitialisationException("Best solution cannot be > determined before algorithm is run"); + } > > return new OptimisationSolution(bestBee.getPosition(), > bestBee.getFitness()); } > @@ -208,14 +202,6 @@ public class ABC extends > SinglePopulationBasedAlgorithm { return this.hive; > } > > - public Topology<HoneyBee> getWorkerTopology() { > - return this.workerBees; > - } > - > - public Topology<HoneyBee> getOnlookerTopology() { > - return this.onlookerBees; > - } > - > /** > * {@inheritDoc} > */ > @@ -224,41 +210,156 @@ public class ABC extends > SinglePopulationBasedAlgorithm { throw new > UnsupportedOperationException("Method not implemented"); } > > + /** > + * Gets the bee dancing selection strategy. > + * @return the bee dancing selection strategy. > + */ > public SelectionStrategy getDancingSelectionStrategy() { > return dancingSelectionStrategy; > } > > + /** > + * Sets the bee dancinc selection strategy. > + * @param dancingSelectionStrategy the new bee dancing selection > strategy. + */ > public void setDancingSelectionStrategy( > SelectionStrategy dancingSelectionStrategy) { > this.dancingSelectionStrategy = dancingSelectionStrategy; > } > > + /** > + * Gets the explorer bee. > + * @return the explorer bee. > + */ > public ExplorerBee getExplorerBee() { > return this.explorerBee; > } > > + /** > + * Sets the explorer bee. > + * @param explorerBee the new explorer bee. > + */ > + public void setExplorerBee(ExplorerBee explorerBee) { > + this.explorerBee = explorerBee; > + } > + > + /** > + * Gets the {@code ControlParameter} specifying the number of worker > bees. + * @return the {@code ControlParameter} specifying the number of > worker bees. + */ > public ControlParameter getWorkerBeeNumber() { > return workerBeePercentage; > } > > + /** > + * Gets the {@code ControlParameter} specifying the percentage of > worker bees. + * @return the {@code ControlParameter} specifying the > percentage of worker bees. + */ > + public ControlParameter getWorkerBeePercentage() { > + return workerBeePercentage; > + } > + > + /** > + * Sets the {@code ControlParameter} specifying the percentage of > worker bees.. + * @param workerBeeNumber the new {@code > ControlParameter} specifying the percentage of worker bees. + */ > public void setWorkerBeePercentage(ControlParameter workerBeeNumber) { > this.workerBeePercentage = workerBeeNumber; > } > > + /** > + * Gets the {@code ControlParameter} specifying the foraging limit. > + * @return the {@code ControlParameter} specifying the foraging > limit. + */ > public ControlParameter getForageLimit() { > return forageLimit; > } > > + /** > + * Sets the {@code ControlParameter} specifying the foraging limit. > + * @param forageThreshold the new {@code ControlParameter} > specifying the foraging limit. + */ > public void setForageLimit(ControlParameter forageThreshold) { > this.forageLimit = forageThreshold; > } > > + /** > + * Gets the {@code ControlParameter} specifying the limit to how many > times the explorer bee can update positions. + * @return the {@code > ControlParameter} specifying the limit to how many times the explorer bee > can update positions. + */ > public ControlParameter getExplorerBeeUpdateLimit() { > return explorerBeeUpdateLimit; > } > > + /** > + * Sets the {@code ControlParameter} specifying the limit to how many > times the explorer bee can update positions. + * @param > explorerBeeUpdateLimit the {@code ControlParameter} specifying the limit > to how many times the explorer bee can update positions. + */ > public void setExplorerBeeUpdateLimit(ControlParameter > explorerBeeUpdateLimit) { this.explorerBeeUpdateLimit = > explorerBeeUpdateLimit; > } > > + /** > + * Gets the bee with the highest fitness during the algorithm > execution. + * @return the bee with the highest fitness. > + */ > + public HoneyBee getBestBee() { > + return bestBee; > + } > + > + /** > + * Sets the bee with the highest fitness during the algorithm > execution. + * @param bestBee the new bee with the highest fitness. > + */ > + public void setBestBee(HoneyBee bestBee) { > + this.bestBee = bestBee; > + } > + > + /** > + * Get the {@code Topology} containing all the bees in the hive. > + * @return the {@code Topology} containing all bees in the hive. > + */ > + public Topology<HoneyBee> getHive() { > + return hive; > + } > + > + /** > + * Set the {@code Topology} containing all the bees in the hive. > + * @param hive the new {@code Topology} containing all bees in the > hive. + */ > + public void setHive(Topology<HoneyBee> hive) { > + this.hive = hive; > + } > + > + /** > + * Get the {@code Topology} containing the onlooker bees. > + * @return the {@code Topology} containing the onlooker bees. > + */ > + public Topology<HoneyBee> getOnlookerBees() { > + return onlookerBees; > + } > + > + /** > + * Set the {@code Topology} containing the onlooker bees. > + * @param onlookerBees the new {@code Topology} containing the > onlooker bees. + */ > + public void setOnlookerBees(Topology<HoneyBee> onlookerBees) { > + this.onlookerBees = onlookerBees; > + } > + > + /** > + * Get the {@code Topology} containing the worker bees. > + * @return the {@code Topology} containing the worker bees. > + */ > + public Topology<HoneyBee> getWorkerBees() { > + return workerBees; > + } > + > + /** > + * Set the {@code Topology} containing the worker bees. > + * @param workerBees the new {@code Topology} containing the worker > bees. + */ > + public void setWorkerBees(Topology<HoneyBee> workerBees) { > + this.workerBees = workerBees; > + } > } > diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java > b/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java index > 1830192..ddef6ac 100644 > --- a/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java > +++ b/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java > @@ -21,7 +21,6 @@ > */ > package net.sourceforge.cilib.boa.bee; > > -import net.sourceforge.cilib.type.types.Types; > import > net.sourceforge.cilib.boa.positionupdatestrategies.BeePositionUpdateStrateg >y; import > net.sourceforge.cilib.boa.positionupdatestrategies.VisualPositionUpdateStat >egy; import net.sourceforge.cilib.entity.AbstractEntity; > @@ -40,8 +39,8 @@ import net.sourceforge.cilib.type.types.container.Vector; > * > */ > public abstract class AbstractBee extends AbstractEntity implements > HoneyBee { - private static final long serialVersionUID = > 7005546673802814268L; > > + private static final long serialVersionUID = 7005546673802814268L; > protected BeePositionUpdateStrategy positionUpdateStrategy; > protected SelectionStrategy targetSelectionStrategy; > protected int dimension; > @@ -80,6 +79,14 @@ public abstract class AbstractBee extends AbstractEntity > implements HoneyBee { } > > /** > + * Sets the position update strategy of the bee. > + * @param positionUpdateStrategy the new position update strategy. > + */ > + public void setPositionUpdateStrategy(BeePositionUpdateStrategy > positionUpdateStrategy) { + this.positionUpdateStrategy = > positionUpdateStrategy; > + } > + > + /** > * {@inheritDoc} > */ > @Override > @@ -118,6 +125,14 @@ public abstract class AbstractBee extends > AbstractEntity implements HoneyBee { } > > /** > + * Sets the dimension of the solution used by the bee. > + * @param dimension the new dimension of the solution. > + */ > + public void setDimension(int dimension) { > + this.dimension = dimension; > + } > + > + /** > * {@inheritDoc} > */ > public Vector getPosition() { > @@ -151,4 +166,19 @@ public abstract class AbstractBee extends > AbstractEntity implements HoneyBee { throw new > UnsupportedOperationException("Reinitialise not implemented for > AbstractBee"); } > > + /** > + * Gets the target selection strategy, for selecting bees to follow in > position updates. + * @return the target selection strategy. > + */ > + public SelectionStrategy getTargetSelectionStrategy() { > + return targetSelectionStrategy; > + } > + > + /** > + * Sets the target selection strategy, for selecting bees to follow in > position updates. + * @param targetSelectionStrategy the new target > selection strategy. + */ > + public void setTargetSelectionStrategy(SelectionStrategy > targetSelectionStrategy) { + this.targetSelectionStrategy = > targetSelectionStrategy; > + } > } > diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/ExplorerBee.java > b/src/main/java/net/sourceforge/cilib/boa/bee/ExplorerBee.java index > 3497aad..68f6ac4 100644 > --- a/src/main/java/net/sourceforge/cilib/boa/bee/ExplorerBee.java > +++ b/src/main/java/net/sourceforge/cilib/boa/bee/ExplorerBee.java > @@ -21,11 +21,10 @@ > */ > package net.sourceforge.cilib.boa.bee; > > -import net.sourceforge.cilib.algorithm.Algorithm; > import net.sourceforge.cilib.controlparameter.ConstantControlParameter; > import net.sourceforge.cilib.controlparameter.ControlParameter; > import net.sourceforge.cilib.math.random.generator.MersenneTwister; > -import net.sourceforge.cilib.math.random.generator.Seeder; > +import net.sourceforge.cilib.math.random.generator.Random; > import net.sourceforge.cilib.type.types.container.Vector; > import net.sourceforge.cilib.util.Cloneable; > > @@ -38,9 +37,9 @@ import net.sourceforge.cilib.util.Cloneable; > * > */ > public class ExplorerBee implements Cloneable { > - private static final long serialVersionUID = 1068799535328234923L; > > - private MersenneTwister random; //generates a random > position + private static final long serialVersionUID = > 1068799535328234923L; + private Random random; //generates a > random position private int previousUpdatedIteration; //used to check > whether the algorithm has entered a new iteration private int > numberOfUpdates; //how many have occured in current iteration > private ControlParameter explorerBeeUpdateLimit; > @@ -70,24 +69,24 @@ public class ExplorerBee implements Cloneable { > /** > * {@inheritDoc} > */ > + @Override > public ExplorerBee getClone() { > return new ExplorerBee(this); > } > > /** > * Verifies it is allowed for a worker bee to convert to an explorer > bee. - * @precondition an algorithm is on the algorithm stack. > + * @param currentIteration the current iteration of the algorithm on > the stack. * @return whether the search is allowed. > */ > - public boolean searchAllowed() { > - int currentIteration = Algorithm.get().getIterations(); > + public boolean searchAllowed(int currentIteration) { > if (previousUpdatedIteration == currentIteration) { > //TODO: Add variable number of updates allowed > - if (Double.compare(numberOfUpdates, > explorerBeeUpdateLimit.getParameter()) < 0) + if > (Double.compare(numberOfUpdates, explorerBeeUpdateLimit.getParameter()) < > 0) { return true; > + } > return false; > - } > - else { > + } else { > numberOfUpdates = 0; > } > return true; > @@ -95,27 +94,82 @@ public class ExplorerBee implements Cloneable { > > /** > * Returns a new random position. > - * @precondition an algorithm is on the algorithm stack. > * @precondition the search is allowed. > + * @param currentIteration the current iteration of the algorithm on > the stack. * @param position random position with same dimension and bounds > as given position. * @return The new position. > */ > - public Vector getNewPosition(Vector position) { > - previousUpdatedIteration = Algorithm.get().getIterations(); > + public Vector getNewPosition(int currentIteration, Vector position) { > + previousUpdatedIteration = currentIteration; > numberOfUpdates++; > > Vector newPosition = position.getClone(); > - newPosition.randomize(new MersenneTwister()); > + newPosition.randomize(random); > > return newPosition; > } > > + /** > + * Gets the explorer bee update limit. > + * @return the explorer bee update limit. > + */ > public ControlParameter getExplorerBeeUpdateLimit() { > return explorerBeeUpdateLimit; > } > > + /** > + * Sets the explorer bee update limit. > + * @param explorerBeeUpdateLimit the new explorer bee update limit. > + */ > public void setExplorerBeeUpdateLimit(ControlParameter > explorerBeeUpdateLimit) { this.explorerBeeUpdateLimit = > explorerBeeUpdateLimit; > } > > + /** > + * Gets the number of updates done for the current iteration. > + * @return the number of iterations done for the current iteration. > + */ > + public int getNumberOfUpdates() { > + return numberOfUpdates; > + } > + > + /** > + * Sets the number of updates done for the current iteration. > + * @param numberOfUpdates the new number of iterations done for the > current iteration. + */ > + public void setNumberOfUpdates(int numberOfUpdates) { > + this.numberOfUpdates = numberOfUpdates; > + } > + > + /** > + * Gets the last iteration an update was done. > + * @return the last iteration an update was done. > + */ > + public int getPreviousUpdatedIteration() { > + return previousUpdatedIteration; > + } > + > + /** > + * Sets the last iteration an update was done. > + * @param previousUpdatedIteration the last iteration an update was > done. + */ > + public void setPreviousUpdatedIteration(int previousUpdatedIteration) > { + this.previousUpdatedIteration = previousUpdatedIteration; + } > + > + /** > + * Gets the random number generator to use for generating new > positions. + * @return > + */ > + public Random getRandom() { > + return random; > + } > + > + /** > + * Sets the random number generator to use for generating new > positions. + * @param random the new random number generator to use for > generating new positions. + */ > + public void setRandom(Random random) { > + this.random = random; > + } > } > diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/HoneyBee.java > b/src/main/java/net/sourceforge/cilib/boa/bee/HoneyBee.java index > 1d35188..413c3bf 100644 > --- a/src/main/java/net/sourceforge/cilib/boa/bee/HoneyBee.java > +++ b/src/main/java/net/sourceforge/cilib/boa/bee/HoneyBee.java > @@ -35,11 +35,13 @@ public interface HoneyBee extends Entity { > /** > * {@inheritDoc} > */ > + @Override > public HoneyBee getClone(); > > /** > * {@inheritDoc} > */ > + @Override > public Fitness getFitness(); > > /** > diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/OnlookerBee.java > b/src/main/java/net/sourceforge/cilib/boa/bee/OnlookerBee.java index > a9ff676..15e3d02 100644 > --- a/src/main/java/net/sourceforge/cilib/boa/bee/OnlookerBee.java > +++ b/src/main/java/net/sourceforge/cilib/boa/bee/OnlookerBee.java > @@ -39,6 +39,10 @@ public class OnlookerBee extends AbstractBee implements > HoneyBee { public OnlookerBee() { > } > > + /** > + * Copy constructor. > + * @param bee the original bee to copy. > + */ > public OnlookerBee(AbstractBee bee) { > super(bee); > } > @@ -65,10 +69,10 @@ public class OnlookerBee extends AbstractBee implements > HoneyBee { @Override > public void updatePosition() { > ABC algorithm = (ABC) Algorithm.get(); > - HoneyBee target = > targetSelectionStrategy.select(algorithm.getWorkerTopology()); + > HoneyBee target = > targetSelectionStrategy.select(algorithm.getWorkerBees()); > > while (target == this) { > - target = > targetSelectionStrategy.select(algorithm.getWorkerTopology()); + > target = targetSelectionStrategy.select(algorithm.getWorkerBees()); } > > this.positionUpdateStrategy.updatePosition(this, target); > diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/WorkerBee.java > b/src/main/java/net/sourceforge/cilib/boa/bee/WorkerBee.java index > bc34ae3..33339d8 100644 > --- a/src/main/java/net/sourceforge/cilib/boa/bee/WorkerBee.java > +++ b/src/main/java/net/sourceforge/cilib/boa/bee/WorkerBee.java > @@ -31,8 +31,8 @@ import > net.sourceforge.cilib.controlparameter.ControlParameter; * @author Andrich > */ > public class WorkerBee extends AbstractBee implements HoneyBee { > - private static final long serialVersionUID = 3657591650621784765L; > > + private static final long serialVersionUID = 3657591650621784765L; > private ControlParameter forageLimit; > private int failureCount; > > @@ -68,20 +68,20 @@ public class WorkerBee extends AbstractBee implements > HoneyBee { @Override > public void updatePosition() { > ABC algorithm = (ABC) Algorithm.get(); > - HoneyBee target = > targetSelectionStrategy.select(algorithm.getWorkerTopology()); + > HoneyBee target = > targetSelectionStrategy.select(algorithm.getWorkerBees()); > > while (target == this) { > - target = > targetSelectionStrategy.select(algorithm.getWorkerTopology()); + > target = targetSelectionStrategy.select(algorithm.getWorkerBees()); } > > boolean success = this.positionUpdateStrategy.updatePosition(this, > target); if (!success) { > failureCount++; > - if (failureCount >= forageLimit.getParameter()) { > + if (failureCount >= forageLimit.getParameter()) { > failureCount = 0; > ExplorerBee explorerBee = algorithm.getExplorerBee(); > - if (explorerBee.searchAllowed()) { > - > this.setPosition(explorerBee.getNewPosition(this.getPosition())); + > if (explorerBee.searchAllowed(algorithm.getIterations())) { + > > this.setPosition(explorerBee.getNewPosition(algorithm.getIterations(), > this.getPosition())); } > } > } > @@ -102,4 +102,20 @@ public class WorkerBee extends AbstractBee implements > HoneyBee { public void setForageLimit(ControlParameter forageLimit) { > this.forageLimit = forageLimit; > } > + > + /** > + * Gets the failure count. > + * @return the number of times the bee has failed to find a better > position. + */ > + public int getFailureCount() { > + return failureCount; > + } > + > + /** > + * Sets the failure count. > + * @param failureCount the new number of times the bee has failed to > find a better position. + */ > + public void setFailureCount(int failureCount) { > + this.failureCount = failureCount; > + } > } > diff --git > a/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/BeePosit >ionUpdateStrategy.java > b/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/BeePosit >ionUpdateStrategy.java index 465bc5c..082cf8c 100644 > --- > a/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/BeePosit >ionUpdateStrategy.java +++ > b/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/BeePosit >ionUpdateStrategy.java @@ -35,8 +35,15 @@ public interface > BeePositionUpdateStrategy extends Cloneable { /** > * {@inheritDoc} > */ > + @Override > public BeePositionUpdateStrategy getClone(); > > + /** > + * Updates the position of the given bee. > + * @param bee the bee the position update is for. > + * @param other another bee that the position update might use to > update the position. + * @return whether the position update was > successful. > + */ > public boolean updatePosition(HoneyBee bee, HoneyBee other); > > } > diff --git > a/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPo >sitionUpdateStategy.java > b/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPo >sitionUpdateStategy.java index c1bd803..6461a03 100644 > --- > a/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPo >sitionUpdateStategy.java +++ > b/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPo >sitionUpdateStategy.java @@ -21,8 +21,8 @@ > */ > package net.sourceforge.cilib.boa.positionupdatestrategies; > > -import net.sourceforge.cilib.algorithm.Algorithm; > import net.sourceforge.cilib.boa.bee.HoneyBee; > +import net.sourceforge.cilib.entity.EntityType; > import net.sourceforge.cilib.math.random.generator.MersenneTwister; > import net.sourceforge.cilib.problem.Fitness; > import net.sourceforge.cilib.type.types.Real; > @@ -63,10 +63,12 @@ public class VisualPositionUpdateStategy implements > BeePositionUpdateStrategy { newPosition.set(j, newValue); > > //Determine if new position is better than old and update > - Fitness oldFitness = > Algorithm.get().getOptimisationProblem().getFitness(oldPosition, false); - > Fitness newFitness = > Algorithm.get().getOptimisationProblem().getFitness(newPosition, false); + > Fitness oldFitness = bee.getFitness().getClone(); > + bee.calculateFitness(); > + Fitness newFitness = bee.getFitness(); > if (newFitness.compareTo(oldFitness) < 0) { > bee.setPosition(oldPosition); > + bee.getProperties().put(EntityType.FITNESS, oldFitness); > return false; > } > > diff --git a/src/test/java/net/sourceforge/cilib/boa/ABCTest.java > b/src/test/java/net/sourceforge/cilib/boa/ABCTest.java index > 31c8014..c3fc238 100644 > --- a/src/test/java/net/sourceforge/cilib/boa/ABCTest.java > +++ b/src/test/java/net/sourceforge/cilib/boa/ABCTest.java > @@ -51,19 +51,19 @@ public class ABCTest { > > abc.initialise(); > assertEquals(abc.getTopology().size(), 100); > - assertEquals(abc.getWorkerTopology().size(), 70); > - assertEquals(abc.getOnlookerTopology().size(), 30); > + assertEquals(abc.getWorkerBees().size(), 70); > + assertEquals(abc.getOnlookerBees().size(), 30); > HashMap<Type, Type> map = new HashMap<Type, Type>(); > > for (HoneyBee bee : abc.getTopology()) > { > map.put(bee.getCandidateSolution(), > bee.getCandidateSolution()); } > - for (HoneyBee bee : abc.getWorkerTopology()) > + for (HoneyBee bee : abc.getWorkerBees()) > { > map.put(bee.getCandidateSolution(), > bee.getCandidateSolution()); } > - for (HoneyBee bee : abc.getOnlookerTopology()) > + for (HoneyBee bee : abc.getOnlookerBees()) > { > map.put(bee.getCandidateSolution(), > bee.getCandidateSolution()); } > diff --git > a/src/test/java/net/sourceforge/cilib/boa/bees/ExplorerBeeTest.java > b/src/test/java/net/sourceforge/cilib/boa/bees/ExplorerBeeTest.java index > 87750cf..b3d916f 100644 > --- a/src/test/java/net/sourceforge/cilib/boa/bees/ExplorerBeeTest.java > +++ b/src/test/java/net/sourceforge/cilib/boa/bees/ExplorerBeeTest.java > @@ -21,13 +21,11 @@ > */ > package net.sourceforge.cilib.boa.bees; > > -import static org.junit.Assert.assertEquals; > -import static org.junit.Assert.assertTrue; > > -import java.util.ArrayList; > > import > net.sourceforge.cilib.algorithm.initialisation.ClonedPopulationInitialisati >onStrategy; import net.sourceforge.cilib.boa.ABC; > +import net.sourceforge.cilib.boa.bee.ExplorerBee; > import net.sourceforge.cilib.boa.bee.WorkerBee; > import net.sourceforge.cilib.controlparameter.ConstantControlParameter; > import net.sourceforge.cilib.functions.ContinuousFunction; > @@ -35,9 +33,9 @@ import > net.sourceforge.cilib.functions.continuous.unconstrained.Rastrigin; import > net.sourceforge.cilib.problem.FunctionMinimisationProblem; import > net.sourceforge.cilib.stoppingcondition.MaximumIterations; import > net.sourceforge.cilib.stoppingcondition.StoppingCondition; -import > net.sourceforge.cilib.type.types.Real; > import net.sourceforge.cilib.type.types.container.Vector; > > +import org.junit.Assert; > import org.junit.Before; > import org.junit.Test; > > @@ -66,34 +64,27 @@ public class ExplorerBeeTest { > } > > @Test > - public void testGetNewPosition() { > + public void testSearchAllowed() { > //get up a position with bounds > - Vector currentPosition; > - > - //update position with explorer bee since forage threshold is -1 > - ArrayList<Vector> oldPositions = new ArrayList<Vector>(); > - for (int k = 0; k < abc.getWorkerTopology().size(); k++) { > - > oldPositions.add((Vector)abc.getWorkerTopology().get(k).getPosition().getCl >one()); - } > - abc.performIteration(); > + Vector oldPosition = > abc.getWorkerBees().get(0).getPosition().getClone();; + //update > position with explorer bee > + ExplorerBee explorerBee = abc.getExplorerBee(); > + Assert.assertTrue(explorerBee.searchAllowed(1)); > + explorerBee.getNewPosition(1,oldPosition); > + //only one update is allowed for the same iteration, this must > therefore be false... + > Assert.assertTrue(!explorerBee.searchAllowed(1)); > + //and this true. > + Assert.assertTrue(explorerBee.searchAllowed(2)); > + } > > - boolean explorerUpdateOccured = false; > - //assertions > - for (int k = 0; k < abc.getWorkerTopology().size(); k++) { > - boolean allDimensionsChanged = true; > - currentPosition = > (Vector)abc.getWorkerTopology().get(k).getCandidateSolution(); - > assertEquals(5,currentPosition.size()); > - for (int i = 0; i < currentPosition.size(); i++) { > - assertTrue(((Real)currentPosition.get(i)).getReal() != > Double.NaN); - > assertTrue(!Double.isInfinite(((Real)currentPosition.get(i)).getReal())); - > allDimensionsChanged = allDimensionsChanged & > (Double.compare(((Real)currentPosition.get(i)).getReal(), - > ((Real)oldPositions.get(k).get(i)).getReal())!=0); - > assertTrue(((Real)currentPosition.get(i)).getReal() <= 5.0); - > assertTrue(((Real)currentPosition.get(i)).getReal() >= -5.0); - > } > - explorerUpdateOccured = explorerUpdateOccured | > allDimensionsChanged; - } > - assertTrue(explorerUpdateOccured); > + @Test > + public void testGetNewPosition() { > + //get up a position with bounds > + Vector oldPosition = > abc.getWorkerBees().get(0).getPosition().getClone();; + //update > position with explorer bee > + ExplorerBee explorerBee = abc.getExplorerBee(); > + Vector newPosition = explorerBee.getNewPosition(1,oldPosition); > + Assert.assertTrue(!oldPosition.equals(newPosition)); > } > > } > diff --git > a/src/test/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPo >sitionUpdateStategyTest.java > b/src/test/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPo >sitionUpdateStategyTest.java index a5468f2..5b0b535 100644 > --- > a/src/test/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPo >sitionUpdateStategyTest.java +++ > b/src/test/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPo >sitionUpdateStategyTest.java @@ -21,7 +21,6 @@ > */ > package net.sourceforge.cilib.boa.positionupdatestrategies; > > - > import static org.junit.Assert.assertEquals; > import static org.junit.Assert.assertTrue; > import > net.sourceforge.cilib.algorithm.initialisation.ClonedPopulationInitialisati >onStrategy; @@ -31,6 +30,7 @@ import > net.sourceforge.cilib.boa.bee.WorkerBee; > import net.sourceforge.cilib.controlparameter.ConstantControlParameter; > import net.sourceforge.cilib.functions.ContinuousFunction; > import net.sourceforge.cilib.functions.continuous.unconstrained.Rastrigin; > +import net.sourceforge.cilib.problem.Fitness; > import net.sourceforge.cilib.problem.FunctionMinimisationProblem; > import net.sourceforge.cilib.stoppingcondition.MaximumIterations; > import net.sourceforge.cilib.stoppingcondition.StoppingCondition; > @@ -41,6 +41,7 @@ import org.junit.Before; > import org.junit.Test; > > public class VisualPositionUpdateStategyTest { > + > private ABC abc; > > @Before > @@ -59,7 +60,7 @@ public class VisualPositionUpdateStategyTest { > initStrategy.setEntityType(bee); > abc.setInitialisationStrategy(initStrategy); > abc.setWorkerBeePercentage(new ConstantControlParameter(0.5)); > - abc.setForageLimit(new ConstantControlParameter(-1)); > + abc.setForageLimit(new > ConstantControlParameter(Integer.MAX_VALUE)); > abc.addStoppingCondition(condition); > abc.setOptimisationProblem(problem); > abc.initialise(); > @@ -67,16 +68,20 @@ public class VisualPositionUpdateStategyTest { > > @Test > public void testUpdatePosition() { > - HoneyBee bee = abc.getWorkerTopology().get(0); > + HoneyBee bee = abc.getWorkerBees().get(0); > abc.performIteration(); > - Vector currentPosition = (Vector)bee.getPosition(); > - assertEquals(10,currentPosition.size()); > + Fitness oldFitness = bee.getFitness().getClone(); > + abc.performIteration(); > + Vector currentPosition = (Vector) bee.getPosition(); > + System.out.println(currentPosition); > + assertEquals(10, currentPosition.size()); > for (int i = 0; i < currentPosition.size(); i++) { > - assertTrue(((Real)currentPosition.get(i)).getReal() != > Double.NaN); - > assertTrue(!Double.isInfinite(((Real)currentPosition.get(i)).getReal())); - > assertTrue(((Real)currentPosition.get(i)).getReal() <= 5.0); - > assertTrue(((Real)currentPosition.get(i)).getReal() >= -5.0); + > assertTrue(((Real) currentPosition.get(i)).getReal() != > Double.NaN); + assertTrue(!Double.isInfinite(((Real) > currentPosition.get(i)).getReal())); } > + Fitness newFitness = bee.getFitness(); > + System.out.println(oldFitness.getValue()); > + System.out.println(newFitness.getValue()); > + assertTrue(newFitness.compareTo(oldFitness) >= 0); > } > - > } > diff --git a/xml/abc.xml b/xml/abc.xml > index f06c5c0..f62675f 100644 > --- a/xml/abc.xml > +++ b/xml/abc.xml > @@ -5,84 +5,60 @@ > <!ATTLIST measurements id ID #IMPLIED> > ]> > <simulator> > - <algorithms> > - <algorithm id="abc" class="boa.ABC"> > - <initialisationStrategy > class="algorithm.initialisation.ClonedPopulationInitialisationStrategy" > entityNumber="40"> - <entityType class="boa.bee.WorkerBee"/> > - </initialisationStrategy> > - <addStoppingCondition class="stoppingcondition.MaximumIterations" > maximumIterations="1000"> - </addStoppingCondition> > - <dancingSelectionStrategy > class="entity.operators.selection.RouletteWheelSelectionStrategy"/> - > <workerBeePercentage class="controlparameter.ConstantControlParameter" > parameter="0.5"/> - <forageLimit > class="controlparameter.ConstantControlParameter" parameter="500"/> - > <explorerBeeUpdateLimit class="controlparameter.ConstantControlParameter" > parameter="1"/> - </algorithm> > - <algorithm id="pso" class="pso.PSO"> > - <addStoppingCondition class="stoppingcondition.MaximumIterations" > maximumIterations="1000"> - </addStoppingCondition> > - </algorithm> > - </algorithms> > - <problems> > - <problem id="spherical" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.unconstrained.Spherical"/> > - </problem> > - <problem id="rosenbrock" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.unconstrained.Rosenbrock"/> > - </problem> > - <problem id="rastrigin" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.unconstrained.Rastrigin"/> > - </problem> > - <problem id="griewank" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.unconstrained.Griewank"/> > - </problem> > - <problem id="quadric" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.Quadric"/> > - </problem> > - <problem id="michalewicz" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.unconstrained.Michalewicz"/> > - </problem> > - <problem id="hyperellipsoid" > class="problem.FunctionMinimisationProblem"> - <function > class="functions.continuous.HyperEllipsoid"/> > - </problem> > - <problem id="easom" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.unconstrained.Easom"/> > - </problem> > - <problem id="colville" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.Colville"/> > - </problem> > - <problem id="bohachevsky1" > class="problem.FunctionMinimisationProblem"> - <function > class="functions.continuous.unconstrained.Bohachevsky1"/> - </problem> > - <problem id="ackley" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.unconstrained.Ackley"/> > - </problem> > - <problem id="schwefel" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.Schwefel"/> > - </problem> > - </problems> > - <measurements id="fitness" class="simulator.MeasurementSuite" > resolution="10" samples="30"> - <addMeasurement > class="measurement.single.Fitness"/> > - </measurements> > - <simulations> > - <simulation> > - <algorithm idref="abc"/> > - <problem idref="spherical"/> > - <measurements idref="fitness" file="data/test/abc_rastrigin.txt"/> > - </simulation> > - <simulation> > - <algorithm idref="abc"/> > - <problem idref="griewank"/> > - <measurements idref="fitness" file="data/test/abc_griewank.txt"/> > - </simulation> > - <!--<simulation> > - <algorithm idref="abc"/> > - <problem idref="rastrigin"/> > - <measurements idref="fitness" > file="data/test/abc_rastrigin.txt"/> - </simulation> > - <simulation> > - <algorithm idref="abc"/> > - <problem idref="rosenbrock"/> > - <measurements idref="fitness" > file="data/test/abc_rosenbrock.txt"/> - </simulation>--> > - </simulations> > + <algorithms> > + <algorithm id="abc" class="boa.ABC"> > + <initialisationStrategy > class="algorithm.initialisation.ClonedPopulationInitialisationStrategy" > entityNumber="40"> + <entityType class="boa.bee.WorkerBee"/> > + </initialisationStrategy> > + <addStoppingCondition > class="stoppingcondition.MaximumIterations" maximumIterations="1000"> + > </addStoppingCondition> > + <dancingSelectionStrategy > class="entity.operators.selection.RouletteWheelSelectionStrategy"/> + > <workerBeePercentage class="controlparameter.ConstantControlParameter" > parameter="0.5"/> + <forageLimit > class="controlparameter.ConstantControlParameter" parameter="500"/> + > <explorerBeeUpdateLimit > class="controlparameter.ConstantControlParameter" parameter="1"/> + > </algorithm> > + <algorithm id="pso" class="pso.PSO"> > + <addStoppingCondition > class="stoppingcondition.MaximumIterations" maximumIterations="1000"> + > </addStoppingCondition> > + </algorithm> > + </algorithms> > + <problems> > + <problem id="spherical" > class="problem.FunctionMinimisationProblem"> + <function > class="functions.continuous.unconstrained.Spherical"/> + </problem> > + <problem id="rosenbrock" > class="problem.FunctionMinimisationProblem"> + <function > class="functions.continuous.unconstrained.Rosenbrock"/> + </problem> > + <problem id="rastrigin" > class="problem.FunctionMinimisationProblem"> + <function > class="functions.continuous.unconstrained.Rastrigin"/> + </problem> > + <problem id="griewank" > class="problem.FunctionMinimisationProblem"> + <function > class="functions.continuous.unconstrained.Griewank"/> + </problem> > + </problems> > + <measurements id="fitness" class="simulator.MeasurementSuite" > resolution="10" samples="10"> + <addMeasurement > class="measurement.single.Fitness"/> > + </measurements> > + <simulations> > + <simulation> > + <algorithm idref="abc"/> > + <problem idref="spherical"/> > + <measurements idref="fitness" file="data/abc_spherical.txt"/> > + </simulation> > + <simulation> > + <algorithm idref="abc"/> > + <problem idref="griewank"/> > + <measurements idref="fitness" file="data/abc_griewank.txt"/> > + </simulation> > + <simulation> > + <algorithm idref="abc"/> > + <problem idref="rastrigin"/> > + <measurements idref="fitness" file="data/abc_rastrigin.txt"/> > + </simulation> > + <simulation> > + <algorithm idref="abc"/> > + <problem idref="rosenbrock"/> > + <measurements idref="fitness" file="data/abc_rosenbrock.txt"/> > + </simulation> > + </simulations> > </simulator> |