[jboss-svn-commits] JBL Code SVN: r33562 - in labs/jbossrules/trunk/drools-planner: drools-planner-core/src/main/java/org/drools/planner/config/localsearch/decider/acceptor and 21 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Jun 19 13:44:09 EDT 2010


Author: ge0ffrey
Date: 2010-06-19 13:44:08 -0400 (Sat, 19 Jun 2010)
New Revision: 33562

Added:
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/TimeGradientBasedSimulatedAnnealingAcceptor.java
Modified:
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/LocalSearchSolverConfig.java
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/decider/acceptor/AcceptorConfig.java
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/decider/forager/ForagerConfig.java
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/decider/selector/SelectorConfig.java
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/DefaultLocalSearchSolver.java
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/DefaultDecider.java
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/SimulatedAnnealingAcceptor.java
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/forager/AcceptedForager.java
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/forager/AcceptedMoveScopeComparator.java
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/selector/CompositeSelector.java
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/selector/MoveFactorySelector.java
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/selector/Selector.java
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/selector/TopListSelector.java
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/test/java/org/drools/planner/core/localsearch/decider/forager/AcceptedForagerTest.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/examination/solver/selector/AllMovesOfOneExamSelector.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/curriculumcourse/benchmark/curriculumCourseSolverBenchmarkConfig.xml
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/curriculumcourse/benchmark/curriculumCourseStepLimitSolverBenchmarkConfig.xml
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/curriculumcourse/solver/curriculumCourseSolverConfig.xml
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/examination/benchmark/examinationSolverBenchmarkConfig.xml
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/examination/benchmark/examinationStepLimitSolverBenchmarkConfig.xml
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/examination/solver/examinationSolverConfig.xml
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/manners2009/solver/manners2009SolverConfig.xml
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nqueens/solver/nqueensSolverConfig.xml
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringLongSolverBenchmarkConfig.xml
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringMediumSolverBenchmarkConfig.xml
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringSprintSolverBenchmarkConfig.xml
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringStepLimitSolverBenchmarkConfig.xml
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/competition/nurseRosteringCompetitionLongSolverConfig.xml
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/competition/nurseRosteringCompetitionMediumSolverConfig.xml
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/competition/nurseRosteringCompetitionSprintSolverConfig.xml
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/pas/benchmark/patientAdmissionScheduleSolverBenchmarkConfig.xml
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/pas/solver/patientAdmissionScheduleSolverConfig.xml
   labs/jbossrules/trunk/drools-planner/src/main/assembly/docs/UpgradeFromPreviousVersionRecipe.txt
Log:
Decent simulated annealing support:
- refactor out relativeSelection and absoluteSelection in favor of minimalAcceptedSelection
- Selector interface now returns an Iterator instead of a List
- first decent simulated annealing implementation

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/LocalSearchSolverConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/LocalSearchSolverConfig.java	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/LocalSearchSolverConfig.java	2010-06-19 17:44:08 UTC (rev 33562)
@@ -318,8 +318,7 @@
          * In this mode, 2 runs on the same computer will execute the same code in the same order.
          * They will also yield the same result, except if they use a time based termination
          * and they have a sufficiently large difference in allocated CPU time.
-         * This allows you to benchmark new optimizations (such as a new move implementation
-         * or a different absoluteSelection setting) fairly.
+         * This allows you to benchmark new optimizations (such as a new move implementation) fairly.
          * <p>
          * The reproducible mode is not much slower than the production mode.
          * </p>

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/decider/acceptor/AcceptorConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/decider/acceptor/AcceptorConfig.java	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/decider/acceptor/AcceptorConfig.java	2010-06-19 17:44:08 UTC (rev 33562)
@@ -35,6 +35,8 @@
     protected Integer completeSolutionTabuSize = null;
     protected Integer partialSolutionTabuSize = null;
 
+    protected Double simulatedAnnealingStartingTemperature = null;
+
     protected Double greatDelugeWaterLevelUpperBoundRate = null;
     protected Double greatDelugeWaterRisingRate = null;
 
@@ -126,10 +128,26 @@
         this.partialSolutionTabuSize = partialSolutionTabuSize;
     }
 
+    public Double getSimulatedAnnealingStartingTemperature() {
+        return simulatedAnnealingStartingTemperature;
+    }
+
+    public void setSimulatedAnnealingStartingTemperature(Double simulatedAnnealingStartingTemperature) {
+        this.simulatedAnnealingStartingTemperature = simulatedAnnealingStartingTemperature;
+    }
+
+    public Double getGreatDelugeWaterLevelUpperBoundRate() {
+        return greatDelugeWaterLevelUpperBoundRate;
+    }
+
     public void setGreatDelugeWaterLevelUpperBoundRate(Double greatDelugeWaterLevelUpperBoundRate) {
         this.greatDelugeWaterLevelUpperBoundRate = greatDelugeWaterLevelUpperBoundRate;
     }
 
+    public Double getGreatDelugeWaterRisingRate() {
+        return greatDelugeWaterRisingRate;
+    }
+
     public void setGreatDelugeWaterRisingRate(Double greatDelugeWaterRisingRate) {
         this.greatDelugeWaterRisingRate = greatDelugeWaterRisingRate;
     }
@@ -201,8 +219,12 @@
             }
             acceptorList.add(solutionTabuAcceptor);
         }
-        if ((acceptorTypeList != null && acceptorTypeList.contains(AcceptorType.SIMULATED_ANNEALING))) {
+        if ((acceptorTypeList != null && acceptorTypeList.contains(AcceptorType.SIMULATED_ANNEALING))
+                || simulatedAnnealingStartingTemperature != null) {
             SimulatedAnnealingAcceptor simulatedAnnealingAcceptor = new SimulatedAnnealingAcceptor();
+            if (simulatedAnnealingStartingTemperature != null) {
+                simulatedAnnealingAcceptor.setStartingTemperature(simulatedAnnealingStartingTemperature);
+            }
             acceptorList.add(simulatedAnnealingAcceptor);
         }
         if ((acceptorTypeList != null && acceptorTypeList.contains(AcceptorType.GREAT_DELUGE))
@@ -270,6 +292,15 @@
         if (partialSolutionTabuSize == null) {
             partialSolutionTabuSize = inheritedConfig.getPartialSolutionTabuSize();
         }
+        if (simulatedAnnealingStartingTemperature == null) {
+            simulatedAnnealingStartingTemperature = inheritedConfig.getSimulatedAnnealingStartingTemperature();
+        }
+        if (greatDelugeWaterLevelUpperBoundRate == null) {
+            greatDelugeWaterLevelUpperBoundRate = inheritedConfig.getGreatDelugeWaterLevelUpperBoundRate();
+        }
+        if (greatDelugeWaterRisingRate == null) {
+            greatDelugeWaterRisingRate = inheritedConfig.getGreatDelugeWaterRisingRate();
+        }
     }
 
     public static enum AcceptorType {

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/decider/forager/ForagerConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/decider/forager/ForagerConfig.java	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/decider/forager/ForagerConfig.java	2010-06-19 17:44:08 UTC (rev 33562)
@@ -15,6 +15,8 @@
     private Class<Forager> foragerClass = null;
     private ForagerType foragerType = null;
 
+    protected Integer minimalAcceptedSelection = null;
+
     public Forager getForager() {
         return forager;
     }
@@ -39,6 +41,14 @@
         this.foragerType = foragerType;
     }
 
+    public Integer getMinimalAcceptedSelection() {
+        return minimalAcceptedSelection;
+    }
+
+    public void setMinimalAcceptedSelection(Integer minimalAcceptedSelection) {
+        this.minimalAcceptedSelection = minimalAcceptedSelection;
+    }
+
     // ************************************************************************
     // Builder methods
     // ************************************************************************
@@ -56,29 +66,40 @@
                 throw new IllegalArgumentException("foragerClass (" + foragerClass.getName()
                         + ") does not have a public no-arg constructor", e);
             }
-        } else if (foragerType != null) {
+        }
+        PickEarlyByScore pickEarlyByScore;
+        if (foragerType != null) {
             switch (foragerType) {
                 case MAX_SCORE_OF_ALL:
-                    return new AcceptedForager(PickEarlyByScore.NONE, false);
+                    pickEarlyByScore = PickEarlyByScore.NONE;
+                    break;
                 case FIRST_BEST_SCORE_IMPROVING:
-                    return new AcceptedForager(PickEarlyByScore.FIRST_BEST_SCORE_IMPROVING, false);
+                    pickEarlyByScore = PickEarlyByScore.FIRST_BEST_SCORE_IMPROVING;
+                    break;
                 case FIRST_LAST_STEP_SCORE_IMPROVING:
-                    return new AcceptedForager(PickEarlyByScore.FIRST_LAST_STEP_SCORE_IMPROVING, false);
+                    pickEarlyByScore = PickEarlyByScore.FIRST_LAST_STEP_SCORE_IMPROVING;
+                    break;
                 case FIRST_RANDOMLY_ACCEPTED:
-                    return new AcceptedForager(PickEarlyByScore.NONE, true);
+                    pickEarlyByScore = PickEarlyByScore.NONE;
+                    break;
                 default:
                     throw new IllegalStateException("The foragerType (" + foragerType + ") is not implemented");
             }
         } else {
-            return new AcceptedForager(PickEarlyByScore.NONE, false);
+            pickEarlyByScore = PickEarlyByScore.NONE;
         }
+        int minimalAcceptedSelection = (this.minimalAcceptedSelection == null)
+                ? Integer.MAX_VALUE : this.minimalAcceptedSelection;
+
+        return new AcceptedForager(pickEarlyByScore, minimalAcceptedSelection);
     }
 
     public void inherit(ForagerConfig inheritedConfig) {
-        if (forager == null && foragerClass == null && foragerType == null) {
+        if (forager == null && foragerClass == null && foragerType == null && minimalAcceptedSelection == null) {
             forager = inheritedConfig.getForager();
             foragerClass = inheritedConfig.getForagerClass();
             foragerType = inheritedConfig.getForagerType();
+            minimalAcceptedSelection = inheritedConfig.getMinimalAcceptedSelection();
         }
     }
 

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/decider/selector/SelectorConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/decider/selector/SelectorConfig.java	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/decider/selector/SelectorConfig.java	2010-06-19 17:44:08 UTC (rev 33562)
@@ -23,8 +23,6 @@
     private MoveFactory moveFactory = null;
     private Class<MoveFactory> moveFactoryClass = null;
     protected Boolean shuffle = null;
-    protected Double relativeSelection = null;
-    protected Integer absoluteSelection = null;
 
     private Integer topSize = null;
 
@@ -60,22 +58,6 @@
         this.shuffle = shuffle;
     }
 
-    public Double getRelativeSelection() {
-        return relativeSelection;
-    }
-
-    public void setRelativeSelection(Double relativeSelection) {
-        this.relativeSelection = relativeSelection;
-    }
-
-    public Integer getAbsoluteSelection() {
-        return absoluteSelection;
-    }
-
-    public void setAbsoluteSelection(Integer absoluteSelection) {
-        this.absoluteSelection = absoluteSelection;
-    }
-
     public Integer getTopSize() {
         return topSize;
     }
@@ -117,14 +99,8 @@
             if (shuffle != null) {
                 selector.setShuffle(shuffle.booleanValue());
             } else {
-                selector.setShuffle(relativeSelection != null || absoluteSelection != null);
+                selector.setShuffle(true);
             }
-            if (relativeSelection != null) {
-                selector.setRelativeSelection(relativeSelection);
-            }
-            if (absoluteSelection != null) {
-                selector.setAbsoluteSelection(absoluteSelection);
-            }
             return selector;
         } else if (topSize != null) {
             TopListSelector selector = new TopListSelector();
@@ -153,12 +129,6 @@
         if (shuffle == null) {
             shuffle = inheritedConfig.getShuffle();
         }
-        if (relativeSelection == null) {
-            relativeSelection = inheritedConfig.getRelativeSelection();
-        }
-        if (absoluteSelection == null) {
-            absoluteSelection = inheritedConfig.getAbsoluteSelection();
-        }
         if (topSize == null) {
             topSize = inheritedConfig.getTopSize();
         }

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/DefaultLocalSearchSolver.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/DefaultLocalSearchSolver.java	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/DefaultLocalSearchSolver.java	2010-06-19 17:44:08 UTC (rev 33562)
@@ -115,7 +115,7 @@
             decider.decideNextStep(stepScope);
             Move nextStep = stepScope.getStep();
             if (nextStep == null) {
-                // TODO JBRULES-2213 do not terminate, but warn and try again (especially with relativeSelection)
+                // TODO JBRULES-2213 do not terminate, but warn and try again
                 logger.warn("No move accepted for step index ({}) out of {} accepted moves. Terminating by exception.",
                         stepScope.getStepIndex(), decider.getForager().getAcceptedMovesSize());
                 break;

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/DefaultDecider.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/DefaultDecider.java	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/DefaultDecider.java	2010-06-19 17:44:08 UTC (rev 33562)
@@ -1,5 +1,6 @@
 package org.drools.planner.core.localsearch.decider;
 
+import java.util.Iterator;
 import java.util.List;
 
 import org.drools.WorkingMemory;
@@ -86,8 +87,9 @@
 
     public void decideNextStep(StepScope stepScope) {
         WorkingMemory workingMemory = stepScope.getWorkingMemory();
-        List<Move> moveList = selector.selectMoveList(stepScope);
-        for (Move move : moveList) {
+        Iterator<Move> moveIterator = selector.moveIterator(stepScope);
+        while (moveIterator.hasNext()) {
+            Move move = moveIterator.next();
             MoveScope moveScope = new MoveScope(stepScope);
             moveScope.setMove(move);
             // Filter out not doable moves

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/SimulatedAnnealingAcceptor.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/SimulatedAnnealingAcceptor.java	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/SimulatedAnnealingAcceptor.java	2010-06-19 17:44:08 UTC (rev 33562)
@@ -1,43 +1,69 @@
 package org.drools.planner.core.localsearch.decider.acceptor.simulatedannealing;
 
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Random;
+
+import org.drools.planner.core.localsearch.StepScope;
 import org.drools.planner.core.localsearch.decider.MoveScope;
 import org.drools.planner.core.localsearch.decider.acceptor.AbstractAcceptor;
 import org.drools.planner.core.localsearch.LocalSearchSolverScope;
 import org.drools.planner.core.score.Score;
 
 /**
- * TODO Under construction. Feel free to create a patch to improve this acceptor!
  * @author Geoffrey De Smet
  */
 public class SimulatedAnnealingAcceptor extends AbstractAcceptor {
 
-    protected boolean compareToBestScore = false;
+    protected double startingTemperature = -1.0;
+    protected double temperatureSurvival = 0.997;
 
-    public void setCompareToBestScore(boolean compareToBestScore) {
-        this.compareToBestScore = compareToBestScore;
+    protected double temperature;
+
+    public void setStartingTemperature(double startingTemperature) {
+        this.startingTemperature = startingTemperature;
     }
 
     // ************************************************************************
     // Worker methods
     // ************************************************************************
 
+    @Override
+    public void solvingStarted(LocalSearchSolverScope localSearchSolverScope) {
+        if (startingTemperature < 0.0) {
+            throw new IllegalArgumentException("The startingTemperature (" + startingTemperature
+                    + ") cannot be negative.");
+        }
+        temperature = startingTemperature;
+    }
+
     public double calculateAcceptChance(MoveScope moveScope) {
-        Score compareScore = compareToBestScore
-                ? moveScope.getStepScope().getLocalSearchSolverScope().getBestScore()
-                : moveScope.getStepScope().getLocalSearchSolverScope().getLastCompletedStepScope().getScore();
-        // TODO Support for decision score
+        LocalSearchSolverScope localSearchSolverScope = moveScope.getStepScope().getLocalSearchSolverScope();
+        Score lastStepScore = localSearchSolverScope.getLastCompletedStepScope().getScore();
         Score moveScore = moveScope.getScore();
-        if (moveScore.compareTo(compareScore) > 0) {
-            // It's better so accept it.
+        if (moveScore.compareTo(lastStepScore) > 0) {
             return 1.0;
         }
-        double timeGradient = moveScope.getStepScope().getTimeGradient();
-        LocalSearchSolverScope localSearchSolverScope = moveScope.getStepScope().getLocalSearchSolverScope();
-        // TODO This algorithm might be nice, but the normal temparture based algorithm should also be possible
-        double scoreDelta = 1.0 - localSearchSolverScope.getScoreDefinition().calculateTimeGradient(
-                localSearchSolverScope.getStartingScore(), compareScore, moveScore);
-        double acceptChance = Math.exp(timeGradient * scoreDelta);
-        return acceptChance;
+        Score scoreDifference = lastStepScore.subtract(moveScore);
+        // TODO don't abuse translateScoreToGraphValue
+        Double diff = localSearchSolverScope.getScoreDefinition().translateScoreToGraphValue(scoreDifference);
+        if (diff == null) {
+            // more hard constraints broken, ignore it for now
+            return 0.0;
+        }
+        double acceptChance = Math.exp(-diff / temperature);
+        if (moveScope.getWorkingRandom().nextDouble() < acceptChance) {
+            return 1.0;
+        } else {
+            return 0.0;
+        }
     }
-    
+
+    @Override
+    public void stepTaken(StepScope stepScope) {
+        super.stepTaken(stepScope);
+        temperature *= temperatureSurvival;
+//        System.out.println("temp: " + temperature);
+    }
+
 }

Copied: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/TimeGradientBasedSimulatedAnnealingAcceptor.java (from rev 33474, labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/SimulatedAnnealingAcceptor.java)
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/TimeGradientBasedSimulatedAnnealingAcceptor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/TimeGradientBasedSimulatedAnnealingAcceptor.java	2010-06-19 17:44:08 UTC (rev 33562)
@@ -0,0 +1,43 @@
+package org.drools.planner.core.localsearch.decider.acceptor.simulatedannealing;
+
+import org.drools.planner.core.localsearch.LocalSearchSolverScope;
+import org.drools.planner.core.localsearch.decider.MoveScope;
+import org.drools.planner.core.localsearch.decider.acceptor.AbstractAcceptor;
+import org.drools.planner.core.score.Score;
+
+/**
+ * TODO Under construction. Feel free to create a patch to improve this acceptor!
+ * @author Geoffrey De Smet
+ */
+public class TimeGradientBasedSimulatedAnnealingAcceptor extends AbstractAcceptor {
+
+    protected boolean compareToBestScore = false;
+
+    public void setCompareToBestScore(boolean compareToBestScore) {
+        this.compareToBestScore = compareToBestScore;
+    }
+
+    // ************************************************************************
+    // Worker methods
+    // ************************************************************************
+
+    public double calculateAcceptChance(MoveScope moveScope) {
+        Score compareScore = compareToBestScore
+                ? moveScope.getStepScope().getLocalSearchSolverScope().getBestScore()
+                : moveScope.getStepScope().getLocalSearchSolverScope().getLastCompletedStepScope().getScore();
+        // TODO Support for decision score
+        Score moveScore = moveScope.getScore();
+        if (moveScore.compareTo(compareScore) > 0) {
+            // It's better so accept it.
+            return 1.0;
+        }
+        double timeGradient = moveScope.getStepScope().getTimeGradient();
+        LocalSearchSolverScope localSearchSolverScope = moveScope.getStepScope().getLocalSearchSolverScope();
+        // TODO This algorithm might be nice, but the normal temperature based algorithm should also be possible
+        double scoreDelta = 1.0 - localSearchSolverScope.getScoreDefinition().calculateTimeGradient(
+                localSearchSolverScope.getStartingScore(), compareScore, moveScore);
+        double acceptChance = Math.exp(timeGradient * scoreDelta);
+        return acceptChance;
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/forager/AcceptedForager.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/forager/AcceptedForager.java	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/forager/AcceptedForager.java	2010-06-19 17:44:08 UTC (rev 33562)
@@ -21,9 +21,11 @@
 
     // final to allow better hotspot optimization. TODO prove that it indeed makes a difference
     protected final PickEarlyByScore pickEarlyByScore;
-    protected final boolean pickEarlyRandomly;
-    protected final AcceptedMoveScopeComparator acceptedMoveScopeComparator;
+    protected final int minimalAcceptedSelection;
 
+    protected AcceptedMoveScopeComparator acceptedMoveScopeComparator;
+
+    protected int selectedCount;
     protected List<MoveScope> acceptedList;
     protected boolean listSorted;
     protected Score maxScore;
@@ -31,19 +33,9 @@
 
     protected MoveScope earlyPickedMoveScope = null;
 
-    public AcceptedForager() {
-        this(PickEarlyByScore.NONE, false);
-    }
-
-    public AcceptedForager(PickEarlyByScore pickEarlyByScore, boolean pickEarlyRandomly) {
-        this(pickEarlyByScore, pickEarlyRandomly, new AcceptedMoveScopeComparator());
-    }
-
-    public AcceptedForager(PickEarlyByScore pickEarlyByScore, boolean pickEarlyRandomly,
-            AcceptedMoveScopeComparator acceptedMoveScopeComparator) {
+    public AcceptedForager(PickEarlyByScore pickEarlyByScore, int minimalAcceptedSelection) {
         this.pickEarlyByScore = pickEarlyByScore;
-        this.pickEarlyRandomly = pickEarlyRandomly;
-        this.acceptedMoveScopeComparator = acceptedMoveScopeComparator;
+        this.minimalAcceptedSelection = minimalAcceptedSelection;
     }
 
     // ************************************************************************
@@ -52,7 +44,8 @@
 
     @Override
     public void beforeDeciding(StepScope stepScope) {
-        acceptedMoveScopeComparator.setDeciderScoreComparator(stepScope.getDeciderScoreComparator());
+        acceptedMoveScopeComparator = new AcceptedMoveScopeComparator(stepScope.getDeciderScoreComparator());
+        selectedCount = 0;
         acceptedList = new ArrayList<MoveScope>(1024); // TODO use size of moveList in decider
         listSorted = false;
         maxScore = stepScope.getLocalSearchSolverScope().getScoreDefinition().getPerfectMinimumScore();
@@ -61,6 +54,7 @@
     }
 
     public void addMove(MoveScope moveScope) {
+        selectedCount++;
         if (moveScope.getAcceptChance() > 0.0) {
             checkPickEarly(moveScope);
             addMoveScopeToAcceptedList(moveScope);
@@ -87,16 +81,6 @@
             default:
                 throw new IllegalStateException("The pickEarlyByScore (" + pickEarlyByScore + ") is not implemented");
         }
-        if (pickEarlyRandomly) {
-            if (moveScope.getAcceptChance() >= 1.0) {
-                earlyPickedMoveScope = moveScope;
-            } else {
-                double randomChance = moveScope.getWorkingRandom().nextDouble();
-                if (randomChance <= moveScope.getAcceptChance()) {
-                    earlyPickedMoveScope = moveScope;
-                }
-            }
-        }
     }
 
     protected void addMoveScopeToAcceptedList(MoveScope moveScope) {
@@ -111,7 +95,7 @@
     }
 
     public boolean isQuitEarly() {
-        return earlyPickedMoveScope != null;
+        return earlyPickedMoveScope != null || acceptedList.size() >= minimalAcceptedSelection;
     }
 
     public MoveScope pickMove(StepScope stepScope) {
@@ -133,8 +117,8 @@
         for (ListIterator<MoveScope> it = acceptedList.listIterator(acceptedList.size()); it.hasPrevious();) {
             MoveScope moveScope = it.previous();
             acceptMark -= moveScope.getAcceptChance();
-            // TODO That underflow warn is nonsence. randomChance can be 0.0 and the last acceptMark can end up 0.0
-            // TODO so < is nonsence (do a testcase though)
+            // TODO That underflow warn is nonsense. randomChance can be 0.0 and the last acceptMark can end up 0.0
+            // TODO so < is nonsense (do a testcase though)
             if (acceptMark < 0.0) {
                 pickedMoveScope = moveScope;
                 break;
@@ -142,7 +126,7 @@
         }
         if (pickedMoveScope == null) {
             // TODO This isn't really underflow when an forager accepts only moves with acceptChance 0.0
-            logger.warn("Underflow occured with acceptChanceMaxScoreTotal ({}) " +
+            logger.warn("Underflow occurred with acceptChanceMaxScoreTotal ({}) " +
                     "and randomChance ({}).", acceptChanceMaxScoreTotal, randomChance);
             // Deal with it anyway (no fail-fast here)
             pickedMoveScope = acceptedList.get(acceptedList.size() - 1);

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/forager/AcceptedMoveScopeComparator.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/forager/AcceptedMoveScopeComparator.java	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/forager/AcceptedMoveScopeComparator.java	2010-06-19 17:44:08 UTC (rev 33562)
@@ -11,9 +11,9 @@
  */
 public class AcceptedMoveScopeComparator implements Comparator<MoveScope> {
 
-    private Comparator<? extends Score> deciderScoreComparator;
+    private final Comparator<? extends Score> deciderScoreComparator;
 
-    public void setDeciderScoreComparator(Comparator<? extends Score> deciderScoreComparator) {
+    public AcceptedMoveScopeComparator(Comparator<? extends Score> deciderScoreComparator) {
         this.deciderScoreComparator = deciderScoreComparator;
     }
     

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/selector/CompositeSelector.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/selector/CompositeSelector.java	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/selector/CompositeSelector.java	2010-06-19 17:44:08 UTC (rev 33562)
@@ -1,7 +1,9 @@
 package org.drools.planner.core.localsearch.decider.selector;
 
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Random;
 
 import org.drools.planner.core.localsearch.LocalSearchSolverScope;
 import org.drools.planner.core.localsearch.StepScope;
@@ -46,20 +48,15 @@
         }
     }
 
-    public List<Move> selectMoveList(StepScope stepScope) {
-        int totalSize = 0;
-        List<List<Move>> subMoveLists = new ArrayList<List<Move>>(selectorList.size());
+    public Iterator<Move> moveIterator(StepScope stepScope) {
+        List<Iterator<Move>> moveIteratorList = new ArrayList<Iterator<Move>>(selectorList.size());
         for (Selector selector : selectorList) {
-            List<Move> subMoveList = selector.selectMoveList(stepScope);
-            totalSize += subMoveList.size();
-            subMoveLists.add(subMoveList);
+            Iterator<Move> moveIterator = selector.moveIterator(stepScope);
+            if (moveIterator.hasNext()) {
+                moveIteratorList.add(moveIterator);
+            }
         }
-        List<Move> moveList = new ArrayList<Move>(totalSize);
-        for (List<Move> subMoveList : subMoveLists) {
-            moveList.addAll(subMoveList);
-        }
-        // TODO support overal shuffling
-        return moveList;
+        return new CompositeSelectorMoveIterator(stepScope.getWorkingRandom(), moveIteratorList);
     }
 
     @Override
@@ -83,4 +80,35 @@
         }
     }
 
-}
\ No newline at end of file
+    private static class CompositeSelectorMoveIterator implements Iterator<Move> {
+
+        private final List<Iterator<Move>> moveIteratorList;
+        private final Random workingRandom;
+
+        public CompositeSelectorMoveIterator(Random workingRandom, List<Iterator<Move>> moveIteratorList) {
+            this.moveIteratorList = moveIteratorList;
+            this.workingRandom = workingRandom;
+        }
+
+        public boolean hasNext() {
+            return !moveIteratorList.isEmpty();
+        }
+
+        public Move next() {
+            int moveIteratorIndex = workingRandom.nextInt(moveIteratorList.size());
+            Iterator<Move> moveIterator = moveIteratorList.get(moveIteratorIndex);
+            Move next = moveIterator.next();
+            if (!moveIterator.hasNext()) {
+                moveIteratorList.remove(moveIteratorIndex);
+            }
+            return next;
+        }
+
+        public void remove() {
+            throw new UnsupportedOperationException(
+                    "The remove method is not supported on CompositeSelectorMoveIterator");
+        }
+
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/selector/MoveFactorySelector.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/selector/MoveFactorySelector.java	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/selector/MoveFactorySelector.java	2010-06-19 17:44:08 UTC (rev 33562)
@@ -1,6 +1,7 @@
 package org.drools.planner.core.localsearch.decider.selector;
 
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.List;
 
 import org.drools.planner.core.localsearch.LocalSearchSolverScope;
@@ -17,8 +18,6 @@
     protected MoveFactory moveFactory;
 
     protected boolean shuffle = true;
-    protected Double relativeSelection = null;
-    protected Integer absoluteSelection = null;
 
     public void setMoveFactory(MoveFactory moveFactory) {
         this.moveFactory = moveFactory;
@@ -28,22 +27,6 @@
         this.shuffle = shuffle;
     }
 
-    public void setRelativeSelection(Double relativeSelection) {
-        this.relativeSelection = relativeSelection;
-        if (relativeSelection < 0.0 || relativeSelection > 1.0) {
-            throw new IllegalArgumentException( "The selector's relativeSelection (" + relativeSelection
-                    + ") is not in the range [0.0,1.0].");
-        }
-    }
-
-    public void setAbsoluteSelection(Integer absoluteSelection) {
-        this.absoluteSelection = absoluteSelection;
-        if (absoluteSelection < 1) {
-            throw new IllegalArgumentException( "The selector's absoluteSelection (" + absoluteSelection
-                    + ") must be at least 1.");
-        }
-    }
-
     @Override
     public void setDecider(Decider decider) {
         super.setDecider(decider);
@@ -64,23 +47,15 @@
         moveFactory.beforeDeciding(stepScope);
     }
 
+    public Iterator<Move> moveIterator(StepScope stepScope) {
+        return selectMoveList(stepScope).iterator();
+    }
+
     public List<Move> selectMoveList(StepScope stepScope) {
         List<Move> moveList = moveFactory.createMoveList(stepScope.getWorkingSolution());
         if (shuffle) {
             Collections.shuffle(moveList, stepScope.getWorkingRandom());
         }
-        if (relativeSelection != null) {
-            int selectionSize = (int) Math.ceil(relativeSelection * moveList.size());
-            if (selectionSize == 0 && !moveList.isEmpty()) {
-                selectionSize = 1;
-            }
-            moveList = moveList.subList(0, selectionSize);
-        }
-        if (absoluteSelection != null) {
-            if (moveList.size() > absoluteSelection) {
-                moveList = moveList.subList(0, absoluteSelection);
-            }
-        }
         return moveList;
     }
 

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/selector/Selector.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/selector/Selector.java	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/selector/Selector.java	2010-06-19 17:44:08 UTC (rev 33562)
@@ -1,5 +1,6 @@
 package org.drools.planner.core.localsearch.decider.selector;
 
+import java.util.Iterator;
 import java.util.List;
 
 import org.drools.planner.core.localsearch.LocalSearchSolverLifecycleListener;
@@ -14,6 +15,6 @@
  */
 public interface Selector extends DeciderAware, LocalSearchSolverLifecycleListener {
 
-    List<Move> selectMoveList(StepScope stepScope);
-
-}
\ No newline at end of file
+    Iterator<Move> moveIterator(StepScope stepScope);
+    
+}

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/selector/TopListSelector.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/selector/TopListSelector.java	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/selector/TopListSelector.java	2010-06-19 17:44:08 UTC (rev 33562)
@@ -1,6 +1,7 @@
 package org.drools.planner.core.localsearch.decider.selector;
 
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.List;
 
 import org.drools.planner.core.localsearch.LocalSearchSolverScope;
@@ -29,8 +30,8 @@
         topList = Collections.emptyList();
     }
 
-    public final List<Move> selectMoveList(StepScope stepScope) {
-        return topList;
+    public Iterator<Move> moveIterator(StepScope stepScope) {
+        return topList.iterator();
     }
 
     @Override
@@ -38,4 +39,4 @@
         topList = decider.getForager().getTopList(topSize);
     }
 
-}
\ No newline at end of file
+}

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/test/java/org/drools/planner/core/localsearch/decider/forager/AcceptedForagerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/test/java/org/drools/planner/core/localsearch/decider/forager/AcceptedForagerTest.java	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/test/java/org/drools/planner/core/localsearch/decider/forager/AcceptedForagerTest.java	2010-06-19 17:44:08 UTC (rev 33562)
@@ -25,7 +25,7 @@
     
     public void testPickMoveMaxScoreOfAll() {
         // Setup
-        Forager forager = new AcceptedForager(PickEarlyByScore.NONE, false);
+        Forager forager = new AcceptedForager(PickEarlyByScore.NONE, Integer.MAX_VALUE);
         LocalSearchSolverScope localSearchSolverScope = createLocalSearchSolverScope();
         forager.solvingStarted(localSearchSolverScope);
         StepScope stepScope = createStepScope(localSearchSolverScope);
@@ -61,7 +61,7 @@
 
     public void testPickMoveFirstBestScoreImproving() {
         // Setup
-        Forager forager = new AcceptedForager(PickEarlyByScore.FIRST_BEST_SCORE_IMPROVING, false);
+        Forager forager = new AcceptedForager(PickEarlyByScore.FIRST_BEST_SCORE_IMPROVING, Integer.MAX_VALUE);
         LocalSearchSolverScope localSearchSolverScope = createLocalSearchSolverScope();
         forager.solvingStarted(localSearchSolverScope);
         StepScope stepScope = createStepScope(localSearchSolverScope);
@@ -91,7 +91,7 @@
 
     public void testPickMoveFirstLastStepScoreImproving() {
         // Setup
-        Forager forager = new AcceptedForager(PickEarlyByScore.FIRST_LAST_STEP_SCORE_IMPROVING, false);
+        Forager forager = new AcceptedForager(PickEarlyByScore.FIRST_LAST_STEP_SCORE_IMPROVING, Integer.MAX_VALUE);
         LocalSearchSolverScope localSearchSolverScope = createLocalSearchSolverScope();
         forager.solvingStarted(localSearchSolverScope);
         StepScope stepScope = createStepScope(localSearchSolverScope);
@@ -119,35 +119,35 @@
         forager.solvingEnded(localSearchSolverScope);
     }
 
-    public void testPickMoveRandomly() {
-        // Setup
-        Forager forager = new AcceptedForager(PickEarlyByScore.NONE, true);
-        LocalSearchSolverScope localSearchSolverScope = createLocalSearchSolverScope();
-        forager.solvingStarted(localSearchSolverScope);
-        StepScope stepScope = createStepScope(localSearchSolverScope);
-        forager.beforeDeciding(stepScope);
-        // Pre conditions
-        MoveScope a = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-20), 0.0);
-        MoveScope b = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-1), 0.1);
-        MoveScope c = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-1), 0.0);
-        MoveScope d = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-20), 0.3);
-        // Do stuff
-        forager.addMove(a);
-        assertFalse(forager.isQuitEarly());
-        forager.addMove(b);
-        assertFalse(forager.isQuitEarly());
-        forager.addMove(c);
-        assertFalse(forager.isQuitEarly());
-        forager.addMove(d);
-        assertTrue(forager.isQuitEarly());
-        // Post conditions
-        MoveScope pickedScope = forager.pickMove(stepScope);
-        assertSame(d, pickedScope);
-        List<Move> topList = forager.getTopList(2);
-        assertTrue(topList.contains(b.getMove()));
-        assertTrue(topList.contains(d.getMove()));
-        forager.solvingEnded(localSearchSolverScope);
-    }
+//    public void testPickMoveRandomly() {
+//        // Setup
+//        Forager forager = new AcceptedForager(PickEarlyByScore.NONE, 1);
+//        LocalSearchSolverScope localSearchSolverScope = createLocalSearchSolverScope();
+//        forager.solvingStarted(localSearchSolverScope);
+//        StepScope stepScope = createStepScope(localSearchSolverScope);
+//        forager.beforeDeciding(stepScope);
+//        // Pre conditions
+//        MoveScope a = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-20), 0.0);
+//        MoveScope b = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-1), 0.1);
+//        MoveScope c = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-1), 0.0);
+//        MoveScope d = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-20), 0.3);
+//        // Do stuff
+//        forager.addMove(a);
+//        assertFalse(forager.isQuitEarly());
+//        forager.addMove(b);
+//        assertFalse(forager.isQuitEarly());
+//        forager.addMove(c);
+//        assertFalse(forager.isQuitEarly());
+//        forager.addMove(d);
+//        assertTrue(forager.isQuitEarly());
+//        // Post conditions
+//        MoveScope pickedScope = forager.pickMove(stepScope);
+//        assertSame(d, pickedScope);
+//        List<Move> topList = forager.getTopList(2);
+//        assertTrue(topList.contains(b.getMove()));
+//        assertTrue(topList.contains(d.getMove()));
+//        forager.solvingEnded(localSearchSolverScope);
+//    }
 
     private LocalSearchSolverScope createLocalSearchSolverScope() {
         LocalSearchSolverScope localSearchSolverScope = new LocalSearchSolverScope();
@@ -178,4 +178,4 @@
         return moveScope;
     }
 
-}
\ No newline at end of file
+}

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/examination/solver/selector/AllMovesOfOneExamSelector.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/examination/solver/selector/AllMovesOfOneExamSelector.java	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/examination/solver/selector/AllMovesOfOneExamSelector.java	2010-06-19 17:44:08 UTC (rev 33562)
@@ -3,6 +3,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -91,7 +92,7 @@
         examSwitchMoveFactory.beforeDeciding(stepScope);
     }
 
-    public List<Move> selectMoveList(StepScope stepScope) {
+    public Iterator<Move> moveIterator(StepScope stepScope) {
         if (nextShuffledExamListIndex >= shuffledExamList.size()) {
             // Just in time shuffling
             Collections.shuffle(shuffledExamList, stepScope.getWorkingRandom());
@@ -100,7 +101,7 @@
         Exam exam = shuffledExamList.get(nextShuffledExamListIndex);
         List<Move> moveList = cachedExamToMoveMap.get(exam);
         nextShuffledExamListIndex++;
-        return moveList;
+        return moveList.iterator();
     }
 
     @Override

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/curriculumcourse/benchmark/curriculumCourseSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/curriculumcourse/benchmark/curriculumCourseSolverBenchmarkConfig.xml	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/curriculumcourse/benchmark/curriculumCourseSolverBenchmarkConfig.xml	2010-06-19 17:44:08 UTC (rev 33562)
@@ -38,19 +38,13 @@
             </scoreDefinition>
             <selector>
                 <selector>
-                    <topSize>10</topSize>
-                </selector>
-                <selector>
                     <moveFactoryClass>org.drools.planner.examples.curriculumcourse.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>
-                    <relativeSelection>0.002</relativeSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.curriculumcourse.solver.move.factory.RoomChangeMoveFactory</moveFactoryClass>
-                    <relativeSelection>0.002</relativeSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.curriculumcourse.solver.move.factory.LectureSwitchMoveFactory</moveFactoryClass>
-                    <relativeSelection>0.002</relativeSelection>
                 </selector>
             </selector>
             <acceptor>
@@ -59,6 +53,7 @@
             </acceptor>
             <forager>
                 <foragerType>MAX_SCORE_OF_ALL</foragerType>
+                <minimalAcceptedSelection>900</minimalAcceptedSelection><!-- TODO tweak me -->
             </forager>
         </localSearchSolver>
     </solverBenchmark>

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/curriculumcourse/benchmark/curriculumCourseStepLimitSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/curriculumcourse/benchmark/curriculumCourseStepLimitSolverBenchmarkConfig.xml	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/curriculumcourse/benchmark/curriculumCourseStepLimitSolverBenchmarkConfig.xml	2010-06-19 17:44:08 UTC (rev 33562)
@@ -19,19 +19,13 @@
             </scoreDefinition>
             <selector>
                 <selector>
-                    <topSize>10</topSize>
-                </selector>
-                <selector>
                     <moveFactoryClass>org.drools.planner.examples.curriculumcourse.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>
-                    <relativeSelection>0.002</relativeSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.curriculumcourse.solver.move.factory.RoomChangeMoveFactory</moveFactoryClass>
-                    <relativeSelection>0.002</relativeSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.curriculumcourse.solver.move.factory.LectureSwitchMoveFactory</moveFactoryClass>
-                    <relativeSelection>0.002</relativeSelection>
                 </selector>
             </selector>
             <acceptor>
@@ -41,6 +35,7 @@
             </acceptor>
             <forager>
                 <foragerType>MAX_SCORE_OF_ALL</foragerType>
+        <minimalAcceptedSelection>900</minimalAcceptedSelection><!-- TODO tweak me -->
             </forager>
         </localSearchSolver>
     </solverBenchmark>

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/curriculumcourse/solver/curriculumCourseSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/curriculumcourse/solver/curriculumCourseSolverConfig.xml	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/curriculumcourse/solver/curriculumCourseSolverConfig.xml	2010-06-19 17:44:08 UTC (rev 33562)
@@ -18,19 +18,13 @@
     </termination>
     <selector>
         <selector>
-            <topSize>10</topSize>
-        </selector>
-        <selector>
             <moveFactoryClass>org.drools.planner.examples.curriculumcourse.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>
-            <relativeSelection>0.002</relativeSelection>
         </selector>
         <selector>
             <moveFactoryClass>org.drools.planner.examples.curriculumcourse.solver.move.factory.RoomChangeMoveFactory</moveFactoryClass>
-            <relativeSelection>0.002</relativeSelection>
         </selector>
         <selector>
             <moveFactoryClass>org.drools.planner.examples.curriculumcourse.solver.move.factory.LectureSwitchMoveFactory</moveFactoryClass>
-            <relativeSelection>0.002</relativeSelection>
         </selector>
     </selector>
     <acceptor>
@@ -39,16 +33,15 @@
     </acceptor>
     <forager>
         <foragerType>MAX_SCORE_OF_ALL</foragerType>
+        <minimalAcceptedSelection>900</minimalAcceptedSelection><!-- TODO tweak me -->
     </forager>
     <!-- Great deluge experiments: -->
     <!--<selector>-->
     <!--<selector>-->
     <!--<moveFactoryClass>org.drools.planner.examples.curriculumcourse.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>-->
-    <!--<relativeSelection>0.002</relativeSelection>-->
     <!--</selector>-->
     <!--<selector>-->
     <!--<moveFactoryClass>org.drools.planner.examples.curriculumcourse.solver.move.factory.RoomChangeMoveFactory</moveFactoryClass>-->
-    <!--<relativeSelection>0.002</relativeSelection>-->
     <!--</selector>-->
     <!--<selector>-->
     <!--<moveFactoryClass>org.drools.planner.examples.curriculumcourse.solver.move.factory.LectureSwitchMoveFactory</moveFactoryClass>-->
@@ -62,5 +55,6 @@
     <!--</acceptor>-->
     <!--<forager>-->
     <!--<foragerType>FIRST_RANDOMLY_ACCEPTED</foragerType>-->
+    <!--<minimalAcceptedSelection>900</minimalAcceptedSelection>-->
     <!--</forager>-->
 </localSearchSolver>

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/examination/benchmark/examinationSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/examination/benchmark/examinationSolverBenchmarkConfig.xml	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/examination/benchmark/examinationSolverBenchmarkConfig.xml	2010-06-19 17:44:08 UTC (rev 33562)
@@ -38,15 +38,12 @@
             <selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>
-                    <absoluteSelection>500</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.RoomChangeMoveFactory</moveFactoryClass>
-                    <absoluteSelection>500</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.ExamSwitchMoveFactory</moveFactoryClass>
-                    <absoluteSelection>500</absoluteSelection>
                 </selector>
             </selector>
             <acceptor>
@@ -55,6 +52,7 @@
             </acceptor>
             <forager>
                 <foragerType>MAX_SCORE_OF_ALL</foragerType>
+                <minimalAcceptedSelection>1400</minimalAcceptedSelection><!-- TODO tweak me -->
             </forager>
         </localSearchSolver>
     </solverBenchmark>
@@ -67,15 +65,12 @@
             <selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>
-                    <absoluteSelection>500</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.RoomChangeMoveFactory</moveFactoryClass>
-                    <absoluteSelection>500</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.ExamSwitchMoveFactory</moveFactoryClass>
-                    <absoluteSelection>500</absoluteSelection>
                 </selector>
             </selector>
             <acceptor>
@@ -84,6 +79,7 @@
             </acceptor>
             <forager>
                 <foragerType>MAX_SCORE_OF_ALL</foragerType>
+                <minimalAcceptedSelection>1400</minimalAcceptedSelection><!-- TODO tweak me -->
             </forager>
         </localSearchSolver>
     </solverBenchmark>
@@ -97,15 +93,12 @@
                 <selector class="org.drools.planner.examples.examination.solver.selector.AllMovesOfOneExamSelectorConfig"/>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>
-                    <absoluteSelection>500</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.RoomChangeMoveFactory</moveFactoryClass>
-                    <absoluteSelection>500</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.ExamSwitchMoveFactory</moveFactoryClass>
-                    <absoluteSelection>500</absoluteSelection>
                 </selector>
             </selector>
             <acceptor>
@@ -114,6 +107,7 @@
             </acceptor>
             <forager>
                 <foragerType>MAX_SCORE_OF_ALL</foragerType>
+                <minimalAcceptedSelection>1400</minimalAcceptedSelection><!-- TODO tweak me -->
             </forager>
         </localSearchSolver>
     </solverBenchmark>
@@ -127,15 +121,12 @@
                 <selector class="org.drools.planner.examples.examination.solver.selector.AllMovesOfOneExamSelectorConfig"/>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>
-                    <absoluteSelection>500</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.RoomChangeMoveFactory</moveFactoryClass>
-                    <absoluteSelection>500</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.ExamSwitchMoveFactory</moveFactoryClass>
-                    <absoluteSelection>500</absoluteSelection>
                 </selector>
             </selector>
             <acceptor>
@@ -144,61 +135,8 @@
             </acceptor>
             <forager>
                 <foragerType>MAX_SCORE_OF_ALL</foragerType>
+                <minimalAcceptedSelection>1400</minimalAcceptedSelection><!-- TODO tweak me -->
             </forager>
         </localSearchSolver>
     </solverBenchmark>
-    <!--<solverBenchmark>-->
-        <!--<name>relative0.002_moveTabu7</name>-->
-        <!--<localSearchSolver>-->
-            <!--<deciderScoreComparatorFactory>-->
-                <!--<deciderScoreComparatorFactoryType>NATURAL</deciderScoreComparatorFactoryType>-->
-            <!--</deciderScoreComparatorFactory>-->
-            <!--<selector>-->
-                <!--<selector>-->
-                    <!--<moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>-->
-                    <!--<relativeSelection>0.002</relativeSelection>-->
-                <!--</selector>-->
-                <!--<selector>-->
-                    <!--<moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.RoomChangeMoveFactory</moveFactoryClass>-->
-                    <!--<relativeSelection>0.002</relativeSelection>-->
-                <!--</selector>-->
-                <!--<selector>-->
-                    <!--<moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.ExamSwitchMoveFactory</moveFactoryClass>-->
-                    <!--<relativeSelection>0.002</relativeSelection>-->
-                <!--</selector>-->
-            <!--</selector>-->
-            <!--<acceptor>-->
-                <!--<completeSolutionTabuSize>1000</completeSolutionTabuSize>-->
-                <!--<completeMoveTabuSize>7</completeMoveTabuSize>-->
-            <!--</acceptor>-->
-            <!--<forager>-->
-                <!--<foragerType>MAX_SCORE_OF_ALL</foragerType>-->
-            <!--</forager>-->
-        <!--</localSearchSolver>-->
-    <!--</solverBenchmark>-->
-    <!--<solverBenchmark>-->
-        <!--<name>simulatedAnnealing</name>-->
-        <!--<localSearchSolver>-->
-            <!--<deciderScoreComparatorFactory>-->
-                <!--<deciderScoreComparatorFactoryType>NATURAL</deciderScoreComparatorFactoryType>-->
-            <!--</deciderScoreComparatorFactory>-->
-            <!--<selector>-->
-                <!--<selector>-->
-                    <!--<moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>-->
-                <!--</selector>-->
-                <!--<selector>-->
-                    <!--<moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.RoomChangeMoveFactory</moveFactoryClass>-->
-                <!--</selector>-->
-                <!--<selector>-->
-                    <!--<moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.ExamSwitchMoveFactory</moveFactoryClass>-->
-                <!--</selector>-->
-            <!--</selector>-->
-            <!--<acceptor>-->
-                <!--<acceptorType>SIMULATED_ANNEALING</acceptorType>-->
-            <!--</acceptor>-->
-            <!--<forager>-->
-                <!--<foragerType>FIRST_RANDOMLY_ACCEPTED</foragerType>-->
-            <!--</forager>-->
-        <!--</localSearchSolver>-->
-    <!--</solverBenchmark>-->
 </solverBenchmarkSuite>

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/examination/benchmark/examinationStepLimitSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/examination/benchmark/examinationStepLimitSolverBenchmarkConfig.xml	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/examination/benchmark/examinationStepLimitSolverBenchmarkConfig.xml	2010-06-19 17:44:08 UTC (rev 33562)
@@ -22,15 +22,12 @@
             <selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>
-                    <absoluteSelection>500</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.RoomChangeMoveFactory</moveFactoryClass>
-                    <absoluteSelection>500</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.ExamSwitchMoveFactory</moveFactoryClass>
-                    <absoluteSelection>500</absoluteSelection>
                 </selector>
             </selector>
             <acceptor>
@@ -39,6 +36,7 @@
             </acceptor>
             <forager>
                 <foragerType>MAX_SCORE_OF_ALL</foragerType>
+                <minimalAcceptedSelection>1400</minimalAcceptedSelection><!-- TODO tweak me -->
             </forager>
         </localSearchSolver>
     </solverBenchmark>

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/examination/solver/examinationSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/examination/solver/examinationSolverConfig.xml	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/examination/solver/examinationSolverConfig.xml	2010-06-19 17:44:08 UTC (rev 33562)
@@ -32,15 +32,12 @@
         <!--<selector class="org.drools.planner.examples.examination.solver.selector.AllMovesOfOneExamSelectorConfig"/>-->
         <selector>
             <moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>
-            <absoluteSelection>500</absoluteSelection>
         </selector>
         <selector>
             <moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.RoomChangeMoveFactory</moveFactoryClass>
-            <absoluteSelection>500</absoluteSelection>
         </selector>
         <selector>
             <moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.ExamSwitchMoveFactory</moveFactoryClass>
-            <absoluteSelection>500</absoluteSelection>
         </selector>
     </selector>
     <acceptor>
@@ -49,6 +46,7 @@
     </acceptor>
     <forager>
         <foragerType>MAX_SCORE_OF_ALL</foragerType>
+        <minimalAcceptedSelection>1400</minimalAcceptedSelection><!-- TODO tweak me -->
     </forager>
     <!--<selector>-->
         <!--<moveFactoryClass>org.drools.planner.examples.examination.solver.move.factory.PeriodChangeExaminationMoveFactory</moveFactoryClass>-->

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/manners2009/solver/manners2009SolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/manners2009/solver/manners2009SolverConfig.xml	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/manners2009/solver/manners2009SolverConfig.xml	2010-06-19 17:44:08 UTC (rev 33562)
@@ -19,6 +19,5 @@
     </acceptor>
     <forager>
         <foragerType>MAX_SCORE_OF_ALL</foragerType>
-        <!--<foragerType>FIRST_BEST_SCORE_IMPROVING</foragerType>-->
     </forager>
 </localSearchSolver>

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nqueens/solver/nqueensSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nqueens/solver/nqueensSolverConfig.xml	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nqueens/solver/nqueensSolverConfig.xml	2010-06-19 17:44:08 UTC (rev 33562)
@@ -13,12 +13,12 @@
     </termination>
     <selector>
         <moveFactoryClass>org.drools.planner.examples.nqueens.solver.move.factory.NQueensMoveFactory</moveFactoryClass>
-        <!-- Real world problems require to use of <relativeSelection> or <absoluteSelection>. -->
     </selector>
     <acceptor>
         <completeSolutionTabuSize>1000</completeSolutionTabuSize>
     </acceptor>
     <forager>
         <foragerType>MAX_SCORE_OF_ALL</foragerType>
+        <!-- Real world problems require to use of <minimalAcceptedSelection> -->
     </forager>
 </localSearchSolver>

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringLongSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringLongSolverBenchmarkConfig.xml	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringLongSolverBenchmarkConfig.xml	2010-06-19 17:44:08 UTC (rev 33562)
@@ -38,23 +38,18 @@
             <selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.EmployeeChangeMoveFactory</moveFactoryClass>
-                    <absoluteSelection>300</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSwitchMoveFactory</moveFactoryClass>
-                    <absoluteSelection>300</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSequenceSwitchLength2MoveFactory</moveFactoryClass>
-                    <absoluteSelection>150</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSequenceSwitchLength3MoveFactory</moveFactoryClass>
-                    <absoluteSelection>150</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentPillarPartSwitchMoveFactory</moveFactoryClass>
-                    <absoluteSelection>300</absoluteSelection>
                 </selector>
             </selector>
             <acceptor>
@@ -63,6 +58,7 @@
             </acceptor>
             <forager>
                 <foragerType>MAX_SCORE_OF_ALL</foragerType>
+                <minimalAcceptedSelection>1100</minimalAcceptedSelection>
             </forager>
         </localSearchSolver>
     </solverBenchmark>

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringMediumSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringMediumSolverBenchmarkConfig.xml	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringMediumSolverBenchmarkConfig.xml	2010-06-19 17:44:08 UTC (rev 33562)
@@ -3,19 +3,21 @@
     <benchmarkDirectory>local/data/nurserostering</benchmarkDirectory>
     <solverStatisticType>BEST_SOLUTION_CHANGED</solverStatisticType>
 
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_late01_initialized.xml</inheritedUnsolvedSolutionFile>-->
+
     <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium01.xml</inheritedUnsolvedSolutionFile>
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium02.xml</inheritedUnsolvedSolutionFile>
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium02.xml</inheritedUnsolvedSolutionFile>-->
     <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium03.xml</inheritedUnsolvedSolutionFile>-->
     <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium04.xml</inheritedUnsolvedSolutionFile>-->
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium05.xml</inheritedUnsolvedSolutionFile>
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium05.xml</inheritedUnsolvedSolutionFile>-->
     <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_hint01.xml</inheritedUnsolvedSolutionFile>-->
     <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_hint02.xml</inheritedUnsolvedSolutionFile>-->
     <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_hint03.xml</inheritedUnsolvedSolutionFile>-->
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_late01.xml</inheritedUnsolvedSolutionFile>
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_late02.xml</inheritedUnsolvedSolutionFile>
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_late01.xml</inheritedUnsolvedSolutionFile>-->
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_late02.xml</inheritedUnsolvedSolutionFile>-->
     <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_late03.xml</inheritedUnsolvedSolutionFile>-->
-    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_late04.xml</inheritedUnsolvedSolutionFile>-->
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_late05.xml</inheritedUnsolvedSolutionFile>
+    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_late04.xml</inheritedUnsolvedSolutionFile>
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_late05.xml</inheritedUnsolvedSolutionFile>-->
 
     <inheritedLocalSearchSolver>
         <scoreDrl>/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl</scoreDrl>
@@ -34,20 +36,17 @@
     </inheritedLocalSearchSolver>
 
     <solverBenchmark>
-        <name>absolute300PillarPart</name>
+        <name>selection800PillarPart</name>
         <localSearchSolver>
             <selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.EmployeeChangeMoveFactory</moveFactoryClass>
-                    <absoluteSelection>300</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSwitchMoveFactory</moveFactoryClass>
-                    <absoluteSelection>300</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentPillarPartSwitchMoveFactory</moveFactoryClass>
-                    <absoluteSelection>300</absoluteSelection>
                 </selector>
             </selector>
             <acceptor>
@@ -56,41 +55,32 @@
             </acceptor>
             <forager>
                 <foragerType>MAX_SCORE_OF_ALL</foragerType>
+                <minimalAcceptedSelection>800</minimalAcceptedSelection>
             </forager>
         </localSearchSolver>
     </solverBenchmark>
-    <!--<solverBenchmark>-->
-        <!--<name>absolute300SeqLength2and3PillarPart</name>-->
-        <!--<localSearchSolver>-->
-            <!--<selector>-->
-                <!--<selector>-->
-                    <!--<moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.EmployeeChangeMoveFactory</moveFactoryClass>-->
-                    <!--<absoluteSelection>300</absoluteSelection>-->
-                <!--</selector>-->
-                <!--<selector>-->
-                    <!--<moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSwitchMoveFactory</moveFactoryClass>-->
-                    <!--<absoluteSelection>300</absoluteSelection>-->
-                <!--</selector>-->
-                <!--<selector>-->
-                    <!--<moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSequenceSwitchLength2MoveFactory</moveFactoryClass>-->
-                    <!--<absoluteSelection>150</absoluteSelection>-->
-                <!--</selector>-->
-                <!--<selector>-->
-                    <!--<moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSequenceSwitchLength3MoveFactory</moveFactoryClass>-->
-                    <!--<absoluteSelection>150</absoluteSelection>-->
-                <!--</selector>-->
-                <!--<selector>-->
-                    <!--<moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentPillarPartSwitchMoveFactory</moveFactoryClass>-->
-                    <!--<absoluteSelection>300</absoluteSelection>-->
-                <!--</selector>-->
-            <!--</selector>-->
-            <!--<acceptor>-->
-              <!--<completeSolutionTabuSize>1000</completeSolutionTabuSize>-->
-              <!--<completePropertyTabuSize>11</completePropertyTabuSize>-->
-            <!--</acceptor>-->
-            <!--<forager>-->
-                <!--<foragerType>MAX_SCORE_OF_ALL</foragerType>-->
-            <!--</forager>-->
-        <!--</localSearchSolver>-->
-    <!--</solverBenchmark>-->
+    <solverBenchmark>
+        <name>simulatedAnnealing</name>
+        <localSearchSolver>
+            <selector>
+                <selector>
+                    <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.EmployeeChangeMoveFactory</moveFactoryClass>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSwitchMoveFactory</moveFactoryClass>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentPillarPartSwitchMoveFactory</moveFactoryClass>
+                </selector>
+            </selector>
+            <acceptor>
+              <simulatedAnnealingStartingTemperature>10.0</simulatedAnnealingStartingTemperature>
+              <completePropertyTabuSize>5</completePropertyTabuSize>
+            </acceptor>
+            <forager>
+                <foragerType>FIRST_RANDOMLY_ACCEPTED</foragerType>
+                <minimalAcceptedSelection>4</minimalAcceptedSelection>
+            </forager>
+        </localSearchSolver>
+    </solverBenchmark>
 </solverBenchmarkSuite>

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringSprintSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringSprintSolverBenchmarkConfig.xml	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringSprintSolverBenchmarkConfig.xml	2010-06-19 17:44:08 UTC (rev 33562)
@@ -3,29 +3,29 @@
     <benchmarkDirectory>local/data/nurserostering</benchmarkDirectory>
     <solverStatisticType>BEST_SOLUTION_CHANGED</solverStatisticType>
     
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint01.xml</inheritedUnsolvedSolutionFile>
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint02.xml</inheritedUnsolvedSolutionFile>
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint03.xml</inheritedUnsolvedSolutionFile>
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint04.xml</inheritedUnsolvedSolutionFile>
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint05.xml</inheritedUnsolvedSolutionFile>
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint06.xml</inheritedUnsolvedSolutionFile>
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint07.xml</inheritedUnsolvedSolutionFile>
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint08.xml</inheritedUnsolvedSolutionFile>
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint09.xml</inheritedUnsolvedSolutionFile>
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint10.xml</inheritedUnsolvedSolutionFile>
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint01.xml</inheritedUnsolvedSolutionFile>-->
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint02.xml</inheritedUnsolvedSolutionFile>-->
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint03.xml</inheritedUnsolvedSolutionFile>-->
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint04.xml</inheritedUnsolvedSolutionFile>-->
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint05.xml</inheritedUnsolvedSolutionFile>-->
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint06.xml</inheritedUnsolvedSolutionFile>-->
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint07.xml</inheritedUnsolvedSolutionFile>-->
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint08.xml</inheritedUnsolvedSolutionFile>-->
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint09.xml</inheritedUnsolvedSolutionFile>-->
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint10.xml</inheritedUnsolvedSolutionFile>-->
     <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_hint01.xml</inheritedUnsolvedSolutionFile>-->
     <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_hint02.xml</inheritedUnsolvedSolutionFile>-->
     <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_hint03.xml</inheritedUnsolvedSolutionFile>-->
     <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_late01.xml</inheritedUnsolvedSolutionFile>
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_late02.xml</inheritedUnsolvedSolutionFile>
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_late02.xml</inheritedUnsolvedSolutionFile>-->
     <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_late03.xml</inheritedUnsolvedSolutionFile>
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_late04.xml</inheritedUnsolvedSolutionFile>
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_late04.xml</inheritedUnsolvedSolutionFile>-->
     <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_late05.xml</inheritedUnsolvedSolutionFile>
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_late06.xml</inheritedUnsolvedSolutionFile>
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_late07.xml</inheritedUnsolvedSolutionFile>
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_late08.xml</inheritedUnsolvedSolutionFile>
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_late09.xml</inheritedUnsolvedSolutionFile>
-    <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_late10.xml</inheritedUnsolvedSolutionFile>
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_late06.xml</inheritedUnsolvedSolutionFile>-->
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_late07.xml</inheritedUnsolvedSolutionFile>-->
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_late08.xml</inheritedUnsolvedSolutionFile>-->
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_late09.xml</inheritedUnsolvedSolutionFile>-->
+    <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/sprint_late10.xml</inheritedUnsolvedSolutionFile>-->
 
     <inheritedLocalSearchSolver>
         <scoreDrl>/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl</scoreDrl>
@@ -43,17 +43,18 @@
     </inheritedLocalSearchSolver>
 
     <solverBenchmark>
-        <name>absolute100_propertyTabu11</name>
+        <name>pillarPart200</name>
         <localSearchSolver>
             <selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.EmployeeChangeMoveFactory</moveFactoryClass>
-                    <absoluteSelection>100</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSwitchMoveFactory</moveFactoryClass>
-                    <absoluteSelection>100</absoluteSelection>
                 </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentPillarPartSwitchMoveFactory</moveFactoryClass>
+                </selector>
             </selector>
             <acceptor>
               <completeSolutionTabuSize>1000</completeSolutionTabuSize>
@@ -61,32 +62,31 @@
             </acceptor>
             <forager>
                 <foragerType>MAX_SCORE_OF_ALL</foragerType>
+                <minimalAcceptedSelection>200</minimalAcceptedSelection>
             </forager>
         </localSearchSolver>
     </solverBenchmark>
     <solverBenchmark>
-        <name>pillarPart70</name>
+        <name>simAnn</name>
         <localSearchSolver>
             <selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.EmployeeChangeMoveFactory</moveFactoryClass>
-                    <absoluteSelection>70</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSwitchMoveFactory</moveFactoryClass>
-                    <absoluteSelection>70</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentPillarPartSwitchMoveFactory</moveFactoryClass>
-                    <absoluteSelection>70</absoluteSelection>
                 </selector>
             </selector>
             <acceptor>
-              <completeSolutionTabuSize>1000</completeSolutionTabuSize>
-              <completePropertyTabuSize>11</completePropertyTabuSize>
+              <simulatedAnnealingStartingTemperature>10.0</simulatedAnnealingStartingTemperature>
+              <completePropertyTabuSize>5</completePropertyTabuSize>
             </acceptor>
             <forager>
-                <foragerType>MAX_SCORE_OF_ALL</foragerType>
+                <foragerType>FIRST_RANDOMLY_ACCEPTED</foragerType>
+                <minimalAcceptedSelection>4</minimalAcceptedSelection>
             </forager>
         </localSearchSolver>
     </solverBenchmark>

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringStepLimitSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringStepLimitSolverBenchmarkConfig.xml	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringStepLimitSolverBenchmarkConfig.xml	2010-06-19 17:44:08 UTC (rev 33562)
@@ -22,11 +22,9 @@
             <selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.EmployeeChangeMoveFactory</moveFactoryClass>
-                    <absoluteSelection>500</absoluteSelection>
                 </selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSwitchMoveFactory</moveFactoryClass>
-                    <absoluteSelection>500</absoluteSelection>
                 </selector>
             </selector>
             <acceptor>
@@ -35,6 +33,7 @@
             </acceptor>
             <forager>
                 <foragerType>MAX_SCORE_OF_ALL</foragerType>
+                <minimalAcceptedSelection>1000</minimalAcceptedSelection>
             </forager>
         </localSearchSolver>
     </solverBenchmark>

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/competition/nurseRosteringCompetitionLongSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/competition/nurseRosteringCompetitionLongSolverConfig.xml	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/competition/nurseRosteringCompetitionLongSolverConfig.xml	2010-06-19 17:44:08 UTC (rev 33562)
@@ -11,23 +11,18 @@
     <selector>
         <selector>
             <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.EmployeeChangeMoveFactory</moveFactoryClass>
-            <absoluteSelection>300</absoluteSelection>
         </selector>
         <selector>
             <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSwitchMoveFactory</moveFactoryClass>
-            <absoluteSelection>300</absoluteSelection>
         </selector>
         <selector>
             <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSequenceSwitchLength2MoveFactory</moveFactoryClass>
-            <absoluteSelection>150</absoluteSelection>
         </selector>
         <selector>
             <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSequenceSwitchLength3MoveFactory</moveFactoryClass>
-            <absoluteSelection>150</absoluteSelection>
         </selector>
         <selector>
             <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentPillarPartSwitchMoveFactory</moveFactoryClass>
-            <absoluteSelection>300</absoluteSelection>
         </selector>
     </selector>
     <acceptor>
@@ -36,5 +31,6 @@
     </acceptor>
     <forager>
         <foragerType>MAX_SCORE_OF_ALL</foragerType>
+        <minimalAcceptedSelection>1100</minimalAcceptedSelection>
     </forager>
 </localSearchSolver>

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/competition/nurseRosteringCompetitionMediumSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/competition/nurseRosteringCompetitionMediumSolverConfig.xml	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/competition/nurseRosteringCompetitionMediumSolverConfig.xml	2010-06-19 17:44:08 UTC (rev 33562)
@@ -11,22 +11,20 @@
     <selector>
         <selector>
             <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.EmployeeChangeMoveFactory</moveFactoryClass>
-            <absoluteSelection>300</absoluteSelection>
         </selector>
         <selector>
             <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSwitchMoveFactory</moveFactoryClass>
-            <absoluteSelection>300</absoluteSelection>
         </selector>
         <selector>
             <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentPillarPartSwitchMoveFactory</moveFactoryClass>
-            <absoluteSelection>300</absoluteSelection>
         </selector>
     </selector>
     <acceptor>
-      <completeSolutionTabuSize>1000</completeSolutionTabuSize>
-      <completePropertyTabuSize>11</completePropertyTabuSize>
+      <simulatedAnnealingStartingTemperature>10.0</simulatedAnnealingStartingTemperature>
+      <completePropertyTabuSize>5</completePropertyTabuSize>
     </acceptor>
     <forager>
-        <foragerType>MAX_SCORE_OF_ALL</foragerType>
+        <foragerType>FIRST_RANDOMLY_ACCEPTED</foragerType>
+        <minimalAcceptedSelection>4</minimalAcceptedSelection>
     </forager>
 </localSearchSolver>

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/competition/nurseRosteringCompetitionSprintSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/competition/nurseRosteringCompetitionSprintSolverConfig.xml	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/competition/nurseRosteringCompetitionSprintSolverConfig.xml	2010-06-19 17:44:08 UTC (rev 33562)
@@ -11,11 +11,9 @@
     <selector>
         <selector>
             <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.EmployeeChangeMoveFactory</moveFactoryClass>
-            <absoluteSelection>100</absoluteSelection>
         </selector>
         <selector>
             <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSwitchMoveFactory</moveFactoryClass>
-            <absoluteSelection>100</absoluteSelection>
         </selector>
     </selector>
     <acceptor>
@@ -24,5 +22,6 @@
     </acceptor>
     <forager>
         <foragerType>MAX_SCORE_OF_ALL</foragerType>
+        <minimalAcceptedSelection>180</minimalAcceptedSelection>
     </forager>
 </localSearchSolver>

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml	2010-06-19 17:44:08 UTC (rev 33562)
@@ -18,23 +18,18 @@
     <selector>
         <selector>
             <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.EmployeeChangeMoveFactory</moveFactoryClass>
-            <absoluteSelection>300</absoluteSelection>
         </selector>
         <selector>
             <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSwitchMoveFactory</moveFactoryClass>
-            <absoluteSelection>300</absoluteSelection>
         </selector>
         <!--<selector>-->
             <!--<moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSequenceSwitchLength2MoveFactory</moveFactoryClass>-->
-            <!--<absoluteSelection>150</absoluteSelection>-->
         <!--</selector>-->
         <!--<selector>-->
             <!--<moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSequenceSwitchLength3MoveFactory</moveFactoryClass>-->
-            <!--<absoluteSelection>150</absoluteSelection>-->
         <!--</selector>-->
         <selector>
             <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentPillarPartSwitchMoveFactory</moveFactoryClass>
-            <absoluteSelection>300</absoluteSelection>
         </selector>
     </selector>
     <acceptor>
@@ -43,5 +38,6 @@
     </acceptor>
     <forager>
         <foragerType>MAX_SCORE_OF_ALL</foragerType>
+        <minimalAcceptedSelection>800</minimalAcceptedSelection>
     </forager>
 </localSearchSolver>

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/pas/benchmark/patientAdmissionScheduleSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/pas/benchmark/patientAdmissionScheduleSolverBenchmarkConfig.xml	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/pas/benchmark/patientAdmissionScheduleSolverBenchmarkConfig.xml	2010-06-19 17:44:08 UTC (rev 33562)
@@ -38,7 +38,6 @@
             <selector>
                 <selector>
                     <moveFactoryClass>org.drools.planner.examples.pas.solver.move.factory.BedDesignationPillarPartSwitchMoveFactory</moveFactoryClass>
-                    <relativeSelection>0.0010</relativeSelection>
                 </selector>
             </selector>
             <acceptor>
@@ -47,6 +46,7 @@
             </acceptor>
             <forager>
                 <foragerType>MAX_SCORE_OF_ALL</foragerType>
+                <minimalAcceptedSelection>500</minimalAcceptedSelection><!-- TODO tweak me -->
             </forager>
         </localSearchSolver>
     </solverBenchmark>

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/pas/solver/patientAdmissionScheduleSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/pas/solver/patientAdmissionScheduleSolverConfig.xml	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/pas/solver/patientAdmissionScheduleSolverConfig.xml	2010-06-19 17:44:08 UTC (rev 33562)
@@ -16,15 +16,12 @@
     <selector>
         <!--<selector>-->
             <!--<moveFactoryClass>org.drools.planner.examples.pas.solver.move.factory.BedChangeMoveFactory</moveFactoryClass>-->
-            <!--<relativeSelection>0.0008</relativeSelection>-->
         <!--</selector>-->
         <!--<selector>-->
             <!--<moveFactoryClass>org.drools.planner.examples.pas.solver.move.factory.BedDesignationSwitchMoveFactory</moveFactoryClass>-->
-            <!--<relativeSelection>0.0008</relativeSelection>-->
         <!--</selector>-->
         <selector>
             <moveFactoryClass>org.drools.planner.examples.pas.solver.move.factory.BedDesignationPillarPartSwitchMoveFactory</moveFactoryClass>
-            <relativeSelection>0.0010</relativeSelection>
         </selector>
     </selector>
     <acceptor>
@@ -33,5 +30,6 @@
     </acceptor>
     <forager>
         <foragerType>MAX_SCORE_OF_ALL</foragerType>
+        <minimalAcceptedSelection>500</minimalAcceptedSelection><!-- TODO tweak me -->
     </forager>
 </localSearchSolver>

Modified: labs/jbossrules/trunk/drools-planner/src/main/assembly/docs/UpgradeFromPreviousVersionRecipe.txt
===================================================================
--- labs/jbossrules/trunk/drools-planner/src/main/assembly/docs/UpgradeFromPreviousVersionRecipe.txt	2010-06-19 08:10:12 UTC (rev 33561)
+++ labs/jbossrules/trunk/drools-planner/src/main/assembly/docs/UpgradeFromPreviousVersionRecipe.txt	2010-06-19 17:44:08 UTC (rev 33562)
@@ -268,7 +268,8 @@
 Environment mode DEBUG now checks more and therefor it is slower than before.
 
 
-JBRULES-1804 has been fixed. The HACK to fix wierd truth maintenance behavior is obsolete.
+JBRULES-1804 has been fixed. The HACK to fix wierd truth maintenance behavior is now obsolete.
+Delete any instances of that hack to make your rules easier to read and faster.
 Before in *.drl:
         // HACK to fix wierd truth maintenance behavior in drools
         // because making weight part of the equals/hashcode doesn't cut it
@@ -287,9 +288,11 @@
 A custom ConstraintOccurrence implementation should now use the weight in its equals/hashcode methods.
 IntConstraintOccurrence and DoubleConstraintOccurrence have been changed as needed.
 
+
 From 5.1.0.m2 to 5.1.0.cr1
 --------------------------
 
+
 Custom ScoreDefinition implementations needs to implement the Double translateScoreToGraphValue(S score) method.
 After in *ScoreDefinition.java:
     public Double translateScoreToGraphValue(HardAndSoftScore score) {
@@ -337,3 +340,58 @@
     public ...Score subtract(...Score subtrahend) {
 
 Custom Score implementation: When rounding is needed, it should now be floored (as defined by Math.floor(double)).
+
+
+A selector no longer supports absoluteSelection and relativeSelection, because it was inefficient.
+Instead, the forager now supports minimalAcceptedSelection, which only counts doable, accepted moves
+(instead of all the selected moves).
+As a guideline, set your minimalAcceptedSelection to the sum of all your absoluteSelection and subtract 10%.
+Before in *Config.xml:
+    <selector>
+        <selector>
+            <moveFactoryClass>...ChangeMoveFactory</moveFactoryClass>
+            <absoluteSelection>500</absoluteSelection>
+        </selector>
+        <selector>
+            <moveFactoryClass>...SwitchMoveFactory</moveFactoryClass>
+            <absoluteSelection>500</absoluteSelection>
+        </selector>
+    </selector>
+    ...
+    <forager>
+        <foragerType>MAX_SCORE_OF_ALL</foragerType>
+    </forager>
+After in *Config.xml:
+    <selector>
+        <selector>
+            <moveFactoryClass>...ChangeMoveFactory</moveFactoryClass>
+        </selector>
+        <selector>
+            <moveFactoryClass>...SwitchMoveFactory</moveFactoryClass>
+        </selector>
+    </selector>
+    ...
+    <forager>
+        <foragerType>MAX_SCORE_OF_ALL</foragerType>
+        <minimalAcceptedSelection>900</minimalAcceptedSelection>
+    </forager>
+If you weighted some MoveFactory heavier than another, vote for https://jira.jboss.org/browse/JBRULES-2553.
+
+If you use a custom selector: the Selector interface method
+  List<Move> selectMoveList(StepScope stepScope)
+has been replaced by the more efficient method
+  Iterator<Move> moveIterator(StepScope stepScope)
+Before in *Selector.java:
+    public List<Move> selectMoveList(StepScope stepScope) {
+        ...
+        return moveList;
+    }
+After in *Selector.java:
+    public Iterator<Move> moveIterator(StepScope stepScope) {
+        ...
+        return moveList.iterator();
+    }
+
+There's now a decent simulated annealing implementation.
+In many cases it clearly beats the tabu search implementation.
+See the reference manual and the nurse rostering example for more info.



More information about the jboss-svn-commits mailing list