From: Gary P. <gpa...@gm...> - 2009-07-20 10:18:55
|
Hi, I agree with a lot in this patch, but the changes to the selection class just need to be massaged a little. One thing to take into consideration is that the random selection that needs to take place within the RandCreationStrategy requires that the selected entities should be unique, as in: i1 != i2 != i3 Maybe something like: Selection.from(list).unique().random(4) ? Also, I think that the manner in which the difference vectors are calculated should be changed a little. Having a private member in the class is very restrictive. Regards, Gary On Friday 17 July 2009 15:39:52 leo...@gm... wrote: > From: Leo Langenhoven <lla...@cs...> > > Please note: This patch replaces the previous Rand-to-best patch. > > Made some members of RandCreationStrategy protected, since Rand-to-Best > inherets from it. > Added a setScaleParameter method to RandCreationStrategy so that the > parameter can be set in the xml file. > Added new functionality to the Selection class: > 1. Added a exclusion method that accepts a list of entities. This method > will remove all elements from the Selection that exist in the exclusion > list. > 2. Added a random method and an overload that accepts a size parameter. > This method will randomly select elements from the current Selection. > > Refactored the RandomCreation class so that it will use the selection > interface in order to select entities when calculating the distance > vector. > > Test cases for the new functionality is also included. > --- > .../operators/creation/RandCreationStrategy.java | 52 ++++------ > .../creation/RandToBestCreationStrategy.java | 105 > ++++++++++++++++++++ .../cilib/util/selection/Selection.java | > 39 +++++++ .../cilib/util/selection/SelectionSyntax.java | 7 ++ > .../operators/creation/RandToBestCreationTest.java | 88 ++++++++++++++++ > .../cilib/util/selection/SelectionTest.java | 11 ++ > 6 files changed, 269 insertions(+), 33 deletions(-) > create mode 100644 > src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestCre >ationStrategy.java create mode 100644 > src/test/java/net/sourceforge/cilib/entity/operators/creation/RandToBestCre >ationTest.java > > diff --git > a/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreatio >nStrategy.java > b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreatio >nStrategy.java index 722a7de..59cd174 100644 > --- > a/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreatio >nStrategy.java +++ > b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreatio >nStrategy.java @@ -21,7 +21,7 @@ > */ > package net.sourceforge.cilib.entity.operators.creation; > > -import java.util.ArrayList; > +import java.util.Arrays; > import java.util.Iterator; > import java.util.List; > > @@ -29,24 +29,25 @@ import > net.sourceforge.cilib.controlparameter.ConstantControlParameter; import > net.sourceforge.cilib.controlparameter.ControlParameter; > import net.sourceforge.cilib.entity.Entity; > import net.sourceforge.cilib.entity.Topology; > -import > net.sourceforge.cilib.entity.operators.selection.RandomSelectionStrategy; > -import net.sourceforge.cilib.entity.operators.selection.SelectionStrategy; > import net.sourceforge.cilib.entity.topologies.TopologyHolder; > +import net.sourceforge.cilib.math.random.generator.MersenneTwister; > +import net.sourceforge.cilib.math.random.generator.Random; > import net.sourceforge.cilib.type.types.Real; > import net.sourceforge.cilib.type.types.container.Vector; > +import net.sourceforge.cilib.util.selection.Selection; > > public class RandCreationStrategy implements CreationStrategy { > private static final long serialVersionUID = 930740770470361009L; > > - private ControlParameter scaleParameter; > - private ControlParameter numberOfDifferenceVectors; > + protected ControlParameter scaleParameter; > + protected ControlParameter numberOfDifferenceVectors; > > /** > * Create a new instance of {@code CurrentToRandCreationStrategy}. > */ > public RandCreationStrategy() { > this.scaleParameter = new ConstantControlParameter(0.5); > - this.numberOfDifferenceVectors = new ConstantControlParameter(1); > + this.numberOfDifferenceVectors = new ConstantControlParameter(2); > } > > /** > @@ -72,7 +73,8 @@ public class RandCreationStrategy implements > CreationStrategy { */ > @Override > public Entity create(Entity targetEntity, Entity current, Topology<? > extends Entity> topology) { - List<Entity> participants = > selectEntities(current, topology); + Random random = new > MersenneTwister(); > + List<Entity> participants = > Selection.from(topology.asList()).exclude(Arrays.asList(targetEntity, > current)).random(random, > (int)numberOfDifferenceVectors.getParameter()).select(); Vector > differenceVector = determineDistanceVector(participants); > > Vector targetVector = (Vector) > targetEntity.getCandidateSolution(); @@ -92,7 +94,7 @@ public class > RandCreationStrategy implements CreationStrategy { * reduce the > diversity of the population as not all entities will be considered. * > @return A {@linkplain Vector} representing the resultant of all calculated > difference vectors. */ > - private Vector determineDistanceVector(List<Entity> participants) { > + protected Vector determineDistanceVector(List<Entity> participants) { > Vector distanceVector = new > Vector(participants.get(0).getCandidateSolution().size(), new Real(0.0)); > Iterator<Entity> iterator = participants.iterator(); > > @@ -108,31 +110,6 @@ public class RandCreationStrategy implements > CreationStrategy { } > > /** > - * This private method implements the "y" part of the DE/x/y/z > structure. - * @param current The current {@linkplain Entity} in the > {@linkplain Topology} - * @param topology The current population. > - * @return {@linkplain List} containing the entities to be used in the > calculation of - * the difference vectors. > - */ > - private List<Entity> selectEntities(Entity current, Topology<? extends > Entity> topology) { - SelectionStrategy randomSelectionStrategy = > new RandomSelectionStrategy(); - List<Entity> participants = new > ArrayList<Entity>(); > - > - int total = 2 * > Double.valueOf(this.numberOfDifferenceVectors.getParameter()).intValue(); - > - while (participants.size() < total) { > - Entity entity = randomSelectionStrategy.select(topology); > - > - if (participants.contains(entity)) continue; > - if (current == entity) continue; > - > - participants.add(entity); > - } > - > - return participants; > - } > - > - /** > * {@inheritDoc} > */ > @Override > @@ -140,5 +117,14 @@ public class RandCreationStrategy implements > CreationStrategy { throw new UnsupportedOperationException("Not supported > yet. This may need some more refactoring. May require looping operator?"); > } > > + public void setScaleParameter(ControlParameter scaleParameter) { > + this.scaleParameter = scaleParameter; > + } > + > + public void setNumberOfDifferenceVectors( > + ControlParameter numberOfDifferenceVectors) { > + this.numberOfDifferenceVectors = numberOfDifferenceVectors; > + } > + > > } > diff --git > a/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestC >reationStrategy.java > b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestC >reationStrategy.java new file mode 100644 > index 0000000..7797796 > --- /dev/null > +++ > b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestC >reationStrategy.java @@ -0,0 +1,105 @@ > +/** > + * Copyright (C) 2003 - 2009 > + * Computational Intelligence Research Group (CIRG@UP) > + * Department of Computer Science > + * University of Pretoria > + * South Africa > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 > USA + */ > +/** > + * > + */ > +package net.sourceforge.cilib.entity.operators.creation; > + > +import java.util.Arrays; > +import java.util.List; > + > +import net.sourceforge.cilib.controlparameter.ConstantControlParameter; > +import net.sourceforge.cilib.controlparameter.ControlParameter; > +import net.sourceforge.cilib.entity.Entity; > +import net.sourceforge.cilib.entity.Topology; > +import net.sourceforge.cilib.entity.topologies.TopologyHolder; > +import net.sourceforge.cilib.math.random.generator.MersenneTwister; > +import net.sourceforge.cilib.math.random.generator.Random; > +import net.sourceforge.cilib.type.types.container.Vector; > +import net.sourceforge.cilib.util.selection.Selection; > + > +/** > + * @author leo > + * This is an implimentation of the Rand-to-best DE target creation > strategy. This implimentation is simply an extension of the {@linkplain > RandCreationStrategy} that also includes the best {@linkplain Entity}'s > solution vector. The influence of the best vector and the + * random vector > is determined by the greedynessParameter, which is sampled as E [0,1]. A > value of 0 will ignore the contribution of the best {@linkplain Entity}, > and a + * value of 1 will ignore the controbution of the random {@linkplain > Entity}. + */ > +public class RandToBestCreationStrategy extends RandCreationStrategy { > + private static final long serialVersionUID = 413628791093573875L; > + private ControlParameter greedynessParameter; > + /** > + * Create a new instance of {@code RandToBestCreationStrategy}. > + */ > + public RandToBestCreationStrategy() { > + super(); > + greedynessParameter = new ConstantControlParameter(0.5); > + } > + /** > + * Copy constructor. Create a copy of the provided instance. > + * @param copy The instance to copy. > + */ > + public RandToBestCreationStrategy(RandToBestCreationStrategy other) { > + super(other); > + greedynessParameter = other.greedynessParameter.getClone(); > + } > + > + /** > + * {@inheritDoc} > + */ > + public Entity create(Entity targetEntity, Entity current, > + Topology<? extends Entity> topology) { > + Entity bestEntity = topology.getBestEntity(); > + Random random = new MersenneTwister(); > + List<Entity> participants = > Selection.from(topology.asList()).exclude(Arrays.asList(targetEntity, > bestEntity, current)).random(random, > (int)numberOfDifferenceVectors.getParameter()).select(); + Vector > differenceVector = determineDistanceVector(participants); + > + Vector targetVector = ((Vector) > targetEntity.getCandidateSolution()).multiply(1 - > greedynessParameter.getParameter()); + Vector bestVector = > ((Vector) > bestEntity.getCandidateSolution()).multiply(greedynessParameter.getParamete >r()); + > + Vector trialVector = > bestVector.plus(targetVector.plus(differenceVector.multiply(scaleParameter. >getParameter()))); + > + Entity trialEntity = current.getClone(); > + trialEntity.setCandidateSolution(trialVector); > + > + return trialEntity; > + } > + > + /** > + * {@inheritDoc} > + */ > + public RandToBestCreationStrategy getClone() { > + return new RandToBestCreationStrategy(this); > + } > + > + /** > + * {@inheritDoc} > + */ > + @Override > + public void performOperation(TopologyHolder holder) { > + throw new UnsupportedOperationException("Not supported yet. This > may need some more refactoring. May require looping operator?"); + } > + > + public void setGreedynessParameter(ControlParameter greedynessParameter) > { + this.greedynessParameter = greedynessParameter; > + } > + > +} > diff --git > a/src/main/java/net/sourceforge/cilib/util/selection/Selection.java > b/src/main/java/net/sourceforge/cilib/util/selection/Selection.java index > 29c069b..6b01214 100644 > --- a/src/main/java/net/sourceforge/cilib/util/selection/Selection.java > +++ b/src/main/java/net/sourceforge/cilib/util/selection/Selection.java > @@ -249,7 +249,46 @@ public final class Selection<E> implements > SelectionSyntax<E> { @Override > public List<Selection.Entry<E>> entries() { > return this.elements; > + } > + > + /** > + * Remove any {@code Entry}'s from {@code elements} that are also > contained in {@code exclusion}. + * @return A selection containing the > remaining elements which do not occur in {@code exclusion}. + */ > + @Override > + public Selection<E> exclude(List<? extends E> exclusion) { > + for(int i = elements.size() - 1; i >= 0; --i){ > + Entry element = elements.get(i); > + if(exclusion.contains(element.getElement())) > + elements.remove(element); > + } > + return this; > + } > + > + /** > + * Obtain a random element from the current Selection. > + * @param random The random number to be used in the selection. > + * @return A selection containing a random element from the original > {@code elements} member. + */ > + @Override > + public SelectionSyntax<E> random(Random random) { > + Entry<E> randomEntry = Selection.randomFrom(elements, random); > + elements.clear(); > + elements.add(randomEntry); > + return this; > } > + > + /** > + * Obtain a random number of elements from the current Selection. > + * @param random The random number to be used in the selection. > + * @param number The number of elements to select. > + * @return A selection containing the random elements from the > original {@code elements} member. + */ > + @Override > + public SelectionSyntax<E> random(Random random, int number) { > + elements = Selection.randomFrom(elements, random, number); > + return this; > + } > > /** > * This class provides the notion of an entry within a list > diff --git > a/src/main/java/net/sourceforge/cilib/util/selection/SelectionSyntax.java > b/src/main/java/net/sourceforge/cilib/util/selection/SelectionSyntax.java > index 9cd9ea2..2680d4b 100644 > --- > a/src/main/java/net/sourceforge/cilib/util/selection/SelectionSyntax.java > +++ > b/src/main/java/net/sourceforge/cilib/util/selection/SelectionSyntax.java > @@ -22,6 +22,7 @@ > package net.sourceforge.cilib.util.selection; > > import java.util.List; > +import net.sourceforge.cilib.math.random.generator.Random; > import net.sourceforge.cilib.util.selection.ordering.Ordering; > import net.sourceforge.cilib.util.selection.weighing.Weighing; > > @@ -42,6 +43,12 @@ public interface SelectionSyntax<E> { > public SelectionSyntax<E> last(); > > public SelectionSyntax<E> last(int number); > + > + public SelectionSyntax<E> exclude(List<? extends E> exclusion); > + > + public SelectionSyntax<E> random(Random random); > + > + public SelectionSyntax<E> random(Random random, int number); > > public List<E> select(); > > diff --git > a/src/test/java/net/sourceforge/cilib/entity/operators/creation/RandToBestC >reationTest.java > b/src/test/java/net/sourceforge/cilib/entity/operators/creation/RandToBestC >reationTest.java new file mode 100644 > index 0000000..f749f88 > --- /dev/null > +++ > b/src/test/java/net/sourceforge/cilib/entity/operators/creation/RandToBestC >reationTest.java @@ -0,0 +1,88 @@ > +/** > + * Copyright (C) 2003 - 2009 > + * Computational Intelligence Research Group (CIRG@UP) > + * Department of Computer Science > + * University of Pretoria > + * South Africa > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 > USA + */ > +/** > + * > + */ > +package net.sourceforge.cilib.entity.operators.creation; > + > +import static org.hamcrest.CoreMatchers.is; > +import net.sourceforge.cilib.ec.Individual; > +import net.sourceforge.cilib.entity.Entity; > +import net.sourceforge.cilib.entity.EntityType; > +import net.sourceforge.cilib.entity.Topology; > +import net.sourceforge.cilib.entity.topologies.GBestTopology; > +import net.sourceforge.cilib.math.random.generator.SeedSelectionStrategy; > +import net.sourceforge.cilib.math.random.generator.Seeder; > +import net.sourceforge.cilib.math.random.generator.ZeroSeederStrategy; > +import net.sourceforge.cilib.problem.MinimisationFitness; > +import net.sourceforge.cilib.type.types.Real; > +import net.sourceforge.cilib.type.types.container.Vector; > + > +import org.junit.Assert; > +import org.junit.Test; > + > +/** > + * @author leo > + * > + */ > +public class RandToBestCreationTest { > + > + @Test > + public void randToBestCreationTest(){ > + SeedSelectionStrategy seedStrategy = Seeder.getSeederStrategy(); > + Seeder.setSeederStrategy(new ZeroSeederStrategy()); > + > + try { > + > + RandToBestCreationStrategy creation = new RandToBestCreationStrategy(); > + Topology<Individual> testTopology = new GBestTopology<Individual>(); > + > + Entity current = new Individual(); > + Entity entityBest = new Individual(); > + Entity entityRandom = new Individual(); > + Entity entity1 = new Individual(); > + Entity entity2 = new Individual(); > + > + testTopology.add((Individual)current); > + testTopology.add((Individual)entityBest); > + testTopology.add((Individual)entityRandom); > + testTopology.add((Individual)entity1); > + testTopology.add((Individual)entity2); > + > + entityBest.getProperties().put(EntityType.FITNESS, new > MinimisationFitness(0.0)); + > entityBest.getProperties().put(EntityType.CANDIDATE_SOLUTION, new Vector(1, > new Real(0.1))); + > entityRandom.getProperties().put(EntityType.FITNESS, new > MinimisationFitness(1.0)); + > entityRandom.getProperties().put(EntityType.CANDIDATE_SOLUTION, new > Vector(1, new Real(0.2))); + > entity1.getProperties().put(EntityType.FITNESS, new > MinimisationFitness(2.0)); + > entity1.getProperties().put(EntityType.CANDIDATE_SOLUTION, new Vector(1, > new Real(0.3))); + entity2.getProperties().put(EntityType.FITNESS, > new MinimisationFitness(3.0)); + > entity2.getProperties().put(EntityType.CANDIDATE_SOLUTION, new Vector(1, > new Real(0.4))); + > + Entity resultEntity = creation.create(entityRandom, current, > testTopology); + > + Assert.assertThat((Double)((Vector)resultEntity.getCandidateSolution()) >.get(0).getReal(), is(0.2)); + } finally { > + Seeder.setSeederStrategy(seedStrategy); > + } > + } > + > +} > diff --git > a/src/test/java/net/sourceforge/cilib/util/selection/SelectionTest.java > b/src/test/java/net/sourceforge/cilib/util/selection/SelectionTest.java > index 60fce8c..476ed37 100644 > --- a/src/test/java/net/sourceforge/cilib/util/selection/SelectionTest.java > +++ b/src/test/java/net/sourceforge/cilib/util/selection/SelectionTest.java > @@ -61,4 +61,15 @@ public class SelectionTest { > Assert.assertEquals(1, selection.get(0).intValue()); > Assert.assertEquals(1, selection.size()); > } > + > + @Test > + public void exclusionSelection(){ > + List<Integer> elements = Arrays.asList(1, 2, 3, 4, 5, 6, 7); > + List<Integer> exlusionElements = Arrays.asList(1, 2, 4, 6); > + List<Integer> selection = > Selection.from(elements).exclude(exlusionElements).first(3).select(); + > Assert.assertEquals(3, selection.size()); > + Assert.assertEquals(3, selection.get(0).intValue()); > + Assert.assertEquals(5, selection.get(1).intValue()); > + Assert.assertEquals(7, selection.get(2).intValue()); > + } > } |