[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