[jboss-svn-commits] JBL Code SVN: r33030 - 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
Mon May 24 06:24:32 EDT 2010
Author: ge0ffrey
Date: 2010-05-24 06:24:32 -0400 (Mon, 24 May 2010)
New Revision: 33030
Added:
labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeFreeDaySequence.java
Modified:
labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignment.java
labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl
Log:
nurse rostering: insertEmployeeFreeDaySequence + minimumConsecutiveFreeDays + maximumConsecutiveFreeDays (some free days unaccounted for)
Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignment.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignment.java 2010-05-24 10:06:21 UTC (rev 33029)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignment.java 2010-05-24 10:24:32 UTC (rev 33030)
@@ -92,7 +92,7 @@
@Override
public String toString() {
- return employee + " " + firstShiftDate + " - " + lastShiftDate;
+ return employee + " is working between " + firstShiftDate + " - " + lastShiftDate;
}
}
Copied: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeFreeDaySequence.java (from rev 32994, labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignment.java)
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeFreeDaySequence.java (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeFreeDaySequence.java 2010-05-24 10:24:32 UTC (rev 33030)
@@ -0,0 +1,98 @@
+package org.drools.planner.examples.nurserostering.domain.solver;
+
+import java.io.Serializable;
+
+import org.apache.commons.lang.builder.CompareToBuilder;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.drools.planner.examples.nurserostering.domain.Employee;
+import org.drools.planner.examples.nurserostering.domain.ShiftDate;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class EmployeeFreeDaySequence implements Comparable<EmployeeFreeDaySequence>, Serializable {
+
+ private Employee employee;
+ private ShiftDate firstShiftDate;
+ private ShiftDate lastShiftDate;
+
+ public EmployeeFreeDaySequence(Employee employee, ShiftDate firstShiftDate, ShiftDate lastShiftDate) {
+ this.employee = employee;
+ this.firstShiftDate = firstShiftDate;
+ this.lastShiftDate = lastShiftDate;
+ }
+
+ public Employee getEmployee() {
+ return employee;
+ }
+
+ public void setEmployee(Employee employee) {
+ this.employee = employee;
+ }
+
+ public ShiftDate getFirstShiftDate() {
+ return firstShiftDate;
+ }
+
+ public void setFirstShiftDate(ShiftDate firstShiftDate) {
+ this.firstShiftDate = firstShiftDate;
+ }
+
+ public ShiftDate getLastShiftDate() {
+ return lastShiftDate;
+ }
+
+ public void setLastShiftDate(ShiftDate lastShiftDate) {
+ this.lastShiftDate = lastShiftDate;
+ }
+
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ } else if (o instanceof EmployeeFreeDaySequence) {
+ EmployeeFreeDaySequence other = (EmployeeFreeDaySequence) o;
+ return new EqualsBuilder()
+ .append(employee, other.employee)
+ .append(firstShiftDate, other.firstShiftDate)
+ .append(lastShiftDate, other.lastShiftDate)
+ .isEquals();
+ } else {
+ return false;
+ }
+ }
+
+ public int hashCode() {
+ return new HashCodeBuilder()
+ .append(employee)
+ .append(firstShiftDate)
+ .append(lastShiftDate)
+ .toHashCode();
+ }
+
+ public int compareTo(EmployeeFreeDaySequence other) {
+ return new CompareToBuilder()
+ .append(employee, other.employee)
+ .append(firstShiftDate, other.firstShiftDate)
+ .append(lastShiftDate, other.lastShiftDate)
+ .toComparison();
+ }
+
+ public int getFirstShiftDateDayIndex() {
+ return firstShiftDate.getDayIndex();
+ }
+
+ public int getLastShiftDateDayIndex() {
+ return lastShiftDate.getDayIndex();
+ }
+
+ public int getDayLength() {
+ return lastShiftDate.getDayIndex() - firstShiftDate.getDayIndex() + 1;
+ }
+
+ @Override
+ public String toString() {
+ return employee + " is free between " + firstShiftDate + " - " + lastShiftDate;
+ }
+
+}
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-05-24 10:06:21 UTC (rev 33029)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl 2010-05-24 10:24:32 UTC (rev 33030)
@@ -27,6 +27,7 @@
import org.drools.planner.examples.nurserostering.domain.request.ShiftOnRequest;
import org.drools.planner.examples.nurserostering.domain.solver.EmployeeAssignmentTotal;
import org.drools.planner.examples.nurserostering.domain.solver.EmployeeConsecutiveAssignment;
+import org.drools.planner.examples.nurserostering.domain.solver.EmployeeFreeDaySequence;
import org.drools.planner.examples.nurserostering.domain.solver.EmployeeConsecutiveAssignmentEnd;
import org.drools.planner.examples.nurserostering.domain.solver.EmployeeConsecutiveAssignmentStart;
@@ -112,6 +113,7 @@
$employee));
end
+
rule "insertEmployeeConsecutiveAssignmentStart"
salience 2 // Do these rules first (optional, for performance)
when
@@ -138,6 +140,8 @@
then
insertLogical(new EmployeeConsecutiveAssignmentEnd($employee, $shiftDate));
end
+
+
rule "insertEmployeeConsecutiveAssignment"
salience 1 // Do these rules first (optional, for performance)
when
@@ -203,47 +207,73 @@
$employeeConsecutiveAssignment));
end
+
+rule "insertEmployeeFreeDaySequence"
+ salience 1 // Do these rules first (optional, for performance)
+ when
+ EmployeeConsecutiveAssignmentEnd(
+ $employee : employee,
+ $firstShiftDate : shiftDate,
+ $firstDayIndex : shiftDateDayIndex
+ )
+
+ EmployeeConsecutiveAssignmentStart(
+ employee == $employee,
+ shiftDateDayIndex >= $firstDayIndex,
+ $lastShiftDate : shiftDate,
+ $lastDayIndex : shiftDateDayIndex
+ )
+
+ // There are no working days between the first and last day
+ not EmployeeConsecutiveAssignmentStart(
+ employee == $employee,
+ shiftDateDayIndex >= $firstDayIndex && < $lastDayIndex
+ )
+ then
+ insertLogical(new EmployeeFreeDaySequence($employee, $firstShiftDate, $lastShiftDate));
+end
+
// Minimum number of consecutive free days
-//rule "minimumConsecutiveFreeDays"
-// when
-// $contractLine : MinMaxContractLine(
-// contractLineType == ContractLineType.CONSECUTIVE_FREE_DAYS, minimumEnabled == true,
-// $contract : contract, $minimumIndexDiff : minimumIndexDiff
-// )
-// $employee : Employee(contract == $contract)
-//
-// // The first day ...
-// $firstShiftDate : ShiftDate($firstDayIndex : dayIndex)
-// not Assignment(employee == $employee, shiftDate == $firstShiftDate)
-// // ... has no free day before it
-// (
-// exists Assignment(employee == $employee, shiftDateDayIndex == ($firstDayIndex - 1))
-// or not ShiftDate(dayIndex == ($firstDayIndex - 1))
-// )
-//
-// // The last day ...
-// $lastShiftDate : ShiftDate(
-// dayIndex > $firstDayIndex,
-// dayIndex < ($firstDayIndex + $minimumIndexDiff), // Too few days
-// $lastDayIndex : dayIndex)
-// not Assignment(employee == $employee, shiftDate == $lastShiftDate)
-// // ... has no free day after it
-// (
-// exists Assignment(employee == $employee, shiftDateDayIndex == ($lastDayIndex + 1))
-// or not ShiftDate(dayIndex == ($lastDayIndex + 1))
-// )
-//
-// // There are no working days between the first and last day
-// not Assignment(employee == $employee, shiftDateDayIndex > $firstDayIndex && < $lastDayIndex)
-// then
-// insertLogical(new IntConstraintOccurrence("minimumConsecutiveFreeDays", ConstraintType.NEGATIVE_SOFT,
-// ($firstDayIndex + $minimumIndexDiff - $lastDayIndex) * $contractLine.getMinimumWeight(),
-// $employee, $firstDayIndex, $lastDayIndex));
-//end
+rule "minimumConsecutiveFreeDays"
+ when
+ $contractLine : MinMaxContractLine(
+ contractLineType == ContractLineType.CONSECUTIVE_FREE_DAYS, minimumEnabled == true,
+ $contract : contract, $minimumValue : minimumValue
+ )
+ $employee : Employee(contract == $contract)
+ $employeeFreeDaySequence : EmployeeFreeDaySequence(
+ employee == $employee,
+ dayLength < $minimumValue,
+ $dayLength : dayLength
+ )
+ then
+ insertLogical(new IntConstraintOccurrence("minimumConsecutiveFreeDays", ConstraintType.NEGATIVE_SOFT,
+ ($minimumValue - $dayLength) * $contractLine.getMinimumWeight(),
+ $employeeFreeDaySequence));
+end
+
// Maximum number of consecutive free days
-// TODO
+rule "maximumConsecutiveFreeDays"
+ when
+ $contractLine : MinMaxContractLine(
+ contractLineType == ContractLineType.CONSECUTIVE_FREE_DAYS, maximumEnabled == true,
+ $contract : contract, $maximumValue : maximumValue
+ )
+ $employee : Employee(contract == $contract)
+ $employeeFreeDaySequence : EmployeeFreeDaySequence(
+ employee == $employee,
+ dayLength > $maximumValue,
+ $dayLength : dayLength
+ )
+ then
+ insertLogical(new IntConstraintOccurrence("maximumConsecutiveFreeDays", ConstraintType.NEGATIVE_SOFT,
+ ($dayLength - $maximumValue) * $contractLine.getMaximumWeight(),
+ $employeeFreeDaySequence));
+end
+
+
// Maximum number of consecutive working weekends
// TODO
More information about the jboss-svn-commits
mailing list