[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