[jboss-svn-commits] JBL Code SVN: r32870 - in labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main: java/org/drools/planner/examples/nurserostering/domain/contract and 3 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu May 13 09:47:52 EDT 2010


Author: ge0ffrey
Date: 2010-05-13 09:47:50 -0400 (Thu, 13 May 2010)
New Revision: 32870

Added:
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/
   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/EmployeeConsecutiveAssignmentEnd.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignmentStart.java
Modified:
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/EmployeeAssignment.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/MinMaxContractLine.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringStepLimitSolverBenchmarkConfig.xml
   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/nurseRosteringSolverConfig.xml
Log:
nurse rostering: EmployeeConsecutiveAssignment (20 times faster but has undoMove issue)

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/EmployeeAssignment.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/EmployeeAssignment.java	2010-05-13 13:19:17 UTC (rev 32869)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/EmployeeAssignment.java	2010-05-13 13:47:50 UTC (rev 32870)
@@ -92,19 +92,19 @@
     }
 
     public ShiftDate getShiftDate() {
-        return getShift().getShiftDate();
+        return shift.getShiftDate();
     }
 
     public ShiftType getShiftType() {
-        return getShift().getShiftType();
+        return shift.getShiftType();
     }
 
     public int getShiftDateDayIndex() {
-        return getShift().getShiftDate().getDayIndex();
+        return shift.getShiftDate().getDayIndex();
     }
 
     public Contract getContract() {
-        return getEmployee().getContract();
+        return employee.getContract();
     }
 
 }

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/MinMaxContractLine.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/MinMaxContractLine.java	2010-05-13 13:19:17 UTC (rev 32869)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/contract/MinMaxContractLine.java	2010-05-13 13:47:50 UTC (rev 32870)
@@ -32,10 +32,6 @@
         this.minimumValue = minimumValue;
     }
 
-    public int getMinimumIndexDiff() {
-        return minimumValue - 1;
-    }
-
     public int getMinimumWeight() {
         return minimumWeight;
     }
@@ -60,10 +56,6 @@
         this.maximumValue = maximumValue;
     }
 
-    public int getMaximumIndexDiff() {
-        return maximumValue - 1;
-    }
-
     public int getMaximumWeight() {
         return maximumWeight;
     }

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignment.java	2010-05-13 13:47:50 UTC (rev 32870)
@@ -0,0 +1,84 @@
+package org.drools.planner.examples.nurserostering.domain.solver;
+
+import java.io.Serializable;
+
+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 EmployeeConsecutiveAssignment implements Serializable {
+
+    private Employee employee;
+    private ShiftDate firstShiftDate;
+    private ShiftDate lastShiftDate;
+
+    public EmployeeConsecutiveAssignment(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 EmployeeConsecutiveAssignment) {
+            EmployeeConsecutiveAssignment other = (EmployeeConsecutiveAssignment) 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 getFirstShiftDateDayIndex() {
+        return firstShiftDate.getDayIndex();
+    }
+
+    public int getLastShiftDateDayIndex() {
+        return lastShiftDate.getDayIndex();
+    }
+
+    public int getDayLength() {
+        return lastShiftDate.getDayIndex() - firstShiftDate.getDayIndex() + 1;
+    }
+
+}

Added: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignmentEnd.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignmentEnd.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignmentEnd.java	2010-05-13 13:47:50 UTC (rev 32870)
@@ -0,0 +1,64 @@
+package org.drools.planner.examples.nurserostering.domain.solver;
+
+import java.io.Serializable;
+
+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 EmployeeConsecutiveAssignmentEnd implements Serializable {
+
+    private Employee employee;
+    private ShiftDate shiftDate;
+
+    public EmployeeConsecutiveAssignmentEnd(Employee employee, ShiftDate shiftDate) {
+        this.employee = employee;
+        this.shiftDate = shiftDate;
+    }
+
+    public Employee getEmployee() {
+        return employee;
+    }
+
+    public void setEmployee(Employee employee) {
+        this.employee = employee;
+    }
+
+    public ShiftDate getShiftDate() {
+        return shiftDate;
+    }
+
+    public void setShiftDate(ShiftDate shiftDate) {
+        this.shiftDate = shiftDate;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        } else if (o instanceof EmployeeConsecutiveAssignmentEnd) {
+            EmployeeConsecutiveAssignmentEnd other = (EmployeeConsecutiveAssignmentEnd) o;
+            return new EqualsBuilder()
+                    .append(employee, other.employee)
+                    .append(shiftDate, other.shiftDate)
+                    .isEquals();
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+                .append(employee)
+                .append(shiftDate)
+                .toHashCode();
+    }
+
+    public int getShiftDateDayIndex() {
+        return shiftDate.getDayIndex();
+    }
+
+}

Copied: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignmentStart.java (from rev 32746, labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/travelingtournament/domain/solver/Hop.java)
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignmentStart.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/solver/EmployeeConsecutiveAssignmentStart.java	2010-05-13 13:47:50 UTC (rev 32870)
@@ -0,0 +1,64 @@
+package org.drools.planner.examples.nurserostering.domain.solver;
+
+import java.io.Serializable;
+
+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 EmployeeConsecutiveAssignmentStart implements Serializable {
+
+    private Employee employee;
+    private ShiftDate shiftDate;
+
+    public EmployeeConsecutiveAssignmentStart(Employee employee, ShiftDate shiftDate) {
+        this.employee = employee;
+        this.shiftDate = shiftDate;
+    }
+
+    public Employee getEmployee() {
+        return employee;
+    }
+
+    public void setEmployee(Employee employee) {
+        this.employee = employee;
+    }
+
+    public ShiftDate getShiftDate() {
+        return shiftDate;
+    }
+
+    public void setShiftDate(ShiftDate shiftDate) {
+        this.shiftDate = shiftDate;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        } else if (o instanceof EmployeeConsecutiveAssignmentStart) {
+            EmployeeConsecutiveAssignmentStart other = (EmployeeConsecutiveAssignmentStart) o;
+            return new EqualsBuilder()
+                    .append(employee, other.employee)
+                    .append(shiftDate, other.shiftDate)
+                    .isEquals();
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+                .append(employee)
+                .append(shiftDate)
+                .toHashCode();
+    }
+
+    public int getShiftDateDayIndex() {
+        return shiftDate.getDayIndex();
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringStepLimitSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringStepLimitSolverBenchmarkConfig.xml	2010-05-13 13:19:17 UTC (rev 32869)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringStepLimitSolverBenchmarkConfig.xml	2010-05-13 13:47:50 UTC (rev 32870)
@@ -7,6 +7,7 @@
     <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium01_initialized.xml</inheritedUnsolvedSolutionFile>
 
     <inheritedLocalSearchSolver>
+        <environmentMode>DEBUG</environmentMode>
         <scoreDrl>/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl</scoreDrl>
         <scoreDefinition>
             <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>

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-13 13:19:17 UTC (rev 32869)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl	2010-05-13 13:47:50 UTC (rev 32870)
@@ -25,6 +25,9 @@
 import org.drools.planner.examples.nurserostering.domain.request.DayOnRequest;
 import org.drools.planner.examples.nurserostering.domain.request.ShiftOffRequest;
 import org.drools.planner.examples.nurserostering.domain.request.ShiftOnRequest;
+import org.drools.planner.examples.nurserostering.domain.solver.EmployeeConsecutiveAssignment;
+import org.drools.planner.examples.nurserostering.domain.solver.EmployeeConsecutiveAssignmentEnd;
+import org.drools.planner.examples.nurserostering.domain.solver.EmployeeConsecutiveAssignmentStart;
 
 // @author Geoffrey De Smet
 
@@ -81,7 +84,76 @@
 // Minimum number of assignments
 // TODO
 
-// Maximum number of consecutive working days // TODO too slow!
+rule "insertEmployeeConsecutiveAssignmentStart"
+        salience 2 // Do these rules first (optional, for performance)
+    when
+        EmployeeAssignment(
+            $employee : employee,
+            $dayIndex : shiftDateDayIndex,
+            $shiftDate : shiftDate
+        );
+        // The first day has no working day before it
+        not EmployeeAssignment(employee == $employee, shiftDateDayIndex == ($dayIndex - 1));
+    then
+        insertLogical(new EmployeeConsecutiveAssignmentStart($employee, $shiftDate));
+end
+rule "insertEmployeeConsecutiveAssignmentEnd"
+        salience 2 // Do these rules first (optional, for performance)
+    when
+        EmployeeAssignment(
+            $employee : employee,
+            $dayIndex : shiftDateDayIndex,
+            $shiftDate : shiftDate
+        );
+        // The last day has no working day after it
+        not EmployeeAssignment(employee == $employee, shiftDateDayIndex == ($dayIndex + 1));
+    then
+        insertLogical(new EmployeeConsecutiveAssignmentEnd($employee, $shiftDate));
+end
+rule "insertEmployeeConsecutiveAssignment"
+        salience 1 // Do these rules first (optional, for performance)
+    when
+        EmployeeConsecutiveAssignmentStart(
+            $employee : employee,
+            $firstShiftDate : shiftDate,
+            $firstDayIndex : shiftDateDayIndex
+        );
+
+        EmployeeConsecutiveAssignmentEnd(
+            employee == $employee,
+            shiftDateDayIndex >= $firstDayIndex,
+            $lastShiftDate : shiftDate,
+            $lastDayIndex : shiftDateDayIndex
+        );
+
+        // There are no free days between the first and last day
+        not EmployeeConsecutiveAssignmentEnd(
+            employee == $employee,
+            shiftDateDayIndex >= $firstDayIndex && < $lastDayIndex
+        );
+    then
+        insertLogical(new EmployeeConsecutiveAssignment($employee, $firstShiftDate, $lastShiftDate));
+end
+
+// Maximum number of consecutive working days
+rule "maximumConsecutiveWorkingDays"
+    when
+        $contractLine : MinMaxContractLine(
+            contractLineType == ContractLineType.CONSECUTIVE_WORKING_DAYS, maximumEnabled == true,
+            $contract : contract, $maximumValue : maximumValue
+        );
+        $employee : Employee(contract == $contract);
+
+        $employeeConsecutiveAssignment : EmployeeConsecutiveAssignment(
+            employee == $employee,
+            dayLength > $maximumValue,
+            $dayLength : dayLength
+        );
+    then
+        insertLogical(new IntConstraintOccurrence("maximumConsecutiveWorkingDays", ConstraintType.NEGATIVE_SOFT,
+                ($dayLength - $maximumValue) * $contractLine.getMaximumWeight(),
+                $employeeConsecutiveAssignment));
+end
 //rule "maximumConsecutiveWorkingDays"
 //    when
 //        $contractLine : MinMaxContractLine(

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml	2010-05-13 13:19:17 UTC (rev 32869)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml	2010-05-13 13:47:50 UTC (rev 32870)
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <localSearchSolver>
+    <environmentMode>DEBUG</environmentMode>
     <scoreDrl>/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl</scoreDrl>
     <scoreDefinition>
         <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>



More information about the jboss-svn-commits mailing list