[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