[jboss-svn-commits] JBL Code SVN: r18084 - in labs/jbossrules/trunk/drools-solver: drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/selector and 13 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Jan 24 16:05:25 EST 2008


Author: ge0ffrey
Date: 2008-01-24 16:05:25 -0500 (Thu, 24 Jan 2008)
New Revision: 18084

Added:
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/AbstractSelector.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/CompositeSelector.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/MoveFactorySelector.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/Selector.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/factory/
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/factory/CachedMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/factory/MoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExamSwitchExaminationMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/PeriodChangeExaminationMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/RoomChangeExaminationMoveFactory.java
Removed:
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/AbstractMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/CachedMoveListMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/MoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationMoveFactory.java
Modified:
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/LocalSearchSolverConfig.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/selector/SelectorConfig.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/DefaultDecider.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/CompositeAccepter.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/Move.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/JumpingNeighbourExaminationMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/NeighbourExaminationMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/move/ExamSwitchMove.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/solver/LessonScheduleMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/solver/NQueensMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/SimpleTravelingTournamentMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/SmartTravelingTournamentMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationShortSolverBenchmarkConfig.xml
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationSolverBenchmarkConfig.xml
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml
Log:
experimental refactor of selector

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/LocalSearchSolverConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/LocalSearchSolverConfig.java	2008-01-24 19:43:07 UTC (rev 18083)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/LocalSearchSolverConfig.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -198,7 +198,7 @@
 
     private Decider buildDecider() {
         DefaultDecider decider = new DefaultDecider();
-        decider.setMoveFactory(selectorConfig.buildMoveFactory());
+        decider.setSelector(selectorConfig.buildSelector());
         decider.setAccepter(accepterConfig.buildAccepter());
         decider.setForager(foragerConfig.buildForager());
         return decider;

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/selector/SelectorConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/selector/SelectorConfig.java	2008-01-24 19:43:07 UTC (rev 18083)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/selector/SelectorConfig.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -1,8 +1,14 @@
 package org.drools.solver.config.localsearch.decider.selector;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.drools.solver.core.localsearch.decider.selector.CachedMoveListMoveFactory;
-import org.drools.solver.core.localsearch.decider.selector.MoveFactory;
+import com.thoughtworks.xstream.annotations.XStreamImplicit;
+import org.drools.solver.core.localsearch.decider.selector.CompositeSelector;
+import org.drools.solver.core.localsearch.decider.selector.MoveFactorySelector;
+import org.drools.solver.core.localsearch.decider.selector.Selector;
+import org.drools.solver.core.move.factory.MoveFactory;
 
 /**
  * @author Geoffrey De Smet
@@ -10,10 +16,22 @@
 @XStreamAlias("selector")
 public class SelectorConfig {
 
+    @XStreamImplicit(itemFieldName = "selector")
+    private List<SelectorConfig> selectorConfigList = null;
+    
     private MoveFactory moveFactory = null;
     private Class<MoveFactory> moveFactoryClass = null;
-    private Boolean shuffleMovesEveryStep = null;
+    protected Boolean shuffle = null;
+    protected Double relativeSelection = null;
 
+    public List<SelectorConfig> getSelectorConfigList() {
+        return selectorConfigList;
+    }
+
+    public void setSelectorConfigList(List<SelectorConfig> selectorConfigList) {
+        this.selectorConfigList = selectorConfigList;
+    }
+
     public MoveFactory getMoveFactory() {
         return moveFactory;
     }
@@ -30,41 +48,68 @@
         this.moveFactoryClass = moveFactoryClass;
     }
 
-    public Boolean getShuffleMovesEveryStep() {
-        return shuffleMovesEveryStep;
+    public Boolean getShuffle() {
+        return shuffle;
     }
 
-    public void setShuffleMovesEveryStep(Boolean shuffleMovesEveryStep) {
-        this.shuffleMovesEveryStep = shuffleMovesEveryStep;
-    }// ************************************************************************
+    public void setShuffle(Boolean shuffle) {
+        this.shuffle = shuffle;
+    }
+
+    public Double getRelativeSelection() {
+        return relativeSelection;
+    }
+
+    public void setRelativeSelection(Double relativeSelection) {
+        this.relativeSelection = relativeSelection;
+    }
+
+    // ************************************************************************
     // Builder methods
     // ************************************************************************
 
-    public MoveFactory buildMoveFactory() {
-        if (moveFactory != null) {
-            return moveFactory;
-        } else if (moveFactoryClass != null) {
-            try {
-                MoveFactory moveFactory = moveFactoryClass.newInstance();
-                if (shuffleMovesEveryStep != null)
-                {
-                    ((CachedMoveListMoveFactory) moveFactory).setShuffleListEveryStep(
-                            shuffleMovesEveryStep.booleanValue());
+    public Selector buildSelector() {
+        if (selectorConfigList != null) {
+            List<Selector> selectorList = new ArrayList<Selector>(selectorConfigList.size());
+            for (SelectorConfig selectorConfig : selectorConfigList) {
+                selectorList.add(selectorConfig.buildSelector());
+            }
+            CompositeSelector selector = new CompositeSelector();
+            selector.setSelectorList(selectorList);
+            return selector;
+        } else if (moveFactory != null || moveFactoryClass != null) {
+            MoveFactory initializedMoveFactory;
+            if (moveFactory != null) {
+                initializedMoveFactory = moveFactory;
+            } else {
+                try {
+                    initializedMoveFactory = moveFactoryClass.newInstance();
+                } catch (InstantiationException e) {
+                    throw new IllegalArgumentException("The moveFactoryClass (" + moveFactoryClass.getName()
+                            + ") does not have a public no-arg constructor", e);
+                } catch (IllegalAccessException e) {
+                    throw new IllegalArgumentException("The moveFactoryClass (" + moveFactoryClass.getName()
+                            + ") does not have a public no-arg constructor", e);
                 }
-                return moveFactory;
-            } catch (InstantiationException e) {
-                throw new IllegalArgumentException("moveFactoryClass (" + moveFactoryClass.getName()
-                        + ") does not have a public no-arg constructor", e);
-            } catch (IllegalAccessException e) {
-                throw new IllegalArgumentException("moveFactoryClass (" + moveFactoryClass.getName()
-                        + ") does not have a public no-arg constructor", e);
             }
+            MoveFactorySelector selector = new MoveFactorySelector();
+            selector.setMoveFactory(initializedMoveFactory);
+            if (shuffle != null) {
+                selector.setShuffle(shuffle.booleanValue());
+            } else {
+                selector.setShuffle(relativeSelection != null);
+            }
+            if (relativeSelection != null) {
+                selector.setRelativeSelection(relativeSelection);
+            }
+            return selector;
         } else {
             throw new IllegalArgumentException("A selector with a moveFactory or moveFactory class is required.");
         }
     }
 
     public void inherit(SelectorConfig inheritedConfig) {
+        // TODO FIXME
         if (moveFactory == null && moveFactoryClass == null) {
             moveFactory = inheritedConfig.getMoveFactory();
             moveFactoryClass = inheritedConfig.getMoveFactoryClass();

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/DefaultDecider.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/DefaultDecider.java	2008-01-24 19:43:07 UTC (rev 18083)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/DefaultDecider.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -5,7 +5,7 @@
 import org.drools.solver.core.localsearch.LocalSearchSolver;
 import org.drools.solver.core.localsearch.decider.accepter.Accepter;
 import org.drools.solver.core.localsearch.decider.forager.Forager;
-import org.drools.solver.core.localsearch.decider.selector.MoveFactory;
+import org.drools.solver.core.localsearch.decider.selector.Selector;
 import org.drools.solver.core.move.Move;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -19,7 +19,7 @@
 
     protected LocalSearchSolver localSearchSolver;
 
-    protected MoveFactory moveFactory;
+    protected Selector selector;
     protected Accepter accepter;
     protected Forager forager;
 
@@ -27,13 +27,13 @@
 
     public void setLocalSearchSolver(LocalSearchSolver localSearchSolver) {
         this.localSearchSolver = localSearchSolver;
-        moveFactory.setLocalSearchSolver(localSearchSolver);
+        selector.setLocalSearchSolver(localSearchSolver);
         accepter.setLocalSearchSolver(localSearchSolver);
         forager.setLocalSearchSolver(localSearchSolver);
     }
 
-    public void setMoveFactory(MoveFactory moveFactory) {
-        this.moveFactory = moveFactory;
+    public void setSelector(Selector selector) {
+        this.selector = selector;
     }
 
     public void setAccepter(Accepter accepter) {
@@ -53,20 +53,20 @@
     // ************************************************************************
 
     public void solvingStarted() {
-        moveFactory.solvingStarted();
+        selector.solvingStarted();
         accepter.solvingStarted();
         forager.solvingStarted();
     }
 
     public void beforeDeciding() {
-        moveFactory.beforeDeciding();
+        selector.beforeDeciding();
         accepter.beforeDeciding();
         forager.beforeDeciding();
     }
 
     public Move decideNextStep() {
         WorkingMemory workingMemory = localSearchSolver.getEvaluationHandler().getStatefulSession();
-        for (Move move : moveFactory) {
+        for (Move move : selector.selectMoveList()) {
             // Filter out not doable moves
             if (move.isMoveDoable(workingMemory)) {
                 doMove(move);
@@ -104,99 +104,20 @@
         forager.addMove(move, score, acceptChance);
     }
 
-//    /**
-//     * @param move
-//     * @param score
-//     * @return true if the move is accepted
-//     */
-//    private boolean decideOnMove(Move move, double score) { // TODO FIXME
-//        // Filter out not fit enough moves
-//        if (!(deciderMode.isTakeFittestOnly() && (nextMove != null) && (nextScore > score))) {
-//            double acceptChance = accepter.calculateAcceptChance(move, score);
-//            // Filter out not acceptable moves
-//            if (acceptChance > 0.0) {
-//                double random = getRandom().nextDouble();
-//                // Filter out not accepted moves
-//                if (random < acceptChance) {
-//                    if (deciderMode.isTakeFittestOnly() && (nextMove != null)
-//                            && (score > nextScore)) {
-//                        acceptedCount = 0.0;
-//                    }
-//                    acceptedCount++;
-//                    if (random < (acceptChance / acceptedCount)) {
-//                        return true;
-//                    }
-//                }
-//            }
-//        }
-//        return false;
-//    }
-
-//    private void processMove(Move move, double score) {
-//        if (decideOnMove(move, score)) {
-//            if (logger.isDebugEnabled()) {
-//                logger.debug("    Move (" + move + ") with score (" +  score + ") accepted. "
-//                        + "Updating next move and score.");
-//            }
-//            nextMove = move;
-//            nextScore = score;
-//            if (deciderMode.isTakeFirstFound()) {
-//                // Only break early if any will do or if it improves (because only improving will do)
-//                if (deciderMode.isTakeFittestOnly()) {
-//                    quitEarly = true;
-//                } else if (score > localSearchSolver.getStepScore()) {
-//                    quitEarly = true;
-//                }
-//            }
-//        } else {
-//            if (logger.isDebugEnabled()) {
-//                logger.debug("    Move (" + move + ") with score (" +  score + ") is not accepted.");
-//            }
-//        }
-//    }
-
-//    /**
-//     * @param move
-//     * @param score
-//     * @return true if the move is accepted
-//     */
-//    protected boolean decideOnMove(Move move, double score) {
-//        // Filter out not fit enough moves
-//        if (!(deciderMode.isTakeFittestOnly() && (nextMove != null) && (nextScore > score))) {
-//            double acceptChance = accepter.calculateAcceptChance(move, score);
-//            // Filter out not acceptable moves
-//            if (acceptChance > 0.0) {
-//                double random = getRandom().nextDouble();
-//                // Filter out not accepted moves
-//                if (random < acceptChance) {
-//                    if (deciderMode.isTakeFittestOnly() && (nextMove != null)
-//                            && (score > nextScore)) {
-//                        acceptedCount = 0.0;
-//                    }
-//                    acceptedCount++;
-//                    if (random < (acceptChance / acceptedCount)) {
-//                        return true;
-//                    }
-//                }
-//            }
-//        }
-//        return false;
-//    }
-
     public void stepDecided(Move step) {
-        moveFactory.stepDecided(step);
+        selector.stepDecided(step);
         accepter.stepDecided(step);
         forager.stepDecided(step);
     }
 
     public void stepTaken() {
-        moveFactory.stepTaken();
+        selector.stepTaken();
         accepter.stepTaken();
         forager.stepTaken();
     }
 
     public void solvingEnded() {
-        moveFactory.solvingEnded();
+        selector.solvingEnded();
         accepter.solvingEnded();
         forager.solvingEnded();
     }

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/CompositeAccepter.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/CompositeAccepter.java	2008-01-24 19:43:07 UTC (rev 18083)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/CompositeAccepter.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -4,16 +4,12 @@
 
 import org.drools.solver.core.localsearch.LocalSearchSolver;
 import org.drools.solver.core.move.Move;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * @author Geoffrey De Smet
  */
 public class CompositeAccepter extends AbstractAccepter {
 
-    protected final transient Logger logger = LoggerFactory.getLogger(getClass());
-
     protected List<Accepter> accepterList;
 
     public void setAccepterList(List<Accepter> accepterList) {

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/AbstractMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/AbstractMoveFactory.java	2008-01-24 19:43:07 UTC (rev 18083)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/AbstractMoveFactory.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -1,45 +0,0 @@
-package org.drools.solver.core.localsearch.decider.selector;
-
-import org.drools.solver.core.localsearch.LocalSearchSolver;
-import org.drools.solver.core.move.Move;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author Geoffrey De Smet
- */
-public abstract class AbstractMoveFactory implements MoveFactory {
-
-    protected final transient Logger logger = LoggerFactory.getLogger(getClass());
-
-    protected LocalSearchSolver localSearchSolver;
-
-    public void setLocalSearchSolver(LocalSearchSolver localSearchSolver) {
-        this.localSearchSolver = localSearchSolver;
-    }
-
-    // ************************************************************************
-    // Worker methods
-    // ************************************************************************
-
-    public void solvingStarted() {
-        // Hook which can be optionally overwritten by subclasses.
-    }
-
-    public void beforeDeciding() {
-        // Hook which can be optionally overwritten by subclasses.
-    }
-
-    public void stepDecided(Move step) {
-        // Hook which can be optionally overwritten by subclasses.
-    }
-
-    public void stepTaken() {
-        // Hook which can be optionally overwritten by subclasses.
-    }
-
-    public void solvingEnded() {
-        // Hook which can be optionally overwritten by subclasses.
-    }
-
-}

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/AbstractSelector.java (from rev 18040, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/AbstractAccepter.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/AbstractSelector.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/AbstractSelector.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -0,0 +1,45 @@
+package org.drools.solver.core.localsearch.decider.selector;
+
+import org.drools.solver.core.localsearch.LocalSearchSolver;
+import org.drools.solver.core.move.Move;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public abstract class AbstractSelector implements Selector {
+
+    protected final transient Logger logger = LoggerFactory.getLogger(getClass());
+
+    protected LocalSearchSolver localSearchSolver;
+
+    public void setLocalSearchSolver(LocalSearchSolver localSearchSolver) {
+        this.localSearchSolver = localSearchSolver;
+    }
+
+    // ************************************************************************
+    // Worker methods
+    // ************************************************************************
+
+    public void solvingStarted() {
+        // Hook which can be optionally overwritten by subclasses.
+    }
+
+    public void beforeDeciding() {
+        // Hook which can be optionally overwritten by subclasses.
+    }
+
+    public void stepDecided(Move step) {
+        // Hook which can be optionally overwritten by subclasses.
+    }
+
+    public void stepTaken() {
+        // Hook which can be optionally overwritten by subclasses.
+    }
+
+    public void solvingEnded() {
+        // Hook which can be optionally overwritten by subclasses.
+    }
+
+}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/CachedMoveListMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/CachedMoveListMoveFactory.java	2008-01-24 19:43:07 UTC (rev 18083)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/CachedMoveListMoveFactory.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -1,44 +0,0 @@
-package org.drools.solver.core.localsearch.decider.selector;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.drools.solver.core.move.Move;
-import org.drools.solver.core.solution.Solution;
-
-/**
- * @author Geoffrey De Smet
- */
-public abstract class CachedMoveListMoveFactory extends AbstractMoveFactory {
-
-    protected List<Move> cachedMoveList;
-    protected boolean shuffleListEveryStep = false;
-
-    public List<Move> getCachedMoveList() {
-        return cachedMoveList;
-    }
-
-    public boolean isShuffleListEveryStep() {
-        return shuffleListEveryStep;
-    }
-
-    public void setShuffleListEveryStep(boolean shuffleListEveryStep) {
-        this.shuffleListEveryStep = shuffleListEveryStep;
-    }
-
-    @Override
-    public void solvingStarted() {
-        cachedMoveList = createMoveList(localSearchSolver.getCurrentSolution());
-    }
-
-    public abstract List<Move> createMoveList(Solution startingSolution);
-
-    public Iterator<Move> iterator() {
-        if (shuffleListEveryStep) {
-            Collections.shuffle(cachedMoveList, localSearchSolver.getRandom()); // TODO is this needed?
-        }
-        return cachedMoveList.iterator();
-    }
-
-}

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/CompositeSelector.java (from rev 18040, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/CompositeAccepter.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/CompositeSelector.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/CompositeSelector.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -0,0 +1,76 @@
+package org.drools.solver.core.localsearch.decider.selector;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.solver.core.localsearch.LocalSearchSolver;
+import org.drools.solver.core.move.Move;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class CompositeSelector extends AbstractSelector {
+
+    protected List<Selector> selectorList;
+
+    public void setSelectorList(List<Selector> selectorList) {
+        this.selectorList = selectorList;
+    }
+
+    public void setLocalSearchSolver(LocalSearchSolver localSearchSolver) {
+        super.setLocalSearchSolver(localSearchSolver);
+        for (Selector selector : selectorList) {
+            selector.setLocalSearchSolver(localSearchSolver);
+        }
+    }
+
+    // ************************************************************************
+    // Worker methods
+    // ************************************************************************
+
+    public void solvingStarted() {
+        for (Selector selector : selectorList) {
+            selector.solvingStarted();
+        }
+    }
+
+    public void beforeDeciding() {
+        for (Selector selector : selectorList) {
+            selector.beforeDeciding();
+        }
+    }
+
+    public List<Move> selectMoveList() {
+        int totalSize = 0;
+        List<List<Move>> subMoveLists = new ArrayList<List<Move>>(selectorList.size());
+        for (Selector selector : selectorList) {
+            List<Move> subMoveList = selector.selectMoveList();
+            totalSize += subMoveList.size();
+            subMoveLists.add(subMoveList);
+        }
+        List<Move> moveList = new ArrayList<Move>(totalSize);
+        for (List<Move> subMoveList : subMoveLists) {
+            moveList.addAll(subMoveList);
+        }
+        return moveList;
+    }
+
+    public void stepDecided(Move step) {
+        for (Selector selector : selectorList) {
+            selector.stepDecided(step);
+        }
+    }
+
+    public void stepTaken() {
+        for (Selector selector : selectorList) {
+            selector.stepTaken();
+        }
+    }
+
+    public void solvingEnded() {
+        for (Selector selector : selectorList) {
+            selector.solvingEnded();
+        }
+    }
+
+}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/MoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/MoveFactory.java	2008-01-24 19:43:07 UTC (rev 18083)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/MoveFactory.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -1,12 +0,0 @@
-package org.drools.solver.core.localsearch.decider.selector;
-
-import org.drools.solver.core.localsearch.LocalSearchSolverAware;
-import org.drools.solver.core.localsearch.LocalSearchSolverLifecycleListener;
-import org.drools.solver.core.move.Move;
-
-/**
- * @author Geoffrey De Smet
- */
-public interface MoveFactory extends LocalSearchSolverAware, LocalSearchSolverLifecycleListener, Iterable<Move> {
-
-}

Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/MoveFactorySelector.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/MoveFactorySelector.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/MoveFactorySelector.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -0,0 +1,76 @@
+package org.drools.solver.core.localsearch.decider.selector;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.drools.solver.core.localsearch.LocalSearchSolver;
+import org.drools.solver.core.move.Move;
+import org.drools.solver.core.move.factory.MoveFactory;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class MoveFactorySelector extends AbstractSelector {
+
+    protected MoveFactory moveFactory;
+
+    protected boolean shuffle = true;
+    protected Double relativeSelection = null;
+
+    public void setMoveFactory(MoveFactory moveFactory) {
+        this.moveFactory = moveFactory;
+    }
+
+    public void setShuffle(boolean shuffle) {
+        this.shuffle = shuffle;
+    }
+
+    public void setRelativeSelection(Double relativeSelection) {
+        this.relativeSelection = relativeSelection;
+    }
+
+    public void setLocalSearchSolver(LocalSearchSolver localSearchSolver) {
+        super.setLocalSearchSolver(localSearchSolver);
+        moveFactory.setLocalSearchSolver(localSearchSolver);
+    }
+
+    // ************************************************************************
+    // Worker methods
+    // ************************************************************************
+
+    public void solvingStarted() {
+        moveFactory.solvingStarted();
+    }
+
+    public void beforeDeciding() {
+        moveFactory.beforeDeciding();
+    }
+
+    public final List<Move> selectMoveList() {
+        List<Move> moveList = moveFactory.createMoveList(localSearchSolver.getCurrentSolution());
+        if (shuffle) {
+            Collections.shuffle(moveList, localSearchSolver.getRandom());
+        }
+        if (relativeSelection != null) {
+            int selectionSize = (int) Math.ceil(relativeSelection * moveList.size());
+            if (selectionSize == 0) {
+                selectionSize = 1;
+            }
+            moveList = moveList.subList(0, selectionSize);
+        }
+        return moveList;
+    }
+
+    public void stepDecided(Move step) {
+        moveFactory.stepDecided(step);
+    }
+
+    public void stepTaken() {
+        moveFactory.stepTaken();
+    }
+
+    public void solvingEnded() {
+        moveFactory.solvingEnded();
+    }
+
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/Selector.java (from rev 18040, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/Accepter.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/Selector.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/Selector.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -0,0 +1,16 @@
+package org.drools.solver.core.localsearch.decider.selector;
+
+import java.util.List;
+
+import org.drools.solver.core.localsearch.LocalSearchSolverAware;
+import org.drools.solver.core.localsearch.LocalSearchSolverLifecycleListener;
+import org.drools.solver.core.move.Move;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public interface Selector extends LocalSearchSolverAware, LocalSearchSolverLifecycleListener {
+
+    List<Move> selectMoveList();
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/Move.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/Move.java	2008-01-24 19:43:07 UTC (rev 18083)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/Move.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -3,7 +3,7 @@
 import org.drools.FactHandle;
 import org.drools.WorkingMemory;
 import org.drools.solver.core.Solver;
-import org.drools.solver.core.localsearch.decider.selector.MoveFactory;
+import org.drools.solver.core.move.factory.MoveFactory;
 import org.drools.solver.core.score.calculator.ScoreCalculator;
 import org.drools.solver.core.solution.Solution;
 

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/factory/CachedMoveFactory.java (from rev 18040, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/CachedMoveListMoveFactory.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/factory/CachedMoveFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/factory/CachedMoveFactory.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -0,0 +1,28 @@
+package org.drools.solver.core.move.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.solver.core.move.Move;
+import org.drools.solver.core.solution.Solution;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public abstract class CachedMoveFactory extends AbstractMoveFactory {
+
+    protected List<Move> cachedMoveList;
+
+    @Override
+    public void solvingStarted() {
+        cachedMoveList = createCachedMoveList(localSearchSolver.getCurrentSolution());
+    }
+
+    public abstract List<Move> createCachedMoveList(Solution startingSolution);
+
+    public List<Move> createMoveList(Solution solution) {
+        // Shallow copy so it can be shuffled and filtered etc
+        return new ArrayList<Move>(cachedMoveList);
+    }
+
+}

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/factory/MoveFactory.java (from rev 18040, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/MoveFactory.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/factory/MoveFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/factory/MoveFactory.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -0,0 +1,17 @@
+package org.drools.solver.core.move.factory;
+
+import java.util.List;
+
+import org.drools.solver.core.localsearch.LocalSearchSolverAware;
+import org.drools.solver.core.localsearch.LocalSearchSolverLifecycleListener;
+import org.drools.solver.core.move.Move;
+import org.drools.solver.core.solution.Solution;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public interface MoveFactory extends LocalSearchSolverAware, LocalSearchSolverLifecycleListener {
+
+    List<Move> createMoveList(Solution solution);
+
+}

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExamSwitchExaminationMoveFactory.java (from rev 18040, labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/NeighbourExaminationMoveFactory.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExamSwitchExaminationMoveFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExamSwitchExaminationMoveFactory.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -0,0 +1,33 @@
+package org.drools.solver.examples.itc2007.examination.solver;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+
+import org.drools.solver.core.move.Move;
+import org.drools.solver.core.move.factory.CachedMoveFactory;
+import org.drools.solver.core.solution.Solution;
+import org.drools.solver.examples.itc2007.examination.domain.Exam;
+import org.drools.solver.examples.itc2007.examination.domain.Examination;
+import org.drools.solver.examples.itc2007.examination.solver.move.ExamSwitchMove;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class ExamSwitchExaminationMoveFactory extends CachedMoveFactory {
+
+    public List<Move> createCachedMoveList(Solution solution) {
+        Examination examination = (Examination) localSearchSolver.getCurrentSolution();
+        List<Exam> examList = examination.getExamList();
+        List<Move> moveList = new ArrayList<Move>();
+        for (ListIterator<Exam> leftIt = examList.listIterator(); leftIt.hasNext();) {
+            Exam leftExam = leftIt.next();
+            for (ListIterator<Exam> rightIt = examList.listIterator(leftIt.nextIndex()); rightIt.hasNext();) {
+                Exam rightExam = rightIt.next();
+                moveList.add(new ExamSwitchMove(leftExam, rightExam));
+            }
+        }
+        return moveList;
+    }
+
+}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationMoveFactory.java	2008-01-24 19:43:07 UTC (rev 18083)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationMoveFactory.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -1,47 +0,0 @@
-package org.drools.solver.examples.itc2007.examination.solver;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.drools.solver.core.localsearch.decider.selector.CachedMoveListMoveFactory;
-import org.drools.solver.core.move.Move;
-import org.drools.solver.core.solution.Solution;
-import org.drools.solver.examples.itc2007.examination.domain.Exam;
-import org.drools.solver.examples.itc2007.examination.domain.Examination;
-import org.drools.solver.examples.itc2007.examination.domain.Period;
-import org.drools.solver.examples.itc2007.examination.domain.Room;
-import org.drools.solver.examples.itc2007.examination.solver.move.PeriodChangeBulkMove;
-import org.drools.solver.examples.itc2007.examination.solver.move.PeriodChangeMove;
-import org.drools.solver.examples.itc2007.examination.solver.move.RoomChangeMove;
-
-/**
- * @author Geoffrey De Smet
- */
-public class ExaminationMoveFactory extends CachedMoveListMoveFactory {
-
-    public List<Move> createMoveList(Solution solution) {
-        Examination examination = (Examination) solution;
-        List<Period> periodList = examination.getPeriodList();
-        List<Room> roomList = examination.getRoomList();
-        List<Move> moveList = new ArrayList<Move>();
-        for (Exam exam : examination.getExamList()) {
-            if (exam.getExamCoincidence() != null) {
-                if (exam.isCoincidenceLeader()) {
-                    for (Period period : periodList) {
-                        moveList.add(new PeriodChangeBulkMove(
-                                exam.getExamCoincidence().getCoincidenceExamSet(), period));
-                    }
-                }
-            } else {
-                for (Period period : periodList) {
-                    moveList.add(new PeriodChangeMove(exam, period));
-                }
-            }
-            for (Room room : roomList) {
-                moveList.add(new RoomChangeMove(exam, room));
-            }
-        }
-        return moveList;
-    }
-
-}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/JumpingNeighbourExaminationMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/JumpingNeighbourExaminationMoveFactory.java	2008-01-24 19:43:07 UTC (rev 18083)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/JumpingNeighbourExaminationMoveFactory.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -1,11 +1,11 @@
 package org.drools.solver.examples.itc2007.examination.solver;
 
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 
-import org.drools.solver.core.localsearch.decider.selector.AbstractMoveFactory;
 import org.drools.solver.core.move.Move;
+import org.drools.solver.core.move.factory.AbstractMoveFactory;
+import org.drools.solver.core.solution.Solution;
 import org.drools.solver.examples.itc2007.examination.domain.Exam;
 import org.drools.solver.examples.itc2007.examination.domain.Examination;
 import org.drools.solver.examples.itc2007.examination.domain.Period;
@@ -22,8 +22,8 @@
     private int periodJump = 1;
     private int roomJump = 1;
 
-    public Iterator<Move> iterator() {
-        Examination examination = (Examination) localSearchSolver.getCurrentSolution();
+    public List<Move> createMoveList(Solution solution) {
+        Examination examination = (Examination) solution;
         List<Period> periodList = examination.getPeriodList();
         List<Room> roomList = examination.getRoomList();
         List<Move> moveList = new ArrayList<Move>();
@@ -64,7 +64,7 @@
         if (roomJump >= (roomList.size() / 2)) {
             roomJump = 1;
         }
-        return moveList.iterator();
+        return moveList;
         // TODO re-enable this stuff as it's a lot faster
 //        int maximumMoveSize = 100;
 //        // TODO not fair for first and last moves in move list

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/NeighbourExaminationMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/NeighbourExaminationMoveFactory.java	2008-01-24 19:43:07 UTC (rev 18083)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/NeighbourExaminationMoveFactory.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -1,11 +1,11 @@
 package org.drools.solver.examples.itc2007.examination.solver;
 
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 
-import org.drools.solver.core.localsearch.decider.selector.AbstractMoveFactory;
 import org.drools.solver.core.move.Move;
+import org.drools.solver.core.move.factory.AbstractMoveFactory;
+import org.drools.solver.core.solution.Solution;
 import org.drools.solver.examples.itc2007.examination.domain.Exam;
 import org.drools.solver.examples.itc2007.examination.domain.Examination;
 import org.drools.solver.examples.itc2007.examination.domain.Period;
@@ -22,8 +22,8 @@
     private static final int PERIOD_JUMP = 2;
     private static final int ROOM_JUMP = 2;
 
-    public Iterator<Move> iterator() {
-        Examination examination = (Examination) localSearchSolver.getCurrentSolution();
+    public List<Move> createMoveList(Solution solution) {
+        Examination examination = (Examination) solution;
         List<Period> periodList = examination.getPeriodList();
         List<Room> roomList = examination.getRoomList();
         List<Move> moveList = new ArrayList<Move>();
@@ -56,7 +56,7 @@
                 }
             }
         }
-        return moveList.iterator();
+        return moveList;
         // TODO re-enable this stuff as it's a lot faster
 //        int maximumMoveSize = 100;
 //        // TODO not fair for first and last moves in move list

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/PeriodChangeExaminationMoveFactory.java (from rev 18040, labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationMoveFactory.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/PeriodChangeExaminationMoveFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/PeriodChangeExaminationMoveFactory.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -0,0 +1,41 @@
+package org.drools.solver.examples.itc2007.examination.solver;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.solver.core.move.Move;
+import org.drools.solver.core.move.factory.CachedMoveFactory;
+import org.drools.solver.core.solution.Solution;
+import org.drools.solver.examples.itc2007.examination.domain.Exam;
+import org.drools.solver.examples.itc2007.examination.domain.Examination;
+import org.drools.solver.examples.itc2007.examination.domain.Period;
+import org.drools.solver.examples.itc2007.examination.solver.move.PeriodChangeBulkMove;
+import org.drools.solver.examples.itc2007.examination.solver.move.PeriodChangeMove;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class PeriodChangeExaminationMoveFactory extends CachedMoveFactory {
+
+    public List<Move> createCachedMoveList(Solution solution) {
+        Examination examination = (Examination) solution;
+        List<Period> periodList = examination.getPeriodList();
+        List<Move> moveList = new ArrayList<Move>();
+        for (Exam exam : examination.getExamList()) {
+            if (exam.getExamCoincidence() != null) {
+                if (exam.isCoincidenceLeader()) {
+                    for (Period period : periodList) {
+                        moveList.add(new PeriodChangeBulkMove(
+                                exam.getExamCoincidence().getCoincidenceExamSet(), period));
+                    }
+                }
+            } else {
+                for (Period period : periodList) {
+                    moveList.add(new PeriodChangeMove(exam, period));
+                }
+            }
+        }
+        return moveList;
+    }
+
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/RoomChangeExaminationMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/RoomChangeExaminationMoveFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/RoomChangeExaminationMoveFactory.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -0,0 +1,31 @@
+package org.drools.solver.examples.itc2007.examination.solver;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.solver.core.move.Move;
+import org.drools.solver.core.move.factory.CachedMoveFactory;
+import org.drools.solver.core.solution.Solution;
+import org.drools.solver.examples.itc2007.examination.domain.Exam;
+import org.drools.solver.examples.itc2007.examination.domain.Examination;
+import org.drools.solver.examples.itc2007.examination.domain.Room;
+import org.drools.solver.examples.itc2007.examination.solver.move.RoomChangeMove;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class RoomChangeExaminationMoveFactory extends CachedMoveFactory {
+
+    public List<Move> createCachedMoveList(Solution solution) {
+        Examination examination = (Examination) solution;
+        List<Room> roomList = examination.getRoomList();
+        List<Move> moveList = new ArrayList<Move>();
+        for (Exam exam : examination.getExamList()) {
+            for (Room room : roomList) {
+                moveList.add(new RoomChangeMove(exam, room));
+            }
+        }
+        return moveList;
+    }
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/move/ExamSwitchMove.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/move/ExamSwitchMove.java	2008-01-24 19:43:07 UTC (rev 18083)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/move/ExamSwitchMove.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -37,6 +37,7 @@
     }
 
     public void doMove(WorkingMemory workingMemory) {
+        // TODO also move coincidence
         FactHandle leftExamHandle = workingMemory.getFactHandle(leftExam);
         FactHandle rightExamHandle = workingMemory.getFactHandle(rightExam);
         Period oldLeftPeriod = leftExam.getPeriod();

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/solver/LessonScheduleMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/solver/LessonScheduleMoveFactory.java	2008-01-24 19:43:07 UTC (rev 18083)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/solver/LessonScheduleMoveFactory.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -3,8 +3,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.drools.solver.core.localsearch.decider.selector.CachedMoveListMoveFactory;
 import org.drools.solver.core.move.Move;
+import org.drools.solver.core.move.factory.CachedMoveFactory;
 import org.drools.solver.core.solution.Solution;
 import org.drools.solver.examples.lessonschedule.domain.Lesson;
 import org.drools.solver.examples.lessonschedule.domain.LessonSchedule;
@@ -14,9 +14,9 @@
 /**
  * @author Geoffrey De Smet
  */
-public class LessonScheduleMoveFactory extends CachedMoveListMoveFactory {
+public class LessonScheduleMoveFactory extends CachedMoveFactory {
 
-    public List<Move> createMoveList(Solution solution) {
+    public List<Move> createCachedMoveList(Solution solution) {
         List<Move> moveList = new ArrayList<Move>();
         LessonSchedule lessonSchedule = (LessonSchedule) solution;
         for (Lesson lesson : lessonSchedule.getLessonList()) {

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/solver/NQueensMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/solver/NQueensMoveFactory.java	2008-01-24 19:43:07 UTC (rev 18083)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/solver/NQueensMoveFactory.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -3,8 +3,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.drools.solver.core.localsearch.decider.selector.CachedMoveListMoveFactory;
 import org.drools.solver.core.move.Move;
+import org.drools.solver.core.move.factory.CachedMoveFactory;
 import org.drools.solver.core.solution.Solution;
 import org.drools.solver.examples.nqueens.domain.NQueens;
 import org.drools.solver.examples.nqueens.domain.Queen;
@@ -13,9 +13,9 @@
 /**
  * @author Geoffrey De Smet
  */
-public class NQueensMoveFactory extends CachedMoveListMoveFactory {
+public class NQueensMoveFactory extends CachedMoveFactory {
 
-    public List<Move> createMoveList(Solution solution) {
+    public List<Move> createCachedMoveList(Solution solution) {
         NQueens nQueens = (NQueens) solution;
         List<Move> moveList = new ArrayList<Move>();
         for (Queen queen : nQueens.getQueenList()) {

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/SimpleTravelingTournamentMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/SimpleTravelingTournamentMoveFactory.java	2008-01-24 19:43:07 UTC (rev 18083)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/SimpleTravelingTournamentMoveFactory.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -3,8 +3,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.drools.solver.core.localsearch.decider.selector.CachedMoveListMoveFactory;
 import org.drools.solver.core.move.Move;
+import org.drools.solver.core.move.factory.CachedMoveFactory;
 import org.drools.solver.core.solution.Solution;
 import org.drools.solver.examples.travelingtournament.domain.Day;
 import org.drools.solver.examples.travelingtournament.domain.Match;
@@ -14,9 +14,9 @@
 /**
  * @author Geoffrey De Smet
  */
-public class SimpleTravelingTournamentMoveFactory extends CachedMoveListMoveFactory {
+public class SimpleTravelingTournamentMoveFactory extends CachedMoveFactory {
 
-    public List<Move> createMoveList(Solution solution) {
+    public List<Move> createCachedMoveList(Solution solution) {
         List<Move> moveList = new ArrayList<Move>();
         TravelingTournament travelingTournament = (TravelingTournament) solution;
         for (Match match : travelingTournament.getMatchList()) {

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/SmartTravelingTournamentMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/SmartTravelingTournamentMoveFactory.java	2008-01-24 19:43:07 UTC (rev 18083)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/SmartTravelingTournamentMoveFactory.java	2008-01-24 21:05:25 UTC (rev 18084)
@@ -3,14 +3,14 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
 
-import org.drools.solver.core.localsearch.decider.selector.AbstractMoveFactory;
 import org.drools.solver.core.move.Move;
+import org.drools.solver.core.move.factory.AbstractMoveFactory;
+import org.drools.solver.core.solution.Solution;
 import org.drools.solver.examples.travelingtournament.domain.Day;
 import org.drools.solver.examples.travelingtournament.domain.Match;
 import org.drools.solver.examples.travelingtournament.domain.Team;
@@ -47,9 +47,10 @@
         }
     }
 
-    public Iterator<Move> iterator() {
+
+    public List<Move> createMoveList(Solution solution) {
+        TravelingTournament travelingTournament = (TravelingTournament) solution;
         List<Move> moveList = new ArrayList<Move>();
-        TravelingTournament travelingTournament = (TravelingTournament) localSearchSolver.getCurrentSolution();
         moveList.addAll(cachedMoveList);
         RotationMovesFactory rotationMovesFactory = new RotationMovesFactory(travelingTournament);
         logger.debug("Reused {} moves for N1 neighborhood.", moveList.size());
@@ -60,7 +61,7 @@
         rotationMovesFactory.addTeamRotation(moveList);
         logger.debug("Created {} moves for N2 U N4 neighborhood.", (moveList.size() - oldSize));
         rotationMovesFactory = null;
-        return moveList.iterator();
+        return moveList;
     }
 
     private static class RotationMovesFactory {

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationShortSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationShortSolverBenchmarkConfig.xml	2008-01-24 19:43:07 UTC (rev 18083)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationShortSolverBenchmarkConfig.xml	2008-01-24 21:05:25 UTC (rev 18084)
@@ -20,7 +20,7 @@
     <solverBenchmark>
         <localSearchSolver>
             <selector>
-                <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.ExaminationMoveFactory</moveFactoryClass>
+                <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.PeriodChangeExaminationMoveFactory</moveFactoryClass>
                 <shuffleMovesEveryStep>true</shuffleMovesEveryStep>
             </selector>
             <accepter>

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationSolverBenchmarkConfig.xml	2008-01-24 19:43:07 UTC (rev 18083)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationSolverBenchmarkConfig.xml	2008-01-24 21:05:25 UTC (rev 18084)
@@ -33,7 +33,7 @@
     <!--<solverBenchmark>-->
         <!--<localSearchSolver>-->
             <!--<selector>-->
-                <!--<moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.ExaminationMoveFactory</moveFactoryClass>-->
+                <!--<moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.PeriodChangeExaminationMoveFactory</moveFactoryClass>-->
                 <!--<shuffleMovesEveryStep>true</shuffleMovesEveryStep>-->
             <!--</selector>-->
             <!--<accepter>-->
@@ -47,7 +47,18 @@
     <solverBenchmark>
         <localSearchSolver>
             <selector>
-                <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.NeighbourExaminationMoveFactory</moveFactoryClass>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.PeriodChangeExaminationMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.05</relativeSelection>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.RoomChangeExaminationMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.05</relativeSelection>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.ExamSwitchExaminationMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.05</relativeSelection>
+                </selector>
             </selector>
             <accepter>
                 <completeSolutionTabuSize>1500</completeSolutionTabuSize>
@@ -60,7 +71,18 @@
     <solverBenchmark>
         <localSearchSolver>
             <selector>
-                <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.JumpingNeighbourExaminationMoveFactory</moveFactoryClass>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.PeriodChangeExaminationMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.01</relativeSelection>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.RoomChangeExaminationMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.01</relativeSelection>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.ExamSwitchExaminationMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.01</relativeSelection>
+                </selector>
             </selector>
             <accepter>
                 <completeSolutionTabuSize>1500</completeSolutionTabuSize>

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml	2008-01-24 19:43:07 UTC (rev 18083)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml	2008-01-24 21:05:25 UTC (rev 18084)
@@ -16,8 +16,18 @@
         <!--<maximumStepCount>100</maximumStepCount>-->
     </finish>
     <selector>
-        <!--<moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.NeighbourExaminationMoveFactory</moveFactoryClass>-->
-        <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.JumpingNeighbourExaminationMoveFactory</moveFactoryClass>
+        <selector>
+            <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.PeriodChangeExaminationMoveFactory</moveFactoryClass>
+            <relativeSelection>0.1</relativeSelection>
+        </selector>
+        <selector>
+            <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.RoomChangeExaminationMoveFactory</moveFactoryClass>
+            <relativeSelection>0.1</relativeSelection>
+        </selector>
+        <selector>
+            <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.ExamSwitchExaminationMoveFactory</moveFactoryClass>
+            <relativeSelection>0.1</relativeSelection>
+        </selector>
     </selector>
     <accepter>
         <completeSolutionTabuSize>1500</completeSolutionTabuSize>
@@ -26,7 +36,7 @@
         <foragerType>MAX_SCORE_OF_ALL</foragerType>
     </forager>
     <!--<selector>-->
-        <!--<moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.ExaminationMoveFactory</moveFactoryClass>-->
+        <!--<moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.PeriodChangeExaminationMoveFactory</moveFactoryClass>-->
         <!--<shuffleMovesEveryStep>true</shuffleMovesEveryStep>-->
     <!--</selector>-->
     <!--<accepter>-->




More information about the jboss-svn-commits mailing list