[jboss-svn-commits] JBL Code SVN: r31659 - in labs/jbossrules/trunk/drools-planner: drools-planner-core/src/main/java/org/drools/planner/core/move/factory and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Feb 14 05:37:38 EST 2010


Author: ge0ffrey
Date: 2010-02-14 05:37:38 -0500 (Sun, 14 Feb 2010)
New Revision: 31659

Added:
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/examination/solver/selector/
   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/AllMovesOfOneExamSelectorConfig.java
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/move/factory/CachedMoveFactory.java
Log:
JBRULES-2134 configure a custom selector

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-02-13 18:56:27 UTC (rev 31658)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/selector/MoveFactorySelector.java	2010-02-14 10:37:38 UTC (rev 31659)
@@ -64,7 +64,7 @@
         moveFactory.beforeDeciding(stepScope);
     }
 
-    public final List<Move> selectMoveList(StepScope stepScope) {
+    public List<Move> selectMoveList(StepScope stepScope) {
         List<Move> moveList = moveFactory.createMoveList(stepScope.getWorkingSolution());
         if (shuffle) {
             Collections.shuffle(moveList, stepScope.getWorkingRandom());
@@ -99,4 +99,4 @@
         moveFactory.solvingEnded(localSearchSolverScope);
     }
 
-}
\ No newline at end of file
+}

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/move/factory/CachedMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/move/factory/CachedMoveFactory.java	2010-02-13 18:56:27 UTC (rev 31658)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/move/factory/CachedMoveFactory.java	2010-02-14 10:37:38 UTC (rev 31659)
@@ -14,6 +14,10 @@
 
     protected List<Move> cachedMoveList;
 
+    public List<Move> getCachedMoveList() {
+        return cachedMoveList;
+    }
+
     @Override
     public void solvingStarted(LocalSearchSolverScope localSearchSolverScope) {
         cachedMoveList = createCachedMoveList(localSearchSolverScope.getWorkingSolution());

Copied: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/examination/solver/selector/AllMovesOfOneExamSelector.java (from rev 31468, 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-examples/src/main/java/org/drools/planner/examples/examination/solver/selector/AllMovesOfOneExamSelector.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/examination/solver/selector/AllMovesOfOneExamSelector.java	2010-02-14 10:37:38 UTC (rev 31659)
@@ -0,0 +1,127 @@
+package org.drools.planner.examples.examination.solver.selector;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.planner.core.localsearch.LocalSearchSolverScope;
+import org.drools.planner.core.localsearch.StepScope;
+import org.drools.planner.core.localsearch.decider.Decider;
+import org.drools.planner.core.localsearch.decider.acceptor.tabu.TabuPropertyEnabled;
+import org.drools.planner.core.localsearch.decider.selector.AbstractSelector;
+import org.drools.planner.core.move.Move;
+import org.drools.planner.core.move.factory.MoveFactory;
+import org.drools.planner.examples.examination.domain.Exam;
+import org.drools.planner.examples.examination.domain.Examination;
+import org.drools.planner.examples.examination.solver.move.factory.ExamSwitchMoveFactory;
+import org.drools.planner.examples.examination.solver.move.factory.PeriodChangeMoveFactory;
+import org.drools.planner.examples.examination.solver.move.factory.RoomChangeMoveFactory;
+
+/**
+ * A custom selector implementation for the Examination example.
+ * @author Geoffrey De Smet
+ */
+public class AllMovesOfOneExamSelector extends AbstractSelector {
+
+    protected PeriodChangeMoveFactory periodChangeMoveFactory = new PeriodChangeMoveFactory();
+    protected RoomChangeMoveFactory roomChangeMoveFactory = new RoomChangeMoveFactory();
+    protected ExamSwitchMoveFactory examSwitchMoveFactory = new ExamSwitchMoveFactory();
+
+    protected Map<Exam, List<Move>> cachedExamToMoveMap;
+    protected List<Exam> shuffledExamList;
+    protected int nextShuffledExamListIndex;
+
+    @Override
+    public void setDecider(Decider decider) {
+        super.setDecider(decider);
+        periodChangeMoveFactory.setDecider(decider);
+        roomChangeMoveFactory.setDecider(decider);
+        examSwitchMoveFactory.setDecider(decider);
+    }
+
+    // ************************************************************************
+    // Worker methods
+    // ************************************************************************
+
+    @Override
+    public void solvingStarted(LocalSearchSolverScope localSearchSolverScope) {
+        periodChangeMoveFactory.solvingStarted(localSearchSolverScope);
+        roomChangeMoveFactory.solvingStarted(localSearchSolverScope);
+        examSwitchMoveFactory.solvingStarted(localSearchSolverScope);
+        createCachedExamToMoveMap(localSearchSolverScope);
+    }
+
+    private void createCachedExamToMoveMap(LocalSearchSolverScope localSearchSolverScope) {
+        Examination examination = (Examination) localSearchSolverScope.getWorkingSolution();
+        int examListSize = examination.getExamList().size();
+        List<Move> cachedPeriodChangeMoveList = periodChangeMoveFactory.getCachedMoveList();
+        List<Move> cachedRoomChangeMoveList = roomChangeMoveFactory.getCachedMoveList();
+        List<Move> cachedExamSwitchMoveList = examSwitchMoveFactory.getCachedMoveList();
+        cachedExamToMoveMap = new HashMap<Exam, List<Move>>(cachedPeriodChangeMoveList.size()
+                + cachedRoomChangeMoveList.size() + cachedExamSwitchMoveList.size());
+        addToCachedExamToMoveMap(examListSize, cachedPeriodChangeMoveList);
+        addToCachedExamToMoveMap(examListSize, cachedRoomChangeMoveList);
+        addToCachedExamToMoveMap(examListSize, cachedExamSwitchMoveList);
+        shuffledExamList = new ArrayList<Exam>(cachedExamToMoveMap.keySet());
+        // shuffling is lazy (just in time in the selectMoveList method)
+        nextShuffledExamListIndex = Integer.MAX_VALUE;
+    }
+
+    private void addToCachedExamToMoveMap(int examListSize, List<Move> cachedMoveList) {
+        for (Move cachedMove : cachedMoveList) {
+            TabuPropertyEnabled tabuPropertyEnabledMove = (TabuPropertyEnabled) cachedMove;
+            for (Object o : tabuPropertyEnabledMove.getTabuProperties()) {
+                Exam exam = (Exam) o;
+                List<Move> moveList = cachedExamToMoveMap.get(exam);
+                if (moveList == null) {
+                    moveList = new ArrayList<Move>(examListSize);
+                    cachedExamToMoveMap.put(exam, moveList);
+                }
+                moveList.add(cachedMove);
+            }
+        }
+    }
+
+    @Override
+    public void beforeDeciding(StepScope stepScope) {
+        periodChangeMoveFactory.beforeDeciding(stepScope);
+        roomChangeMoveFactory.beforeDeciding(stepScope);
+        examSwitchMoveFactory.beforeDeciding(stepScope);
+    }
+
+    public List<Move> selectMoveList(StepScope stepScope) {
+        if (nextShuffledExamListIndex >= shuffledExamList.size()) {
+            // Just in time shuffling
+            Collections.shuffle(shuffledExamList, stepScope.getWorkingRandom());
+            nextShuffledExamListIndex = 0;
+        }
+        Exam exam = shuffledExamList.get(nextShuffledExamListIndex);
+        List<Move> moveList = cachedExamToMoveMap.get(exam);
+        nextShuffledExamListIndex++;
+        return moveList;
+    }
+
+    @Override
+    public void stepDecided(StepScope stepScope) {
+        periodChangeMoveFactory.stepDecided(stepScope);
+        roomChangeMoveFactory.stepDecided(stepScope);
+        examSwitchMoveFactory.stepDecided(stepScope);
+    }
+
+    @Override
+    public void stepTaken(StepScope stepScope) {
+        periodChangeMoveFactory.stepTaken(stepScope);
+        roomChangeMoveFactory.stepTaken(stepScope);
+        examSwitchMoveFactory.stepTaken(stepScope);
+    }
+
+    @Override
+    public void solvingEnded(LocalSearchSolverScope localSearchSolverScope) {
+        periodChangeMoveFactory.solvingEnded(localSearchSolverScope);
+        roomChangeMoveFactory.solvingEnded(localSearchSolverScope);
+        examSwitchMoveFactory.solvingEnded(localSearchSolverScope);
+    }
+
+}

Copied: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/examination/solver/selector/AllMovesOfOneExamSelectorConfig.java (from rev 31468, 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-examples/src/main/java/org/drools/planner/examples/examination/solver/selector/AllMovesOfOneExamSelectorConfig.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/examination/solver/selector/AllMovesOfOneExamSelectorConfig.java	2010-02-14 10:37:38 UTC (rev 31659)
@@ -0,0 +1,35 @@
+package org.drools.planner.examples.examination.solver.selector;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import org.drools.planner.config.localsearch.decider.selector.SelectorConfig;
+import org.drools.planner.core.localsearch.decider.selector.Selector;
+
+/**
+ * A custom selector configuration for the Examination example.
+ * @see AllMovesOfOneExamSelector
+ * @author Geoffrey De Smet
+ */
+public class AllMovesOfOneExamSelectorConfig extends SelectorConfig {
+
+    // ************************************************************************
+    // Builder methods
+    // ************************************************************************
+
+    @Override
+    public Selector buildSelector() {
+        // Note that all properties of SelectorConfig are ignored.
+        return new AllMovesOfOneExamSelector();
+    }
+
+    @Override
+    public void inherit(SelectorConfig inheritedConfig) {
+        // Note that all inherited properties are ignored because all properties of SelectorConfig are ignored.
+        super.inherit(inheritedConfig);
+        if (inheritedConfig instanceof AllMovesOfOneExamSelectorConfig) {
+            AllMovesOfOneExamSelectorConfig allMovesOfOneExamSelectorConfig
+                    = (AllMovesOfOneExamSelectorConfig) inheritedConfig;
+            // Nothing specifically inheritable at the moment
+        }
+    }
+
+}



More information about the jboss-svn-commits mailing list