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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Apr 4 10:40:00 EDT 2010


Author: ge0ffrey
Date: 2010-04-04 10:40:00 -0400 (Sun, 04 Apr 2010)
New Revision: 32394

Modified:
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/ContractLine.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl
Log:
nurse rostering: maximumConsecutiveWorkingDays more effective

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/ContractLine.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/ContractLine.java	2010-04-04 13:56:16 UTC (rev 32393)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/ContractLine.java	2010-04-04 14:40:00 UTC (rev 32394)
@@ -53,6 +53,10 @@
         this.minimumValue = minimumValue;
     }
 
+    public int getMinimumIndexDiff() {
+        return minimumValue - 1;
+    }
+
     public int getMinimumWeight() {
         return minimumWeight;
     }
@@ -77,6 +81,10 @@
         this.maximumValue = maximumValue;
     }
 
+    public int getMaximumIndexDiff() {
+        return maximumValue - 1;
+    }
+
     public int getMaximumWeight() {
         return maximumWeight;
     }

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl	2010-04-04 13:56:16 UTC (rev 32393)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl	2010-04-04 14:40:00 UTC (rev 32394)
@@ -82,33 +82,70 @@
 // Maximum number of consecutive working days
 rule "maximumConsecutiveWorkingDays"
     when
-        $contractLine : ContractLine(contractLineType == ContractLineType.CONSECUTIVE_WORKING_DAYS,
-                maximumEnabled == true, $contract : contract, $maximumValue : maximumValue);
+        $contractLine : ContractLine(
+            contractLineType == ContractLineType.CONSECUTIVE_WORKING_DAYS, maximumEnabled == true,
+            $contract : contract, $maximumIndexDiff : maximumIndexDiff
+        );
         $employee : Employee(contract == $contract);
 
         // The first day has no working day before it
-        EmployeeAssignment(employee == $employee, $firstDayIndex : shiftDateDayIndex);
+        EmployeeAssignment(
+            employee == $employee,
+            $firstDayIndex : shiftDateDayIndex
+        );
         not EmployeeAssignment(employee == $employee, shiftDateDayIndex == ($firstDayIndex - 1));
 
         // The last day has no working day after it
-        EmployeeAssignment(employee == $employee, shiftDateDayIndex > $firstDayIndex, $lastDayIndex : shiftDateDayIndex);
+        EmployeeAssignment(
+            employee == $employee,
+            shiftDateDayIndex > ($firstDayIndex + $maximumIndexDiff), // Too many days
+            $lastDayIndex : shiftDateDayIndex
+        );
         not EmployeeAssignment(employee == $employee, shiftDateDayIndex == ($lastDayIndex + 1));
 
         // There are no free days between the first and last day
-        forall($shiftDate : ShiftDate(dayIndex > $firstDayIndex, dayIndex < $lastDayIndex)
-               EmployeeAssignment(employee == $employee, shiftDate == $shiftDate)
+        forall($shiftDate : ShiftDate(dayIndex > $firstDayIndex && < $lastDayIndex)
+            EmployeeAssignment(employee == $employee, shiftDate == $shiftDate)
         );
-
-        // There are to many days
-        eval(($lastDayIndex - $firstDayIndex + 1) > $maximumValue);
     then
         insertLogical(new IntConstraintOccurrence("maximumConsecutiveWorkingDays", ConstraintType.NEGATIVE_SOFT,
-                (($lastDayIndex - $firstDayIndex + 1) - $maximumValue) * $contractLine.getMaximumWeight(),
+                ($lastDayIndex - $firstDayIndex - $maximumIndexDiff) * $contractLine.getMaximumWeight(),
                 $employee, $firstDayIndex, $lastDayIndex));
 end
 
-// Minimum number of consecutive working days
-// TODO
+//// Minimum number of consecutive working days
+//rule "minimumConsecutiveWorkingDays"
+//    when
+//        $contractLine : ContractLine(
+//            contractLineType == ContractLineType.CONSECUTIVE_WORKING_DAYS, minimumEnabled == true,
+//            $contract : contract, $minimumIndexDiff : minimumIndexDiff
+//        );
+//        $employee : Employee(contract == $contract);
+//
+//        // The first day has no working day before it
+//        EmployeeAssignment(
+//            employee == $employee,
+//            $firstDayIndex : shiftDateDayIndex
+//        );
+//        not EmployeeAssignment(employee == $employee, shiftDateDayIndex == ($firstDayIndex - 1));
+//
+//        // The last day has no working day after it
+//        EmployeeAssignment(
+//            employee == $employee,
+//            shiftDateDayIndex < ($firstDayIndex + $minimumIndexDiff), // Too few days
+//            $lastDayIndex : shiftDateDayIndex
+//        );
+//        not EmployeeAssignment(employee == $employee, shiftDateDayIndex == ($lastDayIndex + 1));
+//
+//        // There are no free days between the first and last day
+//        forall($shiftDate : ShiftDate(dayIndex > $firstDayIndex && < $lastDayIndex)
+//            EmployeeAssignment(employee == $employee, shiftDate == $shiftDate)
+//        );
+//    then
+//        insertLogical(new IntConstraintOccurrence("minimumConsecutiveWorkingDays", ConstraintType.NEGATIVE_SOFT,
+//                ($minimumIndexDiff - $lastDayIndex + $firstDayIndex) * $contractLine.getMinimumWeight(),
+//                $employee, $firstDayIndex, $lastDayIndex));
+//end
 
 // Maximum number of consecutive free days
 // TODO



More information about the jboss-svn-commits mailing list