You can subscribe to this list here.
2003 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(2) |
Sep
(7) |
Oct
(1) |
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2004 |
Jan
(13) |
Feb
(17) |
Mar
(5) |
Apr
(10) |
May
(10) |
Jun
(42) |
Jul
(23) |
Aug
(38) |
Sep
(12) |
Oct
(9) |
Nov
(6) |
Dec
|
2005 |
Jan
(3) |
Feb
(17) |
Mar
(6) |
Apr
|
May
(1) |
Jun
(10) |
Jul
|
Aug
(10) |
Sep
|
Oct
(8) |
Nov
(2) |
Dec
(2) |
2006 |
Jan
(2) |
Feb
(11) |
Mar
(44) |
Apr
(84) |
May
(120) |
Jun
(18) |
Jul
|
Aug
(12) |
Sep
(19) |
Oct
(22) |
Nov
(7) |
Dec
(11) |
2007 |
Jan
(6) |
Feb
(10) |
Mar
(24) |
Apr
(13) |
May
(46) |
Jun
(25) |
Jul
(46) |
Aug
(47) |
Sep
(60) |
Oct
(61) |
Nov
(138) |
Dec
(47) |
2008 |
Jan
(6) |
Feb
(23) |
Mar
(58) |
Apr
(78) |
May
(82) |
Jun
(34) |
Jul
(56) |
Aug
(59) |
Sep
(54) |
Oct
(127) |
Nov
(47) |
Dec
(33) |
2009 |
Jan
(16) |
Feb
(18) |
Mar
(37) |
Apr
(162) |
May
(49) |
Jun
(58) |
Jul
(59) |
Aug
(17) |
Sep
(10) |
Oct
|
Nov
|
Dec
|
From: Theuns C. <the...@gm...> - 2009-07-17 13:42:45
|
Second! -- Theuns On Fri, Jul 17, 2009 at 3:38 PM, Gary Pampara<gpa...@gm...> wrote: > Hi all, > > I would like to propose the addition of google-collections as a dependency of > CIlib. The additional functionality would be really useful. > > Regards, > Gary |
From: <leo...@gm...> - 2009-07-17 13:40:05
|
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/RandToBestCreationStrategy.java create mode 100644 src/test/java/net/sourceforge/cilib/entity/operators/creation/RandToBestCreationTest.java diff --git a/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreationStrategy.java b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreationStrategy.java index 722a7de..59cd174 100644 --- a/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreationStrategy.java +++ b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreationStrategy.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/RandToBestCreationStrategy.java b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestCreationStrategy.java new file mode 100644 index 0000000..7797796 --- /dev/null +++ b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestCreationStrategy.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.getParameter()); + + 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/RandToBestCreationTest.java b/src/test/java/net/sourceforge/cilib/entity/operators/creation/RandToBestCreationTest.java new file mode 100644 index 0000000..f749f88 --- /dev/null +++ b/src/test/java/net/sourceforge/cilib/entity/operators/creation/RandToBestCreationTest.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()); + } } -- 1.5.4.3 |
From: Gary P. <gpa...@gm...> - 2009-07-17 13:38:50
|
Hi all, I would like to propose the addition of google-collections as a dependency of CIlib. The additional functionality would be really useful. Regards, Gary |
From: Theuns C. <the...@gm...> - 2009-07-17 12:18:02
|
Agreed, if we decide to always increment the counter, then nobody will wonder about it again. -- Theuns On Thu, Jul 16, 2009 at 10:21 AM, Gary Pampara<gpa...@gm...> wrote: > +1 for this change. > > I agree with the proposed. > > I think that even within a dynamic environment it makes sense. You are > responding to a change, but the amount of work that is required to reevaluate > the current candidate solution is still a fitness evaluation and should result > in an increment of the counter. > > I've never particularly liked the overloaded method with the boolean > parameter. Yes, agreed, it makes the API ambiguous and we should sort it out. > > Regards, > Gary > > On Thursday 16 July 2009 10:11:08 Leo Langenhoven wrote: >> Hi all, >> >> as you know using the number of fitness evaluations as a stopping criteria >> is a common strategy. There is, however, some ambiguity with regards to >> counting these evaluations in the current implementation. If we ignore the >> OptimisationProblemAdapter class for the time being, and focus on the issue >> from the perspective of Entities, then there are currently three methods >> with which you can receive a Fitness value. The first method is getFitness, >> which simply returns the Entity's stored fitness value. The second method >> is calculateFitness (without parameters), which calculates the fitness for >> the Entity's candidate solution, incriments the number of evaluations for >> the problem, stores the new fitness and returns it. The third method is >> calculateFitness that receives a flag which indicates wheather or not the >> number of fitness evaluations should be increased. I propose that we remove >> (or make the method private) the calculateFitness method that receives the >> flag parameter, since this method introduces room for error with regards to >> the number of fitness evaluations performed. >> >> If the flag is removed, it implies that every time an Entity's solution >> vector is evaluated on the current problem, the number of fitness >> evaluations will be incremented. Is this correct in all circumstances? What >> about dynamic environments, when a same solution vector (that has already >> received a fitness value) needs to be evaluated on the current state of the >> environment, should that count as a unique fitness evaluation? Are there >> any other situations, when you need to calculate a fitness value, where the >> number of evaluations for the algorithm shouldn't be incremented? >> >> If we can standardise the approach so that every evaluation will increase >> the counter, then we know the number of fitness evaluations as a stopping >> condition is correct. And we have decided on the issue from the Entity >> perspective, we can look at it from the Problem perspective. >> >> Regards > > ------------------------------------------------------------------------------ > Enter the BlackBerry Developer Challenge > This is your chance to win up to $100,000 in prizes! For a limited time, > vendors submitting new applications to BlackBerry App World(TM) will have > the opportunity to enter the BlackBerry Developer Challenge. See full prize > details at: http://p.sf.net/sfu/Challenge > _______________________________________________ > cilib-devel mailing list > cil...@li... > https://lists.sourceforge.net/lists/listinfo/cilib-devel > |
From: Gary P. <gpa...@gm...> - 2009-07-16 13:23:15
|
Also, we will need a unit test to prove that this works. Leo, please create a test for this class and submit the patch. The code looks fine, but we will need a test for this. Regards, Gary |
From: Gary P. <gpa...@gm...> - 2009-07-16 13:09:27
|
Cool, thanks :) I wonder if the privates in the current RandCreationStrategy should be moved into a util class of sorts? I see the typo for greediness :P no worries will fix that later. On Thursday 16 July 2009 14:51:59 leo...@gm... wrote: > public Entity create(Entity targetEntity, Entity current, |
From: <leo...@gm...> - 2009-07-16 12:52:14
|
From: Leo Langenhoven <lla...@cs...> 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 --- .../operators/creation/RandCreationStrategy.java | 10 ++- .../creation/RandToBestCreationStrategy.java | 99 ++++++++++++++++++++ 2 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestCreationStrategy.java diff --git a/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreationStrategy.java b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreationStrategy.java index 722a7de..99e176a 100644 --- a/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreationStrategy.java +++ b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreationStrategy.java @@ -38,7 +38,7 @@ import net.sourceforge.cilib.type.types.container.Vector; public class RandCreationStrategy implements CreationStrategy { private static final long serialVersionUID = 930740770470361009L; - private ControlParameter scaleParameter; + protected ControlParameter scaleParameter; private ControlParameter numberOfDifferenceVectors; /** @@ -92,7 +92,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(); @@ -114,7 +114,7 @@ public class RandCreationStrategy implements CreationStrategy { * @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) { + protected List<Entity> selectEntities(Entity current, Topology<? extends Entity> topology) { SelectionStrategy randomSelectionStrategy = new RandomSelectionStrategy(); List<Entity> participants = new ArrayList<Entity>(); @@ -140,5 +140,9 @@ 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; + } + } diff --git a/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestCreationStrategy.java b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestCreationStrategy.java new file mode 100644 index 0000000..9eee5f9 --- /dev/null +++ b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestCreationStrategy.java @@ -0,0 +1,99 @@ +/** + * 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.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.type.types.container.Vector; + +/** + * @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) { + List<Entity> participants = selectEntities(current, topology); + Vector differenceVector = determineDistanceVector(participants); + + Vector targetVector = ((Vector) targetEntity.getCandidateSolution()).multiply(1 - greedynessParameter.getParameter()); + Vector bestVector = ((Vector) topology.getBestEntity().getCandidateSolution()).multiply(greedynessParameter.getParameter()); + + 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; + } + +} -- 1.5.4.3 |
From: Gary P. <gpa...@gm...> - 2009-07-16 08:21:29
|
+1 for this change. I agree with the proposed. I think that even within a dynamic environment it makes sense. You are responding to a change, but the amount of work that is required to reevaluate the current candidate solution is still a fitness evaluation and should result in an increment of the counter. I've never particularly liked the overloaded method with the boolean parameter. Yes, agreed, it makes the API ambiguous and we should sort it out. Regards, Gary On Thursday 16 July 2009 10:11:08 Leo Langenhoven wrote: > Hi all, > > as you know using the number of fitness evaluations as a stopping criteria > is a common strategy. There is, however, some ambiguity with regards to > counting these evaluations in the current implementation. If we ignore the > OptimisationProblemAdapter class for the time being, and focus on the issue > from the perspective of Entities, then there are currently three methods > with which you can receive a Fitness value. The first method is getFitness, > which simply returns the Entity's stored fitness value. The second method > is calculateFitness (without parameters), which calculates the fitness for > the Entity's candidate solution, incriments the number of evaluations for > the problem, stores the new fitness and returns it. The third method is > calculateFitness that receives a flag which indicates wheather or not the > number of fitness evaluations should be increased. I propose that we remove > (or make the method private) the calculateFitness method that receives the > flag parameter, since this method introduces room for error with regards to > the number of fitness evaluations performed. > > If the flag is removed, it implies that every time an Entity's solution > vector is evaluated on the current problem, the number of fitness > evaluations will be incremented. Is this correct in all circumstances? What > about dynamic environments, when a same solution vector (that has already > received a fitness value) needs to be evaluated on the current state of the > environment, should that count as a unique fitness evaluation? Are there > any other situations, when you need to calculate a fitness value, where the > number of evaluations for the algorithm shouldn't be incremented? > > If we can standardise the approach so that every evaluation will increase > the counter, then we know the number of fitness evaluations as a stopping > condition is correct. And we have decided on the issue from the Entity > perspective, we can look at it from the Problem perspective. > > Regards |
From: Leo L. <leo...@gm...> - 2009-07-16 08:11:16
|
Hi all, as you know using the number of fitness evaluations as a stopping criteria is a common strategy. There is, however, some ambiguity with regards to counting these evaluations in the current implementation. If we ignore the OptimisationProblemAdapter class for the time being, and focus on the issue from the perspective of Entities, then there are currently three methods with which you can receive a Fitness value. The first method is getFitness, which simply returns the Entity's stored fitness value. The second method is calculateFitness (without parameters), which calculates the fitness for the Entity's candidate solution, incriments the number of evaluations for the problem, stores the new fitness and returns it. The third method is calculateFitness that receives a flag which indicates wheather or not the number of fitness evaluations should be increased. I propose that we remove (or make the method private) the calculateFitness method that receives the flag parameter, since this method introduces room for error with regards to the number of fitness evaluations performed. If the flag is removed, it implies that every time an Entity's solution vector is evaluated on the current problem, the number of fitness evaluations will be incremented. Is this correct in all circumstances? What about dynamic environments, when a same solution vector (that has already received a fitness value) needs to be evaluated on the current state of the environment, should that count as a unique fitness evaluation? Are there any other situations, when you need to calculate a fitness value, where the number of evaluations for the algorithm shouldn't be incremented? If we can standardise the approach so that every evaluation will increase the counter, then we know the number of fitness evaluations as a stopping condition is correct. And we have decided on the issue from the Entity perspective, we can look at it from the Problem perspective. Regards |
From: Gary P. <gpa...@gm...> - 2009-07-15 13:55:34
|
Thanks Andrich. The patch looks much better. I've applied the patch and merged it into next. Regards, Gary On Wednesday 15 July 2009 13:24:14 Andrich van Wyk wrote: > Corrected the ConstrictionVelocityUpdate: The constriction coefficient has > to be calculated only once during the course of the algorithm (as opposed > to every time it is used) similar to inertia. The calculation also uses c1 > and c2 WITHOUT the randomization of r1 and r2. Resulting implementation > delivers good results that are very similar to those reported by reference > papers. --- > .../ConstrictionVelocityUpdate.java | 112 > +++++++++++--------- .../ConstrictionVelocityUpdateTest.java | > 76 ++++++++++---- xml/constrictionPSO.xml | 24 > +++-- > 3 files changed, 134 insertions(+), 78 deletions(-) > > diff --git > a/src/main/java/net/sourceforge/cilib/pso/velocityupdatestrategies/Constric >tionVelocityUpdate.java > b/src/main/java/net/sourceforge/cilib/pso/velocityupdatestrategies/Constric >tionVelocityUpdate.java index 86b0e4c..54542bf 100644 > --- > a/src/main/java/net/sourceforge/cilib/pso/velocityupdatestrategies/Constric >tionVelocityUpdate.java +++ > b/src/main/java/net/sourceforge/cilib/pso/velocityupdatestrategies/Constric >tionVelocityUpdate.java @@ -29,33 +29,28 @@ import > net.sourceforge.cilib.type.types.container.Vector; > > /** > * A velocity update strategy that utilizes the constriction coefficient > as - * developed by Clerc. > + * developed by M. Clerc. > * <p>References: > * <ul> > * <li> > * <pre> > -{@literal @}INPROCEEDINGS{785513, > -title={The swarm and the queen: towards a deterministic and adaptive > particle swarm optimization}, -author={Clerc, M.}, > -booktitle={Evolutionary Computation, 1999. CEC 99. Proceedings of the 1999 > Congress on}, -year={1999}, > +{@literal @}@INPROCEEDINGS{870279, > +title={Comparing inertia weights and constriction factors in particle > swarm optimization}, +author={Eberhart, R.C. and Shi, Y.}, > +booktitle={Evolutionary Computation, 2000. Proceedings of the 2000 > Congress on}, +year={2000}, > month={}, > -volume={3}, > +volume={1}, > number={}, > -pages={-1957 Vol. 3}, > -abstract={A very simple particle swarm optimization iterative algorithm is > presented, with just -one equation and one social/confidence parameter. We > define a âno-hopeâ convergence criterion and -a ârehopeâ method so > that, from time to time, the swarm re-initializes its position, according > to -some gradient estimations of the objective function and to the previous > re-initialization (it means -it has a kind of very rudimentary memory). We > then study two different cases, a quite âeasyâ one -(the Alpine > function) and a âdifficultâ one (the Banana function), but both just in > dimension two. -The process is improved by taking into account the swarm > gravity center (the âqueenâ) and the results -are good enough so that > it is certainly worthwhile trying the method on more complex problems}, > -keywords={adaptive systems, deterministic algorithms, evolutionary > computation, iterative methodsAlpine function, -Banana function, adaptive > particle swarm optimization, gradient estimations, no-hope convergence > criterion, -objective function, queen, re-initialization, rehope method, > rudimentary memory, simple particle swarm -optimization iterative > algorithm, social/confidence parameter, swarm gravity center}, > -doi={10.1109/CEC.1999.785513}, > +pages={84-88 vol.1}, > +abstract={The performance of particle swarm optimization using an inertia > weight is compared +with performance using a constriction factor. Five > benchmark functions are used for the +comparison. It is concluded that the > best approach is to use the constriction factor while +limiting the maximum > velocity Vmax to the dynamic range of the variable Xmax on each +dimension. > This approach provides performance on the benchmark functions superior to > any +other published results known by the authors}, > +keywords={evolutionary computationbenchmark functions, constriction > factors, inertia weights, particle swarm optimization}, > +doi={10.1109/CEC.2000.870279}, > ISSN={}, } > </pre> > * </li> > @@ -89,21 +84,22 @@ ISSN={1089-778X}, } > * </ul> > * > * <p> > - * Note, this strategy does not the inertia control parameter. > + * Note, this strategy does not use the inertia control parameter. > * Certain constraints are imposed on the other control parameters in > order to * calculate the constriction coefficient, namely: > - * $c1r1 + c2r2 \leq 4$ , and > + * $c1 + c2 \leq 4$ , and > * $\kappa \in [0, 1]$ > * > * @author andrich > */ > public class ConstrictionVelocityUpdate implements VelocityUpdateStrategy > { - private static final long serialVersionUID = -4470110903487138758L; > > + private static final long serialVersionUID = -4470110903487138758L; > private ControlParameter socialAcceleration; > private ControlParameter cognitiveAcceleration; > private ControlParameter vMax; > private ControlParameter kappa; > + private ControlParameter constrictionCoefficient; > > /** > * Default constructor. The values given to the control parameters > attempt to @@ -115,11 +111,12 @@ public class ConstrictionVelocityUpdate > implements VelocityUpdateStrategy { cognitiveAcceleration = new > RandomizingControlParameter(); vMax = new ConstantControlParameter(); > kappa = new ConstantControlParameter(); > + constrictionCoefficient = null; > > - socialAcceleration.setParameter(3.0); > - cognitiveAcceleration.setParameter(3.0); > + socialAcceleration.setParameter(2.05); > + cognitiveAcceleration.setParameter(2.05); > + kappa.setParameter(1.0); > vMax.setParameter(Double.MAX_VALUE); > - kappa.setParameter(0.1); > } > > /** > @@ -146,8 +143,10 @@ public class ConstrictionVelocityUpdate implements > VelocityUpdateStrategy { */ > @Override > public void updateVelocity(Particle particle) { > - assertAccelerationConstraints(); > - > + // lazy construction (necessary to do this after user has set c1 > and c2, and to only do it once per particle). + if > (constrictionCoefficient == null) { > + calculateConstrictionCoefficient(); > + } > Vector velocity = (Vector) particle.getVelocity(); > Vector position = (Vector) particle.getPosition(); > Vector bestPosition = (Vector) particle.getBestPosition(); > @@ -155,22 +154,9 @@ public class ConstrictionVelocityUpdate implements > VelocityUpdateStrategy { > > > for (int i = 0; i < particle.getDimension(); ++i) { > - // calculate the constriction coefficient > - double c1 = cognitiveAcceleration.getParameter(); > - double c2 = socialAcceleration.getParameter(); > - // c1r1 + c2r2 has to be greater or equal to 4 > - while ((c1 + c2) < 4) { > - c1 = cognitiveAcceleration.getParameter(); > - c2 = socialAcceleration.getParameter(); > - } > - double phi = c1 + c2; > - double constrictionCoefficient = (2 * kappa.getParameter()) / > - Math.abs(2 - phi - Math.sqrt(phi * (phi - 4.0))); > - > - double value = velocity.getReal(i) + > - (bestPosition.getReal(i) - position.getReal(i)) * c1 + > - (nBestPosition.getReal(i) - position.getReal(i)) * c2; > - value = constrictionCoefficient * value; > + double value = constrictionCoefficient.getParameter() * > (velocity.getReal(i) + + (bestPosition.getReal(i) - > position.getReal(i)) * cognitiveAcceleration.getParameter() + + > (nBestPosition.getReal(i) - position.getReal(i)) * > socialAcceleration.getParameter()); velocity.setReal(i, value); > > clamp(velocity, i); > @@ -206,17 +192,25 @@ public class ConstrictionVelocityUpdate implements > VelocityUpdateStrategy { } > > /** > - * Ensure that values of c1 and c2 make it possible to calculate the > - * constriction coefficient. > + * Calculate the constriction coefficient as well as the > + * maximum acceleration. > */ > - private void assertAccelerationConstraints() { > + private void calculateConstrictionCoefficient() { > double c1 = ((RandomizingControlParameter) > cognitiveAcceleration).getControlParameter().getParameter(); double c2 = > ((RandomizingControlParameter) > socialAcceleration).getControlParameter().getParameter(); - if (c1 + > c2 < 4) { > + > + double phi = c1 + c2; > + if (phi < 4.0) { > throw new UnsupportedOperationException("Parameter constraint > violation: " + "The sum of the Cognitive (" + c1 + ") and Social (" + c2 + > ") acceleration parameters " + "has to be greater than or equal to 4."); > } > + double chi; > + chi = (2 * kappa.getParameter()) / > + Math.abs(2 - phi - Math.sqrt(phi * (phi - 4.0))); > + > + constrictionCoefficient = new ConstantControlParameter(); > + constrictionCoefficient.setParameter(chi); > } > > /** > @@ -271,7 +265,7 @@ public class ConstrictionVelocityUpdate implements > VelocityUpdateStrategy { * Get the maximum velocity parameter. > * @return the maximum velocity {@link ControlParameter control > parameter }. */ > - public ControlParameter getVMax() { > + public ControlParameter getvMax() { > return vMax; > } > > @@ -279,7 +273,23 @@ public class ConstrictionVelocityUpdate implements > VelocityUpdateStrategy { * Set the maximum velocity parameter. > * @param vMax the new maximum velocity {@link ControlParameter > control parameter }. */ > - public void setVMax(ControlParameter vMax) { > + public void setvMax(ControlParameter vMax) { > this.vMax = vMax; > } > + > + /** > + * Gets the constriction coefficient. > + * @return the constriction coefficient {@link ControlParameter > control parameter }. + */ > + public ControlParameter getConstrictionCoefficient() { > + return constrictionCoefficient; > + } > + > + /** > + * Sets the constriction coefficient. > + * @param constrictionCoefficient the new constriction coefficient > {@link ControlParameter control parameter }. + */ > + public void setConstrictionCoefficient(ControlParameter > constrictionCoefficient) { + this.constrictionCoefficient = > constrictionCoefficient; > + } > } > diff --git > a/src/test/java/net/sourceforge/cilib/pso/velocityupdatestrategies/Constric >tionVelocityUpdateTest.java > b/src/test/java/net/sourceforge/cilib/pso/velocityupdatestrategies/Constric >tionVelocityUpdateTest.java index 45e701a..b7133f7 100644 > --- > a/src/test/java/net/sourceforge/cilib/pso/velocityupdatestrategies/Constric >tionVelocityUpdateTest.java +++ > b/src/test/java/net/sourceforge/cilib/pso/velocityupdatestrategies/Constric >tionVelocityUpdateTest.java @@ -47,6 +47,7 @@ import > org.junit.runner.RunWith; > */ > @RunWith(JMock.class) > public class ConstrictionVelocityUpdateTest { > + > private Mockery mockery = new JUnit4Mockery(); > > /** > @@ -58,25 +59,25 @@ public class ConstrictionVelocityUpdateTest { > ConstrictionVelocityUpdate copy = original.getClone(); > > Assert.assertEquals(original.getKappa().getParameter(), > copy.getKappa().getParameter(), Maths.EPSILON); - > Assert.assertEquals(original.getVMax().getParameter(), > copy.getVMax().getParameter(), Maths.EPSILON); - > Assert.assertEquals(((RandomizingControlParameter)original.getCognitiveAcce >leration()).getControlParameter().getParameter(), - > ((RandomizingControlParameter)copy.getCognitiveAcceleration()).getControlPa >rameter().getParameter(), Maths.EPSILON); - > Assert.assertEquals(((RandomizingControlParameter)original.getSocialAcceler >ation()).getControlParameter().getParameter(), - > ((RandomizingControlParameter)copy.getSocialAcceleration()).getControlParam >eter().getParameter(), Maths.EPSILON); + > Assert.assertEquals(original.getvMax().getParameter(), > copy.getvMax().getParameter(), Maths.EPSILON); + > Assert.assertEquals(((RandomizingControlParameter) > original.getCognitiveAcceleration()).getControlParameter().getParameter(), > + ((RandomizingControlParameter) > copy.getCognitiveAcceleration()).getControlParameter().getParameter(), > Maths.EPSILON); + Assert.assertEquals(((RandomizingControlParameter) > original.getSocialAcceleration()).getControlParameter().getParameter(), + > ((RandomizingControlParameter) > copy.getSocialAcceleration()).getControlParameter().getParameter(), > Maths.EPSILON); > > copy.setKappa(new ConstantControlParameter(0.7)); > - copy.setVMax(new ConstantControlParameter(0.7)); > + copy.setvMax(new ConstantControlParameter(0.7)); > RandomizingControlParameter randomizingControlParameter = new > RandomizingControlParameter(); > randomizingControlParameter.setParameter(4.0); > > copy.setSocialAcceleration(randomizingControlParameter.getClone()); > copy.setCognitiveAcceleration(randomizingControlParameter.getClone()); > > > Assert.assertFalse(Double.compare(original.getKappa().getParameter(), > copy.getKappa().getParameter()) == 0); - > Assert.assertFalse(Double.compare(original.getVMax().getParameter(), > copy.getVMax().getParameter()) == 0); - > Assert.assertFalse(Double.compare(((RandomizingControlParameter)original.ge >tCognitiveAcceleration()).getControlParameter().getParameter(), - > > ((RandomizingControlParameter)copy.getCognitiveAcceleration()).getControlPa >rameter().getParameter()) == 0); - > Assert.assertFalse(Double.compare(((RandomizingControlParameter)original.ge >tSocialAcceleration()).getControlParameter().getParameter(), - > > ((RandomizingControlParameter)copy.getSocialAcceleration()).getControlParam >eter().getParameter()) == 0); + > Assert.assertFalse(Double.compare(original.getvMax().getParameter(), > copy.getvMax().getParameter()) == 0); + > Assert.assertFalse(Double.compare(((RandomizingControlParameter) > original.getCognitiveAcceleration()).getControlParameter().getParameter(), > + ((RandomizingControlParameter) > copy.getCognitiveAcceleration()).getControlParameter().getParameter()) == > 0); + > Assert.assertFalse(Double.compare(((RandomizingControlParameter) > original.getSocialAcceleration()).getControlParameter().getParameter(), + > ((RandomizingControlParameter) > copy.getSocialAcceleration()).getControlParameter().getParameter()) == 0); > } > > /** > @@ -99,9 +100,44 @@ public class ConstrictionVelocityUpdateTest { > velocityUpdate.updateVelocity(particle); > > Vector velocity = (Vector) particle.getVelocity(); > - Assert.assertEquals(0.09831319691873514, velocity.getReal(0), > Maths.EPSILON); + Assert.assertEquals(1.2189730956981684, > velocity.getReal(0), Maths.EPSILON); + } finally { > + Seeder.setSeederStrategy(strategy); > } > - finally { > + } > + > + @Test > + public void testConstrictionCalculation() { > + SeedSelectionStrategy strategy = Seeder.getSeederStrategy(); > + Seeder.setSeederStrategy(new ZeroSeederStrategy()); > + > + try { > + ConstrictionVelocityUpdate velocityUpdate = new > ConstrictionVelocityUpdate(); + Particle particle = > createParticle(Vectors.create(0.0)); + > particle.setVelocityUpdateStrategy(velocityUpdate); > + Particle nBest = createParticle(Vectors.create(1.0)); > + particle.setNeighbourhoodBest(nBest); > + nBest.setNeighbourhoodBest(nBest); > + Particle clone = particle.getClone(); > + > + particle.getVelocityUpdateStrategy().updateVelocity(particle); > + clone.getVelocityUpdateStrategy().updateVelocity(particle); > + > + double kappa = 1.0; > + double c1 = 2.05; > + double c2 = 2.05; > + double phi = c1 + c2; > + double chi = (2 * kappa) / Math.abs(2 - phi - Math.sqrt(phi * > phi - 4.0 * phi)); //this was not copied from the implementation. + > + //verify implementation maths is correct. > + Assert.assertEquals(chi, > velocityUpdate.getConstrictionCoefficient().getParameter(), Maths.EPSILON); > + //verify it is the same for two particles. > + > + Assert.assertEquals(((ConstrictionVelocityUpdate) > particle.getVelocityUpdateStrategy()).getConstrictionCoefficient().getParam >eter(), + ((ConstrictionVelocityUpdate) > clone.getVelocityUpdateStrategy()).getConstrictionCoefficient().getParamete >r(), Maths.EPSILON); + > + > + } finally { > Seeder.setSeederStrategy(strategy); > } > } > @@ -115,7 +151,7 @@ public class ConstrictionVelocityUpdateTest { > return particle; > } > > - @Test(expected=UnsupportedOperationException.class) > + @Test(expected = UnsupportedOperationException.class) > public void illegalVelocityUpdate() { > final Particle particle = mockery.mock(Particle.class); > > @@ -124,9 +160,12 @@ public class ConstrictionVelocityUpdateTest { > > velocityUpdate.setCognitiveAcceleration(randomizingControlParameter); > velocityUpdate.setSocialAcceleration(randomizingControlParameter); > > - mockery.checking(new Expectations() {{ > - ignoring(particle); > - }}); > + mockery.checking(new Expectations() { > + > + { > + ignoring(particle); > + } > + }); > > velocityUpdate.updateVelocity(particle); > } > @@ -142,7 +181,7 @@ public class ConstrictionVelocityUpdateTest { > nBest.setNeighbourhoodBest(nBest); > > ConstrictionVelocityUpdate constrictionVelocityUpdate = new > ConstrictionVelocityUpdate(); - > constrictionVelocityUpdate.setVMax(new ConstantControlParameter(0.5)); + > constrictionVelocityUpdate.setvMax(new ConstantControlParameter(0.5)); > constrictionVelocityUpdate.updateVelocity(particle); > Vector velocity = (Vector) particle.getVelocity(); > > @@ -152,5 +191,4 @@ public class ConstrictionVelocityUpdateTest { > } > > } > - > } > diff --git a/xml/constrictionPSO.xml b/xml/constrictionPSO.xml > index 6ce91a3..ab1f795 100644 > --- a/xml/constrictionPSO.xml > +++ b/xml/constrictionPSO.xml > @@ -10,31 +10,34 @@ > <initialisationStrategy > class="algorithm.initialisation.ClonedPopulationInitialisationStrategy"> > <entityType class="pso.particle.StandardParticle"> <velocityUpdateStrategy > class="pso.velocityupdatestrategies.ConstrictionVelocityUpdate"> - > <kappa class="controlparameter.ConstantControlParameter" > parameter="0.1" /> - <socialAcceleration > class="controlparameter.RandomizingControlParameter" parameter="3.0" /> - > <cognitiveAcceleration > class="controlparameter.RandomizingControlParameter" parameter="3.0" /> + > <kappa > class="controlparameter.ConstantControlParameter" parameter="1.0"/> + > <socialAcceleration > class="controlparameter.RandomizingControlParameter" parameter="2.05" /> + > <cognitiveAcceleration > class="controlparameter.RandomizingControlParameter" parameter="2.05" /> > <!--vMax class="controlparameter.ConstantControlParameter" parameter="0.1" > /--> </velocityUpdateStrategy> > </entityType> > </initialisationStrategy> > <topology class="entity.topologies.GBestTopology"/> > - <addStoppingCondition > class="stoppingcondition.MaximumIterations" maximumIterations="1000"/> + > <addStoppingCondition class="stoppingcondition.MaximumIterations" > maximumIterations="2000"/> </algorithm> > </algorithms> > > <problems> > <problem id="spherical" > class="problem.FunctionMinimisationProblem"> - <function > class="functions.continuous.unconstrained.Spherical"/> + > <function class="functions.continuous.unconstrained.Spherical" > domain="R(-20.0, 20.0)^30"/> </problem> > <problem id="rosenbrock" > class="problem.FunctionMinimisationProblem"> - <function > class="functions.continuous.unconstrained.Rosenbrock"/> + > <function class="functions.continuous.unconstrained.Rosenbrock" > domain="R(-10.0, 10.0)^30"/> </problem> > <problem id="rastrigin" > class="problem.FunctionMinimisationProblem"> - <function > class="functions.continuous.unconstrained.Rastrigin"/> + > <function class="functions.continuous.unconstrained.Rastrigin" > domain="R(-5.12, 5.12)^30"/> + </problem> > + <problem id="griewank" > class="problem.FunctionMinimisationProblem"> + <function > class="functions.continuous.unconstrained.Griewank" domain="R(-300, > 300)^30"/> </problem> > </problems> > > - <measurements id="fitness" class="simulator.MeasurementSuite" > resolution="10" samples="1"> + <measurements id="fitness" > class="simulator.MeasurementSuite" resolution="10" samples="50"> > <addMeasurement class="measurement.single.Fitness"/> > </measurements> > <simulations> > @@ -53,5 +56,10 @@ > <problem idref="rastrigin"/> > <measurements idref="fitness" > file="data/constrictionpso_rastrigin.txt"/> </simulation> > + <simulation> > + <algorithm idref="constrictionPSO"/> > + <problem idref="griewank"/> > + <measurements idref="fitness" > file="data/constrictionpso_griewank.txt"/> + </simulation> > </simulations> > </simulator> |
From: Andrich v. W. <avw...@gm...> - 2009-07-15 11:41:06
|
Corrected the ConstrictionVelocityUpdate: The constriction coefficient has to be calculated only once during the course of the algorithm (as opposed to every time it is used) similar to inertia. The calculation also uses c1 and c2 WITHOUT the randomization of r1 and r2. Resulting implementation delivers good results that are very similar to those reported by reference papers. --- .../ConstrictionVelocityUpdate.java | 112 +++++++++++--------- .../ConstrictionVelocityUpdateTest.java | 76 ++++++++++---- xml/constrictionPSO.xml | 24 +++-- 3 files changed, 134 insertions(+), 78 deletions(-) diff --git a/src/main/java/net/sourceforge/cilib/pso/velocityupdatestrategies/ConstrictionVelocityUpdate.java b/src/main/java/net/sourceforge/cilib/pso/velocityupdatestrategies/ConstrictionVelocityUpdate.java index 86b0e4c..54542bf 100644 --- a/src/main/java/net/sourceforge/cilib/pso/velocityupdatestrategies/ConstrictionVelocityUpdate.java +++ b/src/main/java/net/sourceforge/cilib/pso/velocityupdatestrategies/ConstrictionVelocityUpdate.java @@ -29,33 +29,28 @@ import net.sourceforge.cilib.type.types.container.Vector; /** * A velocity update strategy that utilizes the constriction coefficient as - * developed by Clerc. + * developed by M. Clerc. * <p>References: * <ul> * <li> * <pre> -{@literal @}INPROCEEDINGS{785513, -title={The swarm and the queen: towards a deterministic and adaptive particle swarm optimization}, -author={Clerc, M.}, -booktitle={Evolutionary Computation, 1999. CEC 99. Proceedings of the 1999 Congress on}, -year={1999}, +{@literal @}@INPROCEEDINGS{870279, +title={Comparing inertia weights and constriction factors in particle swarm optimization}, +author={Eberhart, R.C. and Shi, Y.}, +booktitle={Evolutionary Computation, 2000. Proceedings of the 2000 Congress on}, +year={2000}, month={}, -volume={3}, +volume={1}, number={}, -pages={-1957 Vol. 3}, -abstract={A very simple particle swarm optimization iterative algorithm is presented, with just -one equation and one social/confidence parameter. We define a âno-hopeâ convergence criterion and -a ârehopeâ method so that, from time to time, the swarm re-initializes its position, according to -some gradient estimations of the objective function and to the previous re-initialization (it means -it has a kind of very rudimentary memory). We then study two different cases, a quite âeasyâ one -(the Alpine function) and a âdifficultâ one (the Banana function), but both just in dimension two. -The process is improved by taking into account the swarm gravity center (the âqueenâ) and the results -are good enough so that it is certainly worthwhile trying the method on more complex problems}, -keywords={adaptive systems, deterministic algorithms, evolutionary computation, iterative methodsAlpine function, -Banana function, adaptive particle swarm optimization, gradient estimations, no-hope convergence criterion, -objective function, queen, re-initialization, rehope method, rudimentary memory, simple particle swarm -optimization iterative algorithm, social/confidence parameter, swarm gravity center}, -doi={10.1109/CEC.1999.785513}, +pages={84-88 vol.1}, +abstract={The performance of particle swarm optimization using an inertia weight is compared +with performance using a constriction factor. Five benchmark functions are used for the +comparison. It is concluded that the best approach is to use the constriction factor while +limiting the maximum velocity Vmax to the dynamic range of the variable Xmax on each +dimension. This approach provides performance on the benchmark functions superior to any +other published results known by the authors}, +keywords={evolutionary computationbenchmark functions, constriction factors, inertia weights, particle swarm optimization}, +doi={10.1109/CEC.2000.870279}, ISSN={}, } </pre> * </li> @@ -89,21 +84,22 @@ ISSN={1089-778X}, } * </ul> * * <p> - * Note, this strategy does not the inertia control parameter. + * Note, this strategy does not use the inertia control parameter. * Certain constraints are imposed on the other control parameters in order to * calculate the constriction coefficient, namely: - * $c1r1 + c2r2 \leq 4$ , and + * $c1 + c2 \leq 4$ , and * $\kappa \in [0, 1]$ * * @author andrich */ public class ConstrictionVelocityUpdate implements VelocityUpdateStrategy { - private static final long serialVersionUID = -4470110903487138758L; + private static final long serialVersionUID = -4470110903487138758L; private ControlParameter socialAcceleration; private ControlParameter cognitiveAcceleration; private ControlParameter vMax; private ControlParameter kappa; + private ControlParameter constrictionCoefficient; /** * Default constructor. The values given to the control parameters attempt to @@ -115,11 +111,12 @@ public class ConstrictionVelocityUpdate implements VelocityUpdateStrategy { cognitiveAcceleration = new RandomizingControlParameter(); vMax = new ConstantControlParameter(); kappa = new ConstantControlParameter(); + constrictionCoefficient = null; - socialAcceleration.setParameter(3.0); - cognitiveAcceleration.setParameter(3.0); + socialAcceleration.setParameter(2.05); + cognitiveAcceleration.setParameter(2.05); + kappa.setParameter(1.0); vMax.setParameter(Double.MAX_VALUE); - kappa.setParameter(0.1); } /** @@ -146,8 +143,10 @@ public class ConstrictionVelocityUpdate implements VelocityUpdateStrategy { */ @Override public void updateVelocity(Particle particle) { - assertAccelerationConstraints(); - + // lazy construction (necessary to do this after user has set c1 and c2, and to only do it once per particle). + if (constrictionCoefficient == null) { + calculateConstrictionCoefficient(); + } Vector velocity = (Vector) particle.getVelocity(); Vector position = (Vector) particle.getPosition(); Vector bestPosition = (Vector) particle.getBestPosition(); @@ -155,22 +154,9 @@ public class ConstrictionVelocityUpdate implements VelocityUpdateStrategy { for (int i = 0; i < particle.getDimension(); ++i) { - // calculate the constriction coefficient - double c1 = cognitiveAcceleration.getParameter(); - double c2 = socialAcceleration.getParameter(); - // c1r1 + c2r2 has to be greater or equal to 4 - while ((c1 + c2) < 4) { - c1 = cognitiveAcceleration.getParameter(); - c2 = socialAcceleration.getParameter(); - } - double phi = c1 + c2; - double constrictionCoefficient = (2 * kappa.getParameter()) / - Math.abs(2 - phi - Math.sqrt(phi * (phi - 4.0))); - - double value = velocity.getReal(i) + - (bestPosition.getReal(i) - position.getReal(i)) * c1 + - (nBestPosition.getReal(i) - position.getReal(i)) * c2; - value = constrictionCoefficient * value; + double value = constrictionCoefficient.getParameter() * (velocity.getReal(i) + + (bestPosition.getReal(i) - position.getReal(i)) * cognitiveAcceleration.getParameter() + + (nBestPosition.getReal(i) - position.getReal(i)) * socialAcceleration.getParameter()); velocity.setReal(i, value); clamp(velocity, i); @@ -206,17 +192,25 @@ public class ConstrictionVelocityUpdate implements VelocityUpdateStrategy { } /** - * Ensure that values of c1 and c2 make it possible to calculate the - * constriction coefficient. + * Calculate the constriction coefficient as well as the + * maximum acceleration. */ - private void assertAccelerationConstraints() { + private void calculateConstrictionCoefficient() { double c1 = ((RandomizingControlParameter) cognitiveAcceleration).getControlParameter().getParameter(); double c2 = ((RandomizingControlParameter) socialAcceleration).getControlParameter().getParameter(); - if (c1 + c2 < 4) { + + double phi = c1 + c2; + if (phi < 4.0) { throw new UnsupportedOperationException("Parameter constraint violation: " + "The sum of the Cognitive (" + c1 + ") and Social (" + c2 + ") acceleration parameters " + "has to be greater than or equal to 4."); } + double chi; + chi = (2 * kappa.getParameter()) / + Math.abs(2 - phi - Math.sqrt(phi * (phi - 4.0))); + + constrictionCoefficient = new ConstantControlParameter(); + constrictionCoefficient.setParameter(chi); } /** @@ -271,7 +265,7 @@ public class ConstrictionVelocityUpdate implements VelocityUpdateStrategy { * Get the maximum velocity parameter. * @return the maximum velocity {@link ControlParameter control parameter }. */ - public ControlParameter getVMax() { + public ControlParameter getvMax() { return vMax; } @@ -279,7 +273,23 @@ public class ConstrictionVelocityUpdate implements VelocityUpdateStrategy { * Set the maximum velocity parameter. * @param vMax the new maximum velocity {@link ControlParameter control parameter }. */ - public void setVMax(ControlParameter vMax) { + public void setvMax(ControlParameter vMax) { this.vMax = vMax; } + + /** + * Gets the constriction coefficient. + * @return the constriction coefficient {@link ControlParameter control parameter }. + */ + public ControlParameter getConstrictionCoefficient() { + return constrictionCoefficient; + } + + /** + * Sets the constriction coefficient. + * @param constrictionCoefficient the new constriction coefficient {@link ControlParameter control parameter }. + */ + public void setConstrictionCoefficient(ControlParameter constrictionCoefficient) { + this.constrictionCoefficient = constrictionCoefficient; + } } diff --git a/src/test/java/net/sourceforge/cilib/pso/velocityupdatestrategies/ConstrictionVelocityUpdateTest.java b/src/test/java/net/sourceforge/cilib/pso/velocityupdatestrategies/ConstrictionVelocityUpdateTest.java index 45e701a..b7133f7 100644 --- a/src/test/java/net/sourceforge/cilib/pso/velocityupdatestrategies/ConstrictionVelocityUpdateTest.java +++ b/src/test/java/net/sourceforge/cilib/pso/velocityupdatestrategies/ConstrictionVelocityUpdateTest.java @@ -47,6 +47,7 @@ import org.junit.runner.RunWith; */ @RunWith(JMock.class) public class ConstrictionVelocityUpdateTest { + private Mockery mockery = new JUnit4Mockery(); /** @@ -58,25 +59,25 @@ public class ConstrictionVelocityUpdateTest { ConstrictionVelocityUpdate copy = original.getClone(); Assert.assertEquals(original.getKappa().getParameter(), copy.getKappa().getParameter(), Maths.EPSILON); - Assert.assertEquals(original.getVMax().getParameter(), copy.getVMax().getParameter(), Maths.EPSILON); - Assert.assertEquals(((RandomizingControlParameter)original.getCognitiveAcceleration()).getControlParameter().getParameter(), - ((RandomizingControlParameter)copy.getCognitiveAcceleration()).getControlParameter().getParameter(), Maths.EPSILON); - Assert.assertEquals(((RandomizingControlParameter)original.getSocialAcceleration()).getControlParameter().getParameter(), - ((RandomizingControlParameter)copy.getSocialAcceleration()).getControlParameter().getParameter(), Maths.EPSILON); + Assert.assertEquals(original.getvMax().getParameter(), copy.getvMax().getParameter(), Maths.EPSILON); + Assert.assertEquals(((RandomizingControlParameter) original.getCognitiveAcceleration()).getControlParameter().getParameter(), + ((RandomizingControlParameter) copy.getCognitiveAcceleration()).getControlParameter().getParameter(), Maths.EPSILON); + Assert.assertEquals(((RandomizingControlParameter) original.getSocialAcceleration()).getControlParameter().getParameter(), + ((RandomizingControlParameter) copy.getSocialAcceleration()).getControlParameter().getParameter(), Maths.EPSILON); copy.setKappa(new ConstantControlParameter(0.7)); - copy.setVMax(new ConstantControlParameter(0.7)); + copy.setvMax(new ConstantControlParameter(0.7)); RandomizingControlParameter randomizingControlParameter = new RandomizingControlParameter(); randomizingControlParameter.setParameter(4.0); copy.setSocialAcceleration(randomizingControlParameter.getClone()); copy.setCognitiveAcceleration(randomizingControlParameter.getClone()); Assert.assertFalse(Double.compare(original.getKappa().getParameter(), copy.getKappa().getParameter()) == 0); - Assert.assertFalse(Double.compare(original.getVMax().getParameter(), copy.getVMax().getParameter()) == 0); - Assert.assertFalse(Double.compare(((RandomizingControlParameter)original.getCognitiveAcceleration()).getControlParameter().getParameter(), - ((RandomizingControlParameter)copy.getCognitiveAcceleration()).getControlParameter().getParameter()) == 0); - Assert.assertFalse(Double.compare(((RandomizingControlParameter)original.getSocialAcceleration()).getControlParameter().getParameter(), - ((RandomizingControlParameter)copy.getSocialAcceleration()).getControlParameter().getParameter()) == 0); + Assert.assertFalse(Double.compare(original.getvMax().getParameter(), copy.getvMax().getParameter()) == 0); + Assert.assertFalse(Double.compare(((RandomizingControlParameter) original.getCognitiveAcceleration()).getControlParameter().getParameter(), + ((RandomizingControlParameter) copy.getCognitiveAcceleration()).getControlParameter().getParameter()) == 0); + Assert.assertFalse(Double.compare(((RandomizingControlParameter) original.getSocialAcceleration()).getControlParameter().getParameter(), + ((RandomizingControlParameter) copy.getSocialAcceleration()).getControlParameter().getParameter()) == 0); } /** @@ -99,9 +100,44 @@ public class ConstrictionVelocityUpdateTest { velocityUpdate.updateVelocity(particle); Vector velocity = (Vector) particle.getVelocity(); - Assert.assertEquals(0.09831319691873514, velocity.getReal(0), Maths.EPSILON); + Assert.assertEquals(1.2189730956981684, velocity.getReal(0), Maths.EPSILON); + } finally { + Seeder.setSeederStrategy(strategy); } - finally { + } + + @Test + public void testConstrictionCalculation() { + SeedSelectionStrategy strategy = Seeder.getSeederStrategy(); + Seeder.setSeederStrategy(new ZeroSeederStrategy()); + + try { + ConstrictionVelocityUpdate velocityUpdate = new ConstrictionVelocityUpdate(); + Particle particle = createParticle(Vectors.create(0.0)); + particle.setVelocityUpdateStrategy(velocityUpdate); + Particle nBest = createParticle(Vectors.create(1.0)); + particle.setNeighbourhoodBest(nBest); + nBest.setNeighbourhoodBest(nBest); + Particle clone = particle.getClone(); + + particle.getVelocityUpdateStrategy().updateVelocity(particle); + clone.getVelocityUpdateStrategy().updateVelocity(particle); + + double kappa = 1.0; + double c1 = 2.05; + double c2 = 2.05; + double phi = c1 + c2; + double chi = (2 * kappa) / Math.abs(2 - phi - Math.sqrt(phi * phi - 4.0 * phi)); //this was not copied from the implementation. + + //verify implementation maths is correct. + Assert.assertEquals(chi, velocityUpdate.getConstrictionCoefficient().getParameter(), Maths.EPSILON); + //verify it is the same for two particles. + + Assert.assertEquals(((ConstrictionVelocityUpdate) particle.getVelocityUpdateStrategy()).getConstrictionCoefficient().getParameter(), + ((ConstrictionVelocityUpdate) clone.getVelocityUpdateStrategy()).getConstrictionCoefficient().getParameter(), Maths.EPSILON); + + + } finally { Seeder.setSeederStrategy(strategy); } } @@ -115,7 +151,7 @@ public class ConstrictionVelocityUpdateTest { return particle; } - @Test(expected=UnsupportedOperationException.class) + @Test(expected = UnsupportedOperationException.class) public void illegalVelocityUpdate() { final Particle particle = mockery.mock(Particle.class); @@ -124,9 +160,12 @@ public class ConstrictionVelocityUpdateTest { velocityUpdate.setCognitiveAcceleration(randomizingControlParameter); velocityUpdate.setSocialAcceleration(randomizingControlParameter); - mockery.checking(new Expectations() {{ - ignoring(particle); - }}); + mockery.checking(new Expectations() { + + { + ignoring(particle); + } + }); velocityUpdate.updateVelocity(particle); } @@ -142,7 +181,7 @@ public class ConstrictionVelocityUpdateTest { nBest.setNeighbourhoodBest(nBest); ConstrictionVelocityUpdate constrictionVelocityUpdate = new ConstrictionVelocityUpdate(); - constrictionVelocityUpdate.setVMax(new ConstantControlParameter(0.5)); + constrictionVelocityUpdate.setvMax(new ConstantControlParameter(0.5)); constrictionVelocityUpdate.updateVelocity(particle); Vector velocity = (Vector) particle.getVelocity(); @@ -152,5 +191,4 @@ public class ConstrictionVelocityUpdateTest { } } - } diff --git a/xml/constrictionPSO.xml b/xml/constrictionPSO.xml index 6ce91a3..ab1f795 100644 --- a/xml/constrictionPSO.xml +++ b/xml/constrictionPSO.xml @@ -10,31 +10,34 @@ <initialisationStrategy class="algorithm.initialisation.ClonedPopulationInitialisationStrategy"> <entityType class="pso.particle.StandardParticle"> <velocityUpdateStrategy class="pso.velocityupdatestrategies.ConstrictionVelocityUpdate"> - <kappa class="controlparameter.ConstantControlParameter" parameter="0.1" /> - <socialAcceleration class="controlparameter.RandomizingControlParameter" parameter="3.0" /> - <cognitiveAcceleration class="controlparameter.RandomizingControlParameter" parameter="3.0" /> + <kappa class="controlparameter.ConstantControlParameter" parameter="1.0"/> + <socialAcceleration class="controlparameter.RandomizingControlParameter" parameter="2.05" /> + <cognitiveAcceleration class="controlparameter.RandomizingControlParameter" parameter="2.05" /> <!--vMax class="controlparameter.ConstantControlParameter" parameter="0.1" /--> </velocityUpdateStrategy> </entityType> </initialisationStrategy> <topology class="entity.topologies.GBestTopology"/> - <addStoppingCondition class="stoppingcondition.MaximumIterations" maximumIterations="1000"/> + <addStoppingCondition class="stoppingcondition.MaximumIterations" maximumIterations="2000"/> </algorithm> </algorithms> <problems> <problem id="spherical" class="problem.FunctionMinimisationProblem"> - <function class="functions.continuous.unconstrained.Spherical"/> + <function class="functions.continuous.unconstrained.Spherical" domain="R(-20.0, 20.0)^30"/> </problem> <problem id="rosenbrock" class="problem.FunctionMinimisationProblem"> - <function class="functions.continuous.unconstrained.Rosenbrock"/> + <function class="functions.continuous.unconstrained.Rosenbrock" domain="R(-10.0, 10.0)^30"/> </problem> <problem id="rastrigin" class="problem.FunctionMinimisationProblem"> - <function class="functions.continuous.unconstrained.Rastrigin"/> + <function class="functions.continuous.unconstrained.Rastrigin" domain="R(-5.12, 5.12)^30"/> + </problem> + <problem id="griewank" class="problem.FunctionMinimisationProblem"> + <function class="functions.continuous.unconstrained.Griewank" domain="R(-300, 300)^30"/> </problem> </problems> - <measurements id="fitness" class="simulator.MeasurementSuite" resolution="10" samples="1"> + <measurements id="fitness" class="simulator.MeasurementSuite" resolution="10" samples="50"> <addMeasurement class="measurement.single.Fitness"/> </measurements> <simulations> @@ -53,5 +56,10 @@ <problem idref="rastrigin"/> <measurements idref="fitness" file="data/constrictionpso_rastrigin.txt"/> </simulation> + <simulation> + <algorithm idref="constrictionPSO"/> + <problem idref="griewank"/> + <measurements idref="fitness" file="data/constrictionpso_griewank.txt"/> + </simulation> </simulations> </simulator> -- 1.6.0.4 |
From: Gary P. <gpa...@gm...> - 2009-07-15 10:07:07
|
Hi, This patch makes me wonder. The class is now restricted to only ever have ConstantControlParameter instances. Was this the intended result? Regards, Gary On Wednesday 15 July 2009 10:23:50 Andries Engelbrecht wrote: |
From: Andries E. <en...@cs...> - 2009-07-15 08:22:38
|
-- ========================================================== Prof Andries P Engelbrecht South African Research Chair in Artificial Intelligence Fundamentals of Computational Swarm Intelligence, John Wiley & Sons, December 2005. Computational Intelligence, An Introduction John Wiley & Sons, Second edition to be published soon Computational Intelligence Research Group: http://cirg.cs.up.ac.za Department of Computer Science School of Information Technology University of Pretoria Pretoria 0002, South Africa Tel: +27 12 420 3578 Fax: +27 12 362 5188 http://www.cs.up.ac.za/~engel ================================================ This message and attachments are subject to a disclaimer. Please refer to www.it.up.ac.za/documentation/governance/disclaimer/ for full details. / Hierdie boodskap en aanhangsels is aan 'n vrywaringsklousule onderhewig. Volledige besonderhede is by www.it.up.ac.za/documentation/governance/disclaimer/ beskikbaar. |
From: Theuns C. <the...@gm...> - 2009-07-15 06:53:55
|
Hi all, More control parameters that have ranges (bounds): - Oscillating (oscillates from lower bound to upper bound and back to lower bound, repeat) - Wrapping (moves from lower bound to upper bound, wrap back to lower bound, repeat) These are especially useful for dynamic environments. Regards -- Theuns On Wed, Jul 15, 2009 at 8:20 AM, Gary Pampara<gpa...@gm...> wrote: > Hi all, > > Some discussion has come up with regards to ControlParameters. > > It seems that the current implementation may prove to be a little too > restrictive. As a result, a refactor is more than likely in order. > > We need to get some idea of what is needed. I already have the following list: > - Constant parameters > - Randomized within a certain range (could this be applied as a behaviour?) > - Dynamic parameters (change over time) > - Self-adaptive parameters (This could be complex - some examples > would be great) > - Bounded parameters (bound by a upper and lower value - like a domain range) > - Proportional parameters (like percentages of values - maybe a decorater?) > > Any other thoughts on this? I know how deep the use of the ControlParameters > goes. So, please consider this :) The refactor may be rather large. > > Regards, > Gary |
From: Gary P. <gpa...@gm...> - 2009-07-15 06:20:58
|
Hi all, Some discussion has come up with regards to ControlParameters. It seems that the current implementation may prove to be a little too restrictive. As a result, a refactor is more than likely in order. We need to get some idea of what is needed. I already have the following list: - Constant parameters - Randomized within a certain range (could this be applied as a behaviour?) - Dynamic parameters (change over time) - Self-adaptive parameters (This could be complex - some examples would be great) - Bounded parameters (bound by a upper and lower value - like a domain range) - Proportional parameters (like percentages of values - maybe a decorater?) Any other thoughts on this? I know how deep the use of the ControlParameters goes. So, please consider this :) The refactor may be rather large. Regards, Gary |
From: Andries E. <en...@cs...> - 2009-07-14 08:07:26
|
Maybe we should discuss this at the next CIlib meeting? Gary Pampara wrote: > Hmmm. > > This does make the implementation rather complex. One the one hand, having the > entity know about its strategy parameters (if any) could be a good thing, > however, the problem does come in where the strategy parameters are shared > amoungst entities. > > I'm not really sure that this will be a simple addition. > > Regards, > Gary > > On Monday 13 July 2009 13:37:10 Andries Engelbrecht wrote: > >> Hi, >> >> >>> 1. Where should the definition of the initialization for these extra >>> parameters be placed? On the individual? In the EC algorithm? Within the >>> IterationStrategy? >>> >> You refer to the Strategy parameters here. What we have to remember >> is that strategy parameters can be "global" or "local". What I mean by >> this is that the same parameter can be used for all individuals, or each >> individual can have its own parameter. The latter can have an even >> smaller granularity in that each dimension of each individual can have >> its own strategy parameter. We should also think about cultural >> algorithms where there is a bielief space, which have some relation >> to strategy parameters. The solution should take the latter into account. >> >> We may argue that not all EAs have strategy parameters, e.g. GA. >> However, in our implementation, parameters such as crossover and >> mutation probability can be seen as strategy parameters with no >> adaptation. >> >> So the question is where does strategy parameters belong? My >> feeling is that these should belong to Algorithms. Not just EC >> algorithms, but all algorithms. Remember that PSO and others >> also have "strategy parameters". performIteration will then have >> a call to some strategy to "adapt" the parameters. And this >> basically should replace ControlParameters. >> >> >>> 2. How should mutation be handled? Should the strategies know to inspect >>> the individual for strategy parameters? Should the mutation rather be >>> done in a separate class? >>> >> Remember that mutation can be applied in PSO and others. Mutation >> is a separate process, that may, or may not make use of the >> strategy parameters. So, mutation should be a separate class. >> >> This then also tells me that the strategy parameters should be on >> a higher level than on entity level. >> >> >>> Regards, >>> Gary >>> >>> ------------------------------------------------------------------------- >>> ----- Enter the BlackBerry Developer Challenge >>> This is your chance to win up to $100,000 in prizes! For a limited time, >>> vendors submitting new applications to BlackBerry App World(TM) will have >>> the opportunity to enter the BlackBerry Developer Challenge. See full >>> prize details at: http://p.sf.net/sfu/Challenge >>> _______________________________________________ >>> cilib-devel mailing list >>> cil...@li... >>> https://lists.sourceforge.net/lists/listinfo/cilib-devel >>> -- ========================================================== Prof Andries P Engelbrecht South African Research Chair in Artificial Intelligence Fundamentals of Computational Swarm Intelligence, John Wiley & Sons, December 2005. Computational Intelligence, An Introduction John Wiley & Sons, Second edition to be published soon Computational Intelligence Research Group: http://cirg.cs.up.ac.za Department of Computer Science School of Information Technology University of Pretoria Pretoria 0002, South Africa Tel: +27 12 420 3578 Fax: +27 12 362 5188 http://www.cs.up.ac.za/~engel ================================================ This message and attachments are subject to a disclaimer. Please refer to www.it.up.ac.za/documentation/governance/disclaimer/ for full details. / Hierdie boodskap en aanhangsels is aan 'n vrywaringsklousule onderhewig. Volledige besonderhede is by www.it.up.ac.za/documentation/governance/disclaimer/ beskikbaar. |
From: Gary P. <gpa...@gm...> - 2009-07-14 07:29:02
|
This could result in some implementation problems. On the one hand, having the entity know what the strategy parameters are is very useful as it ensures that the object boundaries are well defined. On the other hand, it could be an issue when the entities share strategy parameters - if you take the belief space within CE as a set of strategy parameters then that will break things. I would, ideally, like to make the implementation as simple as possible. But any sort of feedback would be appreciated. Currently, the EP Iteration startegy is performing the initialization of the strategy parameters for the EP. I would like to migrate them to the Individual as that is probably the most granular we could go. The only snag with this is that the current GA etc will have a slower performance as more onjects will be created during the constuctor call of the Individual object. We could always make this lazy, but the timing issues that could be introduced could cause problems. Alternatively, a new way for creating individuals would be needed - I'm contemplating a refactoring exercise on the EC stuff to correct any issues that we currently have with anything EC. Does anyone have anything specific regarding the EC code that is not "good"? Gary. On Monday 13 July 2009 13:37:10 Andries Engelbrecht wrote: > Hi, > > > 1. Where should the definition of the initialization for these extra > > parameters be placed? On the individual? In the EC algorithm? Within the > > IterationStrategy? > > You refer to the Strategy parameters here. What we have to remember > is that strategy parameters can be "global" or "local". What I mean by > this is that the same parameter can be used for all individuals, or each > individual can have its own parameter. The latter can have an even > smaller granularity in that each dimension of each individual can have > its own strategy parameter. We should also think about cultural > algorithms where there is a bielief space, which have some relation > to strategy parameters. The solution should take the latter into account. > > We may argue that not all EAs have strategy parameters, e.g. GA. > However, in our implementation, parameters such as crossover and > mutation probability can be seen as strategy parameters with no > adaptation. > > So the question is where does strategy parameters belong? My > feeling is that these should belong to Algorithms. Not just EC > algorithms, but all algorithms. Remember that PSO and others > also have "strategy parameters". performIteration will then have > a call to some strategy to "adapt" the parameters. And this > basically should replace ControlParameters. > > > 2. How should mutation be handled? Should the strategies know to inspect > > the individual for strategy parameters? Should the mutation rather be > > done in a separate class? > > Remember that mutation can be applied in PSO and others. Mutation > is a separate process, that may, or may not make use of the > strategy parameters. So, mutation should be a separate class. > > This then also tells me that the strategy parameters should be on > a higher level than on entity level. > > > Regards, > > Gary > > > > ------------------------------------------------------------------------- > >----- Enter the BlackBerry Developer Challenge > > This is your chance to win up to $100,000 in prizes! For a limited time, > > vendors submitting new applications to BlackBerry App World(TM) will have > > the opportunity to enter the BlackBerry Developer Challenge. See full > > prize details at: http://p.sf.net/sfu/Challenge > > _______________________________________________ > > cilib-devel mailing list > > cil...@li... > > https://lists.sourceforge.net/lists/listinfo/cilib-devel |
From: Gary P. <gpa...@gm...> - 2009-07-14 07:29:00
|
Hmmm. This does make the implementation rather complex. One the one hand, having the entity know about its strategy parameters (if any) could be a good thing, however, the problem does come in where the strategy parameters are shared amoungst entities. I'm not really sure that this will be a simple addition. Regards, Gary On Monday 13 July 2009 13:37:10 Andries Engelbrecht wrote: > Hi, > > > 1. Where should the definition of the initialization for these extra > > parameters be placed? On the individual? In the EC algorithm? Within the > > IterationStrategy? > > You refer to the Strategy parameters here. What we have to remember > is that strategy parameters can be "global" or "local". What I mean by > this is that the same parameter can be used for all individuals, or each > individual can have its own parameter. The latter can have an even > smaller granularity in that each dimension of each individual can have > its own strategy parameter. We should also think about cultural > algorithms where there is a bielief space, which have some relation > to strategy parameters. The solution should take the latter into account. > > We may argue that not all EAs have strategy parameters, e.g. GA. > However, in our implementation, parameters such as crossover and > mutation probability can be seen as strategy parameters with no > adaptation. > > So the question is where does strategy parameters belong? My > feeling is that these should belong to Algorithms. Not just EC > algorithms, but all algorithms. Remember that PSO and others > also have "strategy parameters". performIteration will then have > a call to some strategy to "adapt" the parameters. And this > basically should replace ControlParameters. > > > 2. How should mutation be handled? Should the strategies know to inspect > > the individual for strategy parameters? Should the mutation rather be > > done in a separate class? > > Remember that mutation can be applied in PSO and others. Mutation > is a separate process, that may, or may not make use of the > strategy parameters. So, mutation should be a separate class. > > This then also tells me that the strategy parameters should be on > a higher level than on entity level. > > > Regards, > > Gary > > > > ------------------------------------------------------------------------- > >----- Enter the BlackBerry Developer Challenge > > This is your chance to win up to $100,000 in prizes! For a limited time, > > vendors submitting new applications to BlackBerry App World(TM) will have > > the opportunity to enter the BlackBerry Developer Challenge. See full > > prize details at: http://p.sf.net/sfu/Challenge > > _______________________________________________ > > cilib-devel mailing list > > cil...@li... > > https://lists.sourceforge.net/lists/listinfo/cilib-devel |
From: Andries E. <en...@cs...> - 2009-07-13 11:57:05
|
Hi, > 1. Where should the definition of the initialization for these extra parameters > be placed? On the individual? In the EC algorithm? Within the > IterationStrategy? > You refer to the Strategy parameters here. What we have to remember is that strategy parameters can be "global" or "local". What I mean by this is that the same parameter can be used for all individuals, or each individual can have its own parameter. The latter can have an even smaller granularity in that each dimension of each individual can have its own strategy parameter. We should also think about cultural algorithms where there is a bielief space, which have some relation to strategy parameters. The solution should take the latter into account. We may argue that not all EAs have strategy parameters, e.g. GA. However, in our implementation, parameters such as crossover and mutation probability can be seen as strategy parameters with no adaptation. So the question is where does strategy parameters belong? My feeling is that these should belong to Algorithms. Not just EC algorithms, but all algorithms. Remember that PSO and others also have "strategy parameters". performIteration will then have a call to some strategy to "adapt" the parameters. And this basically should replace ControlParameters. > 2. How should mutation be handled? Should the strategies know to inspect the > individual for strategy parameters? Should the mutation rather be done in a > separate class? > Remember that mutation can be applied in PSO and others. Mutation is a separate process, that may, or may not make use of the strategy parameters. So, mutation should be a separate class. This then also tells me that the strategy parameters should be on a higher level than on entity level. > Regards, > Gary > > ------------------------------------------------------------------------------ > Enter the BlackBerry Developer Challenge > This is your chance to win up to $100,000 in prizes! For a limited time, > vendors submitting new applications to BlackBerry App World(TM) will have > the opportunity to enter the BlackBerry Developer Challenge. See full prize > details at: http://p.sf.net/sfu/Challenge > _______________________________________________ > cilib-devel mailing list > cil...@li... > https://lists.sourceforge.net/lists/listinfo/cilib-devel > -- ========================================================== Prof Andries P Engelbrecht South African Research Chair in Artificial Intelligence Fundamentals of Computational Swarm Intelligence, John Wiley & Sons, December 2005. Computational Intelligence, An Introduction John Wiley & Sons, Second edition to be published soon Computational Intelligence Research Group: http://cirg.cs.up.ac.za Department of Computer Science School of Information Technology University of Pretoria Pretoria 0002, South Africa Tel: +27 12 420 3578 Fax: +27 12 362 5188 http://www.cs.up.ac.za/~engel ================================================ This message and attachments are subject to a disclaimer. Please refer to www.it.up.ac.za/documentation/governance/disclaimer/ for full details. / Hierdie boodskap en aanhangsels is aan 'n vrywaringsklousule onderhewig. Volledige besonderhede is by www.it.up.ac.za/documentation/governance/disclaimer/ beskikbaar. |
From: Gary P. <gpa...@gm...> - 2009-07-13 08:00:50
|
Hi all, We are currently completing the framework changes to enable generic EP and ES. There are a few small issues that we are currently having for the implementation. In the process of making theses changes, we have also made the various initialization classes generic (which removes quite a bit of code). The questions that I have are: 1. Where should the definition of the initialization for these extra parameters be placed? On the individual? In the EC algorithm? Within the IterationStrategy? 2. How should mutation be handled? Should the strategies know to inspect the individual for strategy parameters? Should the mutation rather be done in a separate class? Regards, Gary |
From: Gary P. <gpa...@gm...> - 2009-07-08 08:09:04
|
Stupid static state! It's the one thing that breaks my inner child on a daily basis :( I truly hate it because it's useful for normal code (I could debate that) but it breaks testing in a spectacular way - yes, that's a bad thing. A *very* bad thing. I REALLY want to fix this problem - it's a serious bug to be honest. We shouldn't have any static state in CIlib. You will need to kinda "register" an algorithm (mock or real) and then run the test code. The algorithm will need to have it's current algorithm placed on the internal algorithm stack so that the Algorithm.get() will work. On the other hand, this depends on how you are testing your code. Could you please provide the unit test method? Regards, Gary On Wednesday 08 July 2009 09:51:33 Marde Greeff wrote: > Hi everyone, > > What is the best way of writing a unit test for testing my dynamic moo > functions? > > In the function's evaluate method, I require access to the higher-level > algorithm's number of iterations: tau = Algorithm.get().getIterations() > > This is then used to calculate the time t that causes the function to > change over time. > > Marde |
From: Marde G. <mg...@cs...> - 2009-07-08 07:54:07
|
Hi everyone, What is the best way of writing a unit test for testing my dynamic moo functions? In the function's evaluate method, I require access to the higher-level algorithm's number of iterations: tau = Algorithm.get().getIterations() This is then used to calculate the time t that causes the function to change over time. Marde -- This message is subject to the CSIR's copyright terms and conditions, e-mail legal notice, and implemented Open Document Format (ODF) standard. The full disclaimer details can be found at http://www.csir.co.za/disclaimer.html. This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean. MailScanner thanks Transtec Computers for their support. |
From: Marde G. <mg...@cs...> - 2009-07-07 15:57:30
|
-- This message is subject to the CSIR's copyright terms and conditions, e-mail legal notice, and implemented Open Document Format (ODF) standard. The full disclaimer details can be found at http://www.csir.co.za/disclaimer.html. This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean. MailScanner thanks Transtec Computers for their support. |
From: Gary P. <gpa...@gm...> - 2009-07-07 14:41:34
|
Yeah, sadly. We plan to have this sorted sooner than later. It's on the priority list. Marde, until then, please mark all these classes with @Deprecated (both the annotation and the javadoc) and comment why they are deprecated. The clean up will be simpler then. Regards, Gary On Tue, Jul 7, 2009 at 4:37 PM, Marde Greeff<mg...@cs...> wrote: > Hi Wiehann, > > Thanx for the explanation. So I guess for now I will create duplicate classes for the changes that I want to make to ensure that I don't break other people's code. I will then fix it when we start to use the google-guice library. > > So when I send through a patch that does this, everyone should remember that this is the reason for the duplication. > > Marde > >>>> Wiehann Matthysen <wie...@ro...> 07/07/09 4:32 PM >>> > Hallo Marde, > > Yes, it is the same issue as trying to set the size of the Archive. The > problem can be described as follows: you want to have an archive that > you can access throughout the simulation. Thus, I made the archive a > ThreadLocal variable which means that you can have static (within a > thread) access to this archive. You want to have this type of access > because you might want to select a guide from the archive as well (from > within one of the guide-selection strategy classes). > > The problem comes in when you perform the setup of the archive from xml: > you can successfully set the archive within the ArchivingIterationStep > tag. But when you create another simulation and clone > ArchivingIterationStep it doesn't clone the archive because the archive > is a threadlocal variable stored within the Archive class. This will be > solved when we use the google-guice library as you will be able to > inject this dependency in a simulation-scope. > > Regards, > > Wiehann > > Marde Greeff wrote: >> Hi everyone, >> >> An example xml file is attached. >> >> The part to focus on is the following: >> >> <iterationStrategy class="moo.iterationstrategies.ArchivingIterationStrategy"> >> <archive class="moo.archive.constrained.SetBasedConstrainedArchive" capacity="200"> >> <pruningSelection class="util.selection.recipes.ElitistSelection"/> >> </archive> >> >> You can set the comparator as follows: >> <iterationStrategy class="moo.iterationstrategies.ArchivingIterationStrategy"> >> <archive class="moo.archive.constrained.SetBasedConstrainedArchive" capacity="200"> >> <pruningSelection class="util.selection.recipes.ElitistSelection"> >> <comparator class="util.selection.ordering.DefaultComparator/> >> </pruningSelection> >> </archive> >> >> However, if I change the DefaultComparator to any other new comparator (for example when I want to sort solutions based on their distance from other solutions in the archive and not based on fitness) it doesn't make the change. It keeps the DefaultComparator. I guess this is the same as with the archive size issue. >> >> Marde >> >> >>>>> Gary Pampara <gpa...@gm...> 07/07/09 8:00 AM >>> >>>>> >> This is based on the usage. >> >> Awaiting XML file to inspect how this is being used. The issue is more than >> likely related to the use of the entity.operator.selection classes - which >> need to be updated to use the relavant recipe classes. >> >> On Tuesday 07 July 2009 07:55:08 Gary Pampara wrote: >> >>> Forwarding message to devel list: >>> >>> >>> Hi, >>> >>> I am running into more and more problems since I cannot set/change values. >>> For example, if I want to use a different comparator with the sorting >>> stuff, I cannot just set it. I keeps the default setting. This will mean >>> that I would have to create duplicate classes to handle this. There will >>> probably be quite a few of these cases in future, when others also start to >>> run into this problem. >>> >>> Should I just go ahead with duplication. This will not be good in the end. >>> >>> What is the best way of handling this? >>> >>> Marde >>> >> >> ------------------------------------------------------------------------------ >> Enter the BlackBerry Developer Challenge >> This is your chance to win up to $100,000 in prizes! For a limited time, >> vendors submitting new applications to BlackBerry App World(TM) will have >> the opportunity to enter the BlackBerry Developer Challenge. See full prize >> details at: http://p.sf.net/sfu/blackberry >> _______________________________________________ >> cilib-devel mailing list >> cil...@li... >> https://lists.sourceforge.net/lists/listinfo/cilib-devel >> >> >> >> ------------------------------------------------------------------------ >> >> ------------------------------------------------------------------------------ >> Enter the BlackBerry Developer Challenge >> This is your chance to win up to $100,000 in prizes! For a limited time, >> vendors submitting new applications to BlackBerry App World(TM) will have >> the opportunity to enter the BlackBerry Developer Challenge. See full prize >> details at: http://p.sf.net/sfu/blackberry >> ------------------------------------------------------------------------ >> >> _______________________________________________ >> cilib-devel mailing list >> cil...@li... >> https://lists.sourceforge.net/lists/listinfo/cilib-devel >> > > > > -- > This message is subject to the CSIR's copyright terms and conditions, e-mail legal notice, and implemented Open Document Format (ODF) standard. > The full disclaimer details can be found at http://www.csir.co.za/disclaimer.html. > > This message has been scanned for viruses and dangerous content by MailScanner, > and is believed to be clean. MailScanner thanks Transtec Computers for their support. > > |
From: Marde G. <mg...@cs...> - 2009-07-07 14:39:16
|
Hi Wiehann, Thanx for the explanation. So I guess for now I will create duplicate classes for the changes that I want to make to ensure that I don't break other people's code. I will then fix it when we start to use the google-guice library. So when I send through a patch that does this, everyone should remember that this is the reason for the duplication. Marde >>> Wiehann Matthysen <wie...@ro...> 07/07/09 4:32 PM >>> Hallo Marde, Yes, it is the same issue as trying to set the size of the Archive. The problem can be described as follows: you want to have an archive that you can access throughout the simulation. Thus, I made the archive a ThreadLocal variable which means that you can have static (within a thread) access to this archive. You want to have this type of access because you might want to select a guide from the archive as well (from within one of the guide-selection strategy classes). The problem comes in when you perform the setup of the archive from xml: you can successfully set the archive within the ArchivingIterationStep tag. But when you create another simulation and clone ArchivingIterationStep it doesn't clone the archive because the archive is a threadlocal variable stored within the Archive class. This will be solved when we use the google-guice library as you will be able to inject this dependency in a simulation-scope. Regards, Wiehann Marde Greeff wrote: > Hi everyone, > > An example xml file is attached. > > The part to focus on is the following: > > <iterationStrategy class="moo.iterationstrategies.ArchivingIterationStrategy"> > <archive class="moo.archive.constrained.SetBasedConstrainedArchive" capacity="200"> > <pruningSelection class="util.selection.recipes.ElitistSelection"/> > </archive> > > You can set the comparator as follows: > <iterationStrategy class="moo.iterationstrategies.ArchivingIterationStrategy"> > <archive class="moo.archive.constrained.SetBasedConstrainedArchive" capacity="200"> > <pruningSelection class="util.selection.recipes.ElitistSelection"> > <comparator class="util.selection.ordering.DefaultComparator/> > </pruningSelection> > </archive> > > However, if I change the DefaultComparator to any other new comparator (for example when I want to sort solutions based on their distance from other solutions in the archive and not based on fitness) it doesn't make the change. It keeps the DefaultComparator. I guess this is the same as with the archive size issue. > > Marde > > >>>> Gary Pampara <gpa...@gm...> 07/07/09 8:00 AM >>> >>>> > This is based on the usage. > > Awaiting XML file to inspect how this is being used. The issue is more than > likely related to the use of the entity.operator.selection classes - which > need to be updated to use the relavant recipe classes. > > On Tuesday 07 July 2009 07:55:08 Gary Pampara wrote: > >> Forwarding message to devel list: >> >> >> Hi, >> >> I am running into more and more problems since I cannot set/change values. >> For example, if I want to use a different comparator with the sorting >> stuff, I cannot just set it. I keeps the default setting. This will mean >> that I would have to create duplicate classes to handle this. There will >> probably be quite a few of these cases in future, when others also start to >> run into this problem. >> >> Should I just go ahead with duplication. This will not be good in the end. >> >> What is the best way of handling this? >> >> Marde >> > > ------------------------------------------------------------------------------ > Enter the BlackBerry Developer Challenge > This is your chance to win up to $100,000 in prizes! For a limited time, > vendors submitting new applications to BlackBerry App World(TM) will have > the opportunity to enter the BlackBerry Developer Challenge. See full prize > details at: http://p.sf.net/sfu/blackberry > _______________________________________________ > cilib-devel mailing list > cil...@li... > https://lists.sourceforge.net/lists/listinfo/cilib-devel > > > > ------------------------------------------------------------------------ > > ------------------------------------------------------------------------------ > Enter the BlackBerry Developer Challenge > This is your chance to win up to $100,000 in prizes! For a limited time, > vendors submitting new applications to BlackBerry App World(TM) will have > the opportunity to enter the BlackBerry Developer Challenge. See full prize > details at: http://p.sf.net/sfu/blackberry > ------------------------------------------------------------------------ > > _______________________________________________ > cilib-devel mailing list > cil...@li... > https://lists.sourceforge.net/lists/listinfo/cilib-devel > -- This message is subject to the CSIR's copyright terms and conditions, e-mail legal notice, and implemented Open Document Format (ODF) standard. The full disclaimer details can be found at http://www.csir.co.za/disclaimer.html. This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean. MailScanner thanks Transtec Computers for their support. |