[jboss-svn-commits] JBL Code SVN: r17767 - in labs/jbossrules/trunk/drools-solver: drools-solver-core/src/main/java/org/drools/solver/core and 7 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Jan 12 15:54:47 EST 2008


Author: ge0ffrey
Date: 2008-01-12 15:54:47 -0500 (Sat, 12 Jan 2008)
New Revision: 17767

Added:
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/SolverAware.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/solution/initializer/
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/solution/initializer/AbstractStartingSolutionInitializer.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/solution/initializer/StartingSolutionInitializer.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationStartingSolutionInitializer.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/core/evaluation/EvaluationHandler.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/DefaultLocalSearchSolver.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/LocalSearchSolverAware.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml
Log:
StartingSolutionInitializer

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-12 16:26:11 UTC (rev 17766)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/LocalSearchSolverConfig.java	2008-01-12 20:54:47 UTC (rev 17767)
@@ -23,6 +23,7 @@
 import org.drools.solver.core.localsearch.bestsolution.BestSolutionRecaller;
 import org.drools.solver.core.localsearch.decider.Decider;
 import org.drools.solver.core.localsearch.decider.DefaultDecider;
+import org.drools.solver.core.solution.initializer.StartingSolutionInitializer;
 
 /**
  * @author Geoffrey De Smet
@@ -37,6 +38,9 @@
     @XStreamAlias("scoreCalculator")
     private ScoreCalculatorConfig scoreCalculatorConfig = new ScoreCalculatorConfig();
 
+    private StartingSolutionInitializer startingSolutionInitializer = null;
+    private Class<StartingSolutionInitializer> startingSolutionInitializerClass = null;
+
     @XStreamAlias("finish")
     private FinishConfig finishConfig = new FinishConfig(); // TODO this new is pointless due to xstream
 
@@ -115,6 +119,7 @@
             localSearchSolver.setRandomSeed(0L);
         }
         localSearchSolver.setEvaluationHandler(buildEvaluationHandler());
+        localSearchSolver.setStartingSolutionInitializer(buildStartingSolutionInitializer());
         localSearchSolver.setBestSolutionRecaller(new BestSolutionRecaller());
         localSearchSolver.setFinish(finishConfig.buildFinish());
         localSearchSolver.setDecider(buildDecider());
@@ -155,6 +160,26 @@
         return ruleBase;
     }
 
+    public StartingSolutionInitializer buildStartingSolutionInitializer() {
+        if (startingSolutionInitializer != null) {
+            return startingSolutionInitializer;
+        } else if (startingSolutionInitializerClass != null) {
+            try {
+                return startingSolutionInitializerClass.newInstance();
+            } catch (InstantiationException e) {
+                throw new IllegalArgumentException("startingSolutionInitializerClass ("
+                        + startingSolutionInitializerClass.getName()
+                        + ") does not have a public no-arg constructor", e);
+            } catch (IllegalAccessException e) {
+                throw new IllegalArgumentException("startingSolutionInitializerClass ("
+                        + startingSolutionInitializerClass.getName()
+                        + ") does not have a public no-arg constructor", e);
+            }
+        } else {
+            return null;
+        }
+    }
+
     private Decider buildDecider() {
         DefaultDecider decider = new DefaultDecider();
         decider.setMoveFactory(selectorConfig.buildMoveFactory());

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/SolverAware.java (from rev 17581, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/LocalSearchSolverAware.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/SolverAware.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/SolverAware.java	2008-01-12 20:54:47 UTC (rev 17767)
@@ -0,0 +1,10 @@
+package org.drools.solver.core;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public interface SolverAware {
+
+    void setSolver(Solver solver);
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/evaluation/EvaluationHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/evaluation/EvaluationHandler.java	2008-01-12 16:26:11 UTC (rev 17766)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/evaluation/EvaluationHandler.java	2008-01-12 20:54:47 UTC (rev 17767)
@@ -57,7 +57,7 @@
     /**
      * Resets the WorkingMemory by creating a new one and asserting the solution into it.
      */
-    public void resetStatefullSession() {
+    private void resetStatefullSession() {
         if (statefulSession != null) {
             statefulSession.dispose();
         }

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/DefaultLocalSearchSolver.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/DefaultLocalSearchSolver.java	2008-01-12 16:26:11 UTC (rev 17766)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/DefaultLocalSearchSolver.java	2008-01-12 20:54:47 UTC (rev 17767)
@@ -8,6 +8,7 @@
 import org.drools.solver.core.localsearch.finish.Finish;
 import org.drools.solver.core.move.Move;
 import org.drools.solver.core.solution.Solution;
+import org.drools.solver.core.solution.initializer.StartingSolutionInitializer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -21,6 +22,7 @@
     protected long randomSeed; // TODO refactor to AbstractSolver
 
     protected EvaluationHandler evaluationHandler; // TODO refactor to AbstractSolver
+    protected StartingSolutionInitializer startingSolutionInitializer = null; // TODO refactor to AbstractSolver
     protected BestSolutionRecaller bestSolutionRecaller;
     protected Finish finish;
     protected Decider decider;
@@ -42,19 +44,30 @@
         this.evaluationHandler = evaluationHandler;
     }
 
+    public StartingSolutionInitializer getStartingSolutionInitializer() {
+        return startingSolutionInitializer;
+    }
+
+    public void setStartingSolutionInitializer(StartingSolutionInitializer startingSolutionInitializer) {
+        this.startingSolutionInitializer = startingSolutionInitializer;
+        if (startingSolutionInitializer != null) {
+            this.startingSolutionInitializer.setSolver(this);
+        }
+    }
+
     public void setBestSolutionRecaller(BestSolutionRecaller bestSolutionRecaller) {
         this.bestSolutionRecaller = bestSolutionRecaller;
-        bestSolutionRecaller.setLocalSearchSolver(this);
+        this.bestSolutionRecaller.setLocalSearchSolver(this);
     }
 
     public void setDecider(Decider decider) {
         this.decider = decider;
-        decider.setLocalSearchSolver(this);
+        this.decider.setLocalSearchSolver(this);
     }
 
     public void setFinish(Finish finish) {
         this.finish = finish;
-        finish.setLocalSearchSolver(this);
+        this.finish.setLocalSearchSolver(this);
     }
 
 
@@ -127,6 +140,9 @@
         startingSystemTimeMillis = System.currentTimeMillis();
         logger.info("Solving with random seed ({}).", randomSeed);
         random = new Random(randomSeed);
+        if (startingSolutionInitializer != null) {
+            startingSolutionInitializer.intializeSolution();
+        }
         stepIndex = 0;
         stepScore = evaluationHandler.fireAllRulesAndCalculateStepScore();
         bestSolutionRecaller.solvingStarted();

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/LocalSearchSolverAware.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/LocalSearchSolverAware.java	2008-01-12 16:26:11 UTC (rev 17766)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/LocalSearchSolverAware.java	2008-01-12 20:54:47 UTC (rev 17767)
@@ -5,9 +5,6 @@
  */
 public interface LocalSearchSolverAware {
 
-    /**
-     * Called during configuration to set
-     */
     void setLocalSearchSolver(LocalSearchSolver localSearchSolver);
 
 }

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/solution/initializer/AbstractStartingSolutionInitializer.java (from rev 17581, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AbstractForager.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/solution/initializer/AbstractStartingSolutionInitializer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/solution/initializer/AbstractStartingSolutionInitializer.java	2008-01-12 20:54:47 UTC (rev 17767)
@@ -0,0 +1,24 @@
+package org.drools.solver.core.solution.initializer;
+
+import org.drools.solver.core.Solver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public abstract class AbstractStartingSolutionInitializer implements StartingSolutionInitializer {
+
+    protected final transient Logger logger = LoggerFactory.getLogger(getClass());
+
+    protected Solver solver;
+
+    public void setSolver(Solver solver) {
+        this.solver = solver;
+    }
+
+    // ************************************************************************
+    // Worker methods
+    // ************************************************************************
+
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/solution/initializer/StartingSolutionInitializer.java (from rev 17581, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/Forager.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/solution/initializer/StartingSolutionInitializer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/solution/initializer/StartingSolutionInitializer.java	2008-01-12 20:54:47 UTC (rev 17767)
@@ -0,0 +1,12 @@
+package org.drools.solver.core.solution.initializer;
+
+import org.drools.solver.core.SolverAware;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public interface StartingSolutionInitializer extends SolverAware {
+
+    void intializeSolution();
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java	2008-01-12 16:26:11 UTC (rev 17766)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java	2008-01-12 20:54:47 UTC (rev 17767)
@@ -295,6 +295,7 @@
             public int compare(Topic a, Topic b) {
                 return new CompareToBuilder()
                         .append(a.getStudentListSize(), b.getStudentListSize())
+                        .append(a.getId(), b.getId())
                         .toComparison();
             }
         });
@@ -317,39 +318,17 @@
         if (frontLoadLastPeriodSize == 0) {
             return;
         }
-        int minimumPeriodIndex = periodList.get(periodList.size() - frontLoadLastPeriodSize).getPeriodIndex();
-        for (Period period : periodList) {
-            if (period.getPeriodIndex() >= minimumPeriodIndex) {
-                period.setFrontLoadLast(true);
-            }
+        int minimumPeriodId = periodList.size() - frontLoadLastPeriodSize;
+        if (minimumPeriodId < 0) {
+            logger.warn("The frontLoadLastPeriodSize (" + frontLoadLastPeriodSize + ") is bigger than periodListSize ("
+                    + periodList.size() + "). Tagging all periods as large...");
+            minimumPeriodId = 0;
         }
+        for (Period period : periodList.subList(minimumPeriodId, periodList.size())) {
+            period.setFrontLoadLast(true);
+        }
     }
 
-//    private void createExamList(Examination examination) {
-//        List<Topic> topicList = examination.getTopicList();
-//        List<Period> periodList = examination.getPeriodList();
-//        List<Room> roomList = examination.getRoomList();
-//        List<Exam> examList = new ArrayList<Exam>(topicList.size());
-//        int periodIndex = 0;
-//        int roomIndex = 0;
-//        int roomAddition = 0;
-//        for (Topic topic : topicList) {
-//            Exam exam = new Exam();
-//            exam.setId(topic.getId());
-//            exam.setTopic(topic);
-//            exam.setPeriod(periodList.get(periodIndex));
-//            exam.setRoom(roomList.get(roomIndex));
-//            periodIndex = (periodIndex + 1) % periodList.size();
-//            roomIndex = (roomIndex + 1) % roomList.size();
-//            if (roomIndex == 0) {
-//                roomAddition = (roomAddition + 1) % roomList.size();
-//                roomIndex = roomAddition;
-//            }
-//            examList.add(exam);
-//        }
-//        examination.setExamList(examList);
-//    }
-
     private void createExamList(Examination examination) {
         XmlSolverConfigurer configurer = new XmlSolverConfigurer();
         configurer.configure(ExaminationApp.SOLVER_CONFIG);
@@ -361,7 +340,6 @@
         List<Exam> examList = new ArrayList<Exam>(topicList.size());
         examination.setExamList(examList);
         evaluationHandler.setSolution(examination);
-        evaluationHandler.resetStatefullSession();
         StatefulSession workingMemory = evaluationHandler.getStatefulSession();
 
         // Sort the order in which we 'll assign the topics into periods and rooms
@@ -375,7 +353,6 @@
         });
 
         for (Topic topic : sortedTopicList) {
-            logger.info("Scheduling topic ({}).", topic);
             double unscheduledScore = evaluationHandler.fireAllRulesAndCalculateStepScore();
 
             Exam exam = new Exam();
@@ -439,6 +416,7 @@
                 exam.setRoom(bestRoom);
                 workingMemory.update(examHandle, exam);
             }
+            logger.debug("    Exam ({}) initialized for starting solution.", exam);
         }
         Collections.sort(examList, new PersistableIdComparator());
     }
@@ -467,82 +445,4 @@
 
     }
 
-    private void createExamListSlow(Examination examination) {
-        XmlSolverConfigurer configurer = new XmlSolverConfigurer();
-        configurer.configure(ExaminationApp.SOLVER_CONFIG);
-        EvaluationHandler evaluationHandler = configurer.buildSolver().getEvaluationHandler();
-
-        List<Topic> topicList = examination.getTopicList();
-        List<Period> periodList = examination.getPeriodList();
-        List<Room> roomList = examination.getRoomList();
-        List<Exam> examList = new ArrayList<Exam>(topicList.size());
-        examination.setExamList(examList);
-        evaluationHandler.setSolution(examination);
-        evaluationHandler.resetStatefullSession();
-        StatefulSession workingMemory = evaluationHandler.getStatefulSession();
-
-        // Sort the order in which we 'll assign the topics into periods and rooms
-        List<Topic> sortedTopicList = new ArrayList<Topic>(topicList);
-        Collections.sort(sortedTopicList, new Comparator<Topic>() {
-            public int compare(Topic a, Topic b) {
-                return new CompareToBuilder()
-                        .append(a.getStudentListSize(), b.getStudentListSize())
-                        .toComparison();
-            }
-        });
-
-        for (Topic topic : sortedTopicList) {
-            logger.info("Scheduling topic ({}).", topic);
-            double unscheduledScore = evaluationHandler.fireAllRulesAndCalculateStepScore();
-
-            Exam exam = new Exam();
-            exam.setId(topic.getId());
-            exam.setTopic(topic);
-            examList.add(exam);
-
-            FactHandle examHandle = null;
-            boolean perfectMatch = false;
-            double bestScore = Double.NEGATIVE_INFINITY;
-            Period bestPeriod = null;
-            Room bestRoom = null;
-            for (Period period : periodList) {
-                exam.setPeriod(period);
-                for (Room room : roomList) {
-                    exam.setRoom(room);
-                    if (examHandle == null) {
-                        examHandle = workingMemory.insert(exam);
-                    }
-                    workingMemory.update(examHandle, exam);
-                    double score = evaluationHandler.fireAllRulesAndCalculateStepScore();
-                    if (score < unscheduledScore) {
-                        if (score > bestScore) {
-                            bestScore = score;
-                            bestPeriod = period;
-                            bestRoom = room;
-                        }
-                    } else if (score == unscheduledScore) {
-                        perfectMatch = true;
-                        break;
-                    } else {
-                        throw new IllegalStateException("The score (" + score
-                                + ") cannot be higher than unscheduledScore (" + unscheduledScore + ").");
-                    }
-                }
-                if (perfectMatch) {
-                    break;
-                }
-            }
-            if (!perfectMatch) {
-                if (bestPeriod == null || bestRoom == null) {
-                    throw new IllegalStateException("The bestPeriod (" + bestPeriod + ") or the bestRoom ("
-                            + bestRoom + ") cannot be null.");
-                }
-                exam.setPeriod(bestPeriod);
-                exam.setRoom(bestRoom);
-                workingMemory.update(examHandle, exam);
-            }
-        }
-        Collections.sort(examList, new PersistableIdComparator());
-    }
-
 }

Added: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationStartingSolutionInitializer.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationStartingSolutionInitializer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationStartingSolutionInitializer.java	2008-01-12 20:54:47 UTC (rev 17767)
@@ -0,0 +1,18 @@
+package org.drools.solver.examples.itc2007.examination.solver;
+
+import org.drools.solver.core.solution.initializer.AbstractStartingSolutionInitializer;
+import org.drools.solver.examples.itc2007.examination.domain.Examination;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class ExaminationStartingSolutionInitializer extends AbstractStartingSolutionInitializer {
+
+    public void intializeSolution() {
+        Examination examination = (Examination) solver.getEvaluationHandler().getSolution();
+        if (examination.getExamList() == null) {
+            // TODO do stuff
+        }
+    }
+
+}

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-12 16:26:11 UTC (rev 17766)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml	2008-01-12 20:54:47 UTC (rev 17767)
@@ -4,6 +4,7 @@
     <scoreCalculator>
         <scoreCalculatorType>HARD_AND_SOFT_CONSTRAINTS</scoreCalculatorType>
     </scoreCalculator>
+    <startingSolutionInitializerClass>org.drools.solver.examples.itc2007.examination.solver.ExaminationStartingSolutionInitializer</startingSolutionInitializerClass>
     <finish>
         <feasableScore>-999999.0</feasableScore>
         <!--<maximumSecondsSpend>429</maximumSecondsSpend>-->




More information about the jboss-svn-commits mailing list