[jboss-svn-commits] JBL Code SVN: r17988 - in labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination: solver/solution/initializer and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Jan 20 14:23:21 EST 2008


Author: ge0ffrey
Date: 2008-01-20 14:23:20 -0500 (Sun, 20 Jan 2008)
New Revision: 17988

Added:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/ExamBefore.java
Modified:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Exam.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/solution/initializer/ExaminationStartingSolutionInitializer.java
Log:
examBefore added to initializer

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Exam.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Exam.java	2008-01-20 17:21:41 UTC (rev 17987)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Exam.java	2008-01-20 19:23:20 UTC (rev 17988)
@@ -12,7 +12,9 @@
 
     private Topic topic;
 
+    // Calculated during initialization, not used for score calculation, used for move creation.
     private ExamCoincidence examCoincidence = null;
+    private ExamBefore examBefore = null;
 
     // Changed by moves, between score calculations.
     private Period period;
@@ -34,6 +36,14 @@
         this.examCoincidence = examCoincidence;
     }
 
+    public ExamBefore getExamBefore() {
+        return examBefore;
+    }
+
+    public void setExamBefore(ExamBefore examBefore) {
+        this.examBefore = examBefore;
+    }
+
     public Period getPeriod() {
         return period;
     }

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/ExamBefore.java (from rev 17987, labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/ExamCoincidence.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/ExamBefore.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/ExamBefore.java	2008-01-20 19:23:20 UTC (rev 17988)
@@ -0,0 +1,26 @@
+package org.drools.solver.examples.itc2007.examination.domain;
+
+import java.io.Serializable;
+import java.util.Set;
+
+/**
+ * Calculated during initialization, not used for score calculation, used for move creation.
+ * @author Geoffrey De Smet
+ */
+public class ExamBefore implements Serializable {
+
+    private Set<Exam> afterExamSet;
+
+    public ExamBefore(Set<Exam> afterExamSet) {
+        this.afterExamSet = afterExamSet;
+    }
+
+    public Set<Exam> getAfterExamSet() {
+        return afterExamSet;
+    }
+
+    public void setAfterExamSet(Set<Exam> afterExamSet) {
+        this.afterExamSet = afterExamSet;
+    }
+
+}
\ 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/solution/initializer/ExaminationStartingSolutionInitializer.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/solution/initializer/ExaminationStartingSolutionInitializer.java	2008-01-20 17:21:41 UTC (rev 17987)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/solution/initializer/ExaminationStartingSolutionInitializer.java	2008-01-20 19:23:20 UTC (rev 17988)
@@ -3,7 +3,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -15,6 +15,7 @@
 import org.drools.solver.core.solution.initializer.AbstractStartingSolutionInitializer;
 import org.drools.solver.examples.common.domain.PersistableIdComparator;
 import org.drools.solver.examples.itc2007.examination.domain.Exam;
+import org.drools.solver.examples.itc2007.examination.domain.ExamBefore;
 import org.drools.solver.examples.itc2007.examination.domain.ExamCoincidence;
 import org.drools.solver.examples.itc2007.examination.domain.Examination;
 import org.drools.solver.examples.itc2007.examination.domain.Period;
@@ -222,26 +223,6 @@
             }
         }
         Collections.sort(examInitialWeightList);
-        for (PeriodHardConstraint periodHardConstraint : examination.getPeriodHardConstraintList()) {
-            if (periodHardConstraint.getPeriodHardConstraintType() == PeriodHardConstraintType.AFTER) {
-                int afterSideIndex = -1;
-                int beforeSideIndex = -1;
-                for (int i = 0; i < examInitialWeightList.size(); i++) {
-                    Topic topic = examInitialWeightList.get(i).getExam().getTopic();
-                    if (topic.equals(periodHardConstraint.getLeftSideTopic())) { // TODO FIXME topic could be in coinc.
-                        afterSideIndex = i;
-                    }
-                    if (topic.equals(periodHardConstraint.getRightSideTopic())) { // TODO FIXME topic could be in coinc.
-                        beforeSideIndex = i;
-                    }
-                }
-                if (afterSideIndex < beforeSideIndex) {
-                    ExamInitialWeight beforeExamInitialWeight = examInitialWeightList.remove(beforeSideIndex);
-                    examInitialWeightList.add(afterSideIndex, beforeExamInitialWeight);
-                }
-            }
-        }
-
         return examInitialWeightList;
     }
 
@@ -261,7 +242,7 @@
                 Exam leftExam = topicToExamMap.get(periodHardConstraint.getLeftSideTopic());
                 Exam rightExam = topicToExamMap.get(periodHardConstraint.getRightSideTopic());
 
-                Set<Exam> newCoincidenceExamSet = new HashSet<Exam>();
+                Set<Exam> newCoincidenceExamSet = new LinkedHashSet<Exam>(4);
                 ExamCoincidence leftExamCoincidence = leftExam.getExamCoincidence();
                 if (leftExamCoincidence != null) {
                     newCoincidenceExamSet.addAll(leftExamCoincidence.getCoincidenceExamSet());
@@ -277,6 +258,15 @@
                 ExamCoincidence newExamCoincidence = new ExamCoincidence(newCoincidenceExamSet);
                 leftExam.setExamCoincidence(newExamCoincidence);
                 rightExam.setExamCoincidence(newExamCoincidence);
+            } else if (periodHardConstraint.getPeriodHardConstraintType() == PeriodHardConstraintType.AFTER) {
+                Exam afterExam = topicToExamMap.get(periodHardConstraint.getLeftSideTopic());
+                Exam beforeExam = topicToExamMap.get(periodHardConstraint.getRightSideTopic());
+                ExamBefore examBefore = beforeExam.getExamBefore();
+                if (examBefore == null) {
+                    examBefore = new ExamBefore(new LinkedHashSet<Exam>(2));
+                    beforeExam.setExamBefore(examBefore);
+                }
+                examBefore.getAfterExamSet().add(afterExam);
             }
         }
         return examList;
@@ -286,18 +276,44 @@
 
         private Exam exam;
         private int totalStudentSize;
+        private int maximumDuration;
 
         private ExamInitialWeight(Exam exam) {
             this.exam = exam;
-            if (exam.getExamCoincidence() == null) {
-                totalStudentSize = exam.getTopicStudentListSize();
+            totalStudentSize = calculateTotalStudentSize(exam);
+            maximumDuration = calculateMaximumDuration(exam);
+        }
+
+        private int calculateTotalStudentSize(Exam innerExam) {
+            int innerTotalStudentSize = 0;
+            if (innerExam.getExamCoincidence() == null) {
+                innerTotalStudentSize = innerExam.getTopicStudentListSize();
             } else {
-                totalStudentSize = 0;
-                for (Exam coincidenceExam : exam.getExamCoincidence().getCoincidenceExamSet()) {
-                    totalStudentSize += coincidenceExam.getTopicStudentListSize();
+                for (Exam coincidenceExam : innerExam.getExamCoincidence().getCoincidenceExamSet()) {
+                    innerTotalStudentSize += coincidenceExam.getTopicStudentListSize();
                 }
             }
+            if (innerExam.getExamBefore() != null) {
+                for (Exam afterExam : innerExam.getExamBefore().getAfterExamSet()) {
+                    innerTotalStudentSize += calculateTotalStudentSize(afterExam); // recursive
+                }
+            }
+            return innerTotalStudentSize;
+        }
 
+        private int calculateMaximumDuration(Exam innerExam) {
+            int innerMaximumDuration = innerExam.getTopic().getDuration();
+            if (innerExam.getExamCoincidence() != null) {
+                for (Exam coincidenceExam : innerExam.getExamCoincidence().getCoincidenceExamSet()) {
+                    innerMaximumDuration = Math.max(innerMaximumDuration, coincidenceExam.getTopicStudentListSize());
+                }
+            }
+            if (innerExam.getExamBefore() != null) {
+                for (Exam afterExam : innerExam.getExamBefore().getAfterExamSet()) {
+                    innerMaximumDuration = Math.max(innerMaximumDuration, calculateMaximumDuration(afterExam)); // recursive
+                }
+            }
+            return innerMaximumDuration;
         }
 
         public Exam getExam() {
@@ -308,7 +324,7 @@
             // TODO calculate a assigningScore based on the properties of a topic and sort on that assigningScore
             return new CompareToBuilder()
                     .append(other.totalStudentSize, totalStudentSize) // Descending
-                    .append(other.exam.getTopic().getDuration(), exam.getTopic().getDuration()) // Descending
+                    .append(other.maximumDuration, maximumDuration) // Descending
                     .append(exam.getId(), other.exam.getId()) // Ascending
                     .toComparison();
         }




More information about the jboss-svn-commits mailing list