Author: sebb
Date: Sat Jun 20 22:17:36 2009
New Revision: 786918

URL: http://svn.apache.org/viewvc?rev=786918&view=rev
Log:
Fix thread-safety issues
- code failed to use synch. read
- code could potentially use two different random Generators if another thread 
changed it

Modified:
    
commons/proper/math/trunk/src/java/org/apache/commons/math/genetics/GeneticAlgorithm.java

Modified: 
commons/proper/math/trunk/src/java/org/apache/commons/math/genetics/GeneticAlgorithm.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/java/org/apache/commons/math/genetics/GeneticAlgorithm.java?rev=786918&r1=786917&r2=786918&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/java/org/apache/commons/math/genetics/GeneticAlgorithm.java
 (original)
+++ 
commons/proper/math/trunk/src/java/org/apache/commons/math/genetics/GeneticAlgorithm.java
 Sat Jun 20 22:17:36 2009
@@ -24,7 +24,7 @@
  * of the algorithm can be configured for a specific problem.
  *
  * @since 2.0
- * @version $Revision:$ $Date:$
+ * @version $Revision$ $Date$
  */
 public class GeneticAlgorithm {
 
@@ -34,6 +34,7 @@
      * Use {...@link #setRandomGenerator(RandomGenerator)} to supply an 
alternative
      * to the default JDK-provided PRNG.
      */
+    //@GuardedBy("this")
     private static RandomGenerator randomGenerator = new JDKRandomGenerator();
     
     /**
@@ -74,7 +75,7 @@
      * @param crossoverRate The crossover rate as a percentage (0-1 inclusive)
      * @param mutationPolicy The {...@link MutationPolicy}
      * @param mutationRate The mutation rate as a percentage (0-1 inclusive)
-     * @param selectionPolicy The {...@link selectionPolicy}
+     * @param selectionPolicy The {...@link SelectionPolicy}
      */
     public GeneticAlgorithm(
             CrossoverPolicy crossoverPolicy, double crossoverRate,
@@ -134,18 +135,20 @@
     public Population nextGeneration(Population current) {
         Population nextGeneration = current.nextGeneration();
 
+        RandomGenerator randGen = getRandomGenerator();
+        
         while (nextGeneration.getPopulationSize() < 
nextGeneration.getPopulationLimit()) {
             // select parent chromosomes
             ChromosomePair pair = getSelectionPolicy().select(current);
 
             // crossover?
-            if (randomGenerator.nextDouble() < getCrossoverRate()) {
+            if (randGen.nextDouble() < getCrossoverRate()) {
                 // apply crossover policy to create two offspring
                 pair = getCrossoverPolicy().crossover(pair.getFirst(), 
pair.getSecond());
             }
 
             // mutation?
-            if (randomGenerator.nextDouble() < getMutationRate()) {
+            if (randGen.nextDouble() < getMutationRate()) {
                 // apply mutation policy to the chromosomes
                 pair = new ChromosomePair(
                     getMutationPolicy().mutate(pair.getFirst()),


Reply via email to