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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Jan 13 16:40:21 EST 2008


Author: ge0ffrey
Date: 2008-01-13 16:40:20 -0500 (Sun, 13 Jan 2008)
New Revision: 17796

Modified:
   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/resources/org/drools/solver/examples/itc2007/examination/solver/examinationScoreRules.drl
Log:
hack to fix out-of-sync bug, starting solution intializer re-order

Modified: 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	2008-01-13 20:49:58 UTC (rev 17795)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationStartingSolutionInitializer.java	2008-01-13 21:40:20 UTC (rev 17796)
@@ -14,6 +14,8 @@
 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.PeriodHardConstraint;
+import org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraintType;
 import org.drools.solver.examples.itc2007.examination.domain.Room;
 import org.drools.solver.examples.itc2007.examination.domain.Topic;
 
@@ -39,17 +41,9 @@
         evaluationHandler.setSolution(examination);
         StatefulSession statefulSession = 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();
-            }
-        });
+        List<Topic> assigningTopicList = createAssigningTopicList(examination);
 
-        for (Topic topic : sortedTopicList) {
+        for (Topic topic : assigningTopicList) {
             double unscheduledScore = evaluationHandler.fireAllRulesAndCalculateStepScore();
 
             Exam exam = new Exam();
@@ -119,6 +113,35 @@
         Collections.sort(examList, new PersistableIdComparator());
     }
 
+    /**
+     * Order the topics in the order which we 'll assign them into periods and rooms.
+     * @param examination not null
+     * @return not null
+     */
+    private List<Topic> createAssigningTopicList(Examination examination) {
+        List<Topic> assigningTopicList = new ArrayList<Topic>(examination.getTopicList());
+        Collections.sort(assigningTopicList, new Comparator<Topic>() {
+            public int compare(Topic a, Topic b) {
+                // Descending
+                return new CompareToBuilder()
+                        .append(b.getStudentListSize(), a.getStudentListSize())
+                        .toComparison();
+            }
+        });
+        for (PeriodHardConstraint periodHardConstraint : examination.getPeriodHardConstraintList()) {
+            if (periodHardConstraint.getPeriodHardConstraintType() == PeriodHardConstraintType.AFTER) {
+                int afterSideIndex = assigningTopicList.indexOf(periodHardConstraint.getLeftSideTopic());
+                int beforeSideIndex = assigningTopicList.indexOf(periodHardConstraint.getRightSideTopic());
+                if (afterSideIndex < beforeSideIndex) {
+                    Topic beforeTopic = assigningTopicList.remove(beforeSideIndex);
+                    assigningTopicList.add(afterSideIndex, beforeTopic);
+                }
+            }
+        }
+
+        return assigningTopicList;
+    }
+
     private class PeriodScoring implements Comparable<PeriodScoring> {
 
         private Period period;

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationScoreRules.drl
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationScoreRules.drl	2008-01-13 20:49:58 UTC (rev 17795)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationScoreRules.drl	2008-01-13 21:40:20 UTC (rev 17796)
@@ -123,9 +123,15 @@
         Exam(topic == $leftSideTopic, $afterSidePeriod : period);
         Exam(topic == $rightSideTopic, eval($afterSidePeriod.getPeriodIndex() <= period.getPeriodIndex()),
                 $beforeSidePeriod : period);
+        // HACK to fix wierd truth maintance behavior in drools
+        // because making weight part of the equals/hashcode doesn't cut it
+        not(IntConstraintOccurrence(
+            ruleId == "periodHardConstraintAfter",
+            constraintType == ConstraintType.NEGATIVE_HARD,
+            causes contains $periodHardConstraint,
+            eval(weight != ($beforeSidePeriod.getPeriodIndex() - $afterSidePeriod.getPeriodIndex() + 1))));
     then
         insertLogical(new IntConstraintOccurrence("periodHardConstraintAfter", ConstraintType.NEGATIVE_HARD,
-            // TODO this gets corrupted as long as the rule fires because a wierd feature (=bug?) in drools
             ($beforeSidePeriod.getPeriodIndex() - $afterSidePeriod.getPeriodIndex() + 1),
             $periodHardConstraint));
 end




More information about the jboss-svn-commits mailing list