[jboss-svn-commits] JBL Code SVN: r33288 - 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
Tue Jun 1 14:03:59 EDT 2010


Author: ge0ffrey
Date: 2010-06-01 14:03:58 -0400 (Tue, 01 Jun 2010)
New Revision: 33288

Modified:
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/solution/initializer/NurseRosteringStartingSolutionInitializer.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl
Log:
with employee moving based initializer and weighted and fixed bug in scoreRules

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/solution/initializer/NurseRosteringStartingSolutionInitializer.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/solution/initializer/NurseRosteringStartingSolutionInitializer.java	2010-06-01 17:18:02 UTC (rev 33287)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/solution/initializer/NurseRosteringStartingSolutionInitializer.java	2010-06-01 18:03:58 UTC (rev 33288)
@@ -5,6 +5,7 @@
 import java.util.List;
 import java.util.Random;
 
+import org.apache.commons.lang.builder.CompareToBuilder;
 import org.drools.FactHandle;
 import org.drools.WorkingMemory;
 import org.drools.planner.core.localsearch.LocalSearchSolverScope;
@@ -16,6 +17,7 @@
 import org.drools.planner.examples.nurserostering.domain.Employee;
 import org.drools.planner.examples.nurserostering.domain.NurseRoster;
 import org.drools.planner.examples.nurserostering.domain.Shift;
+import org.drools.planner.examples.nurserostering.domain.ShiftDate;
 
 /**
  * @author Geoffrey De Smet
@@ -35,32 +37,32 @@
 
     private void initializeAssignmentList(LocalSearchSolverScope localSearchSolverScope,
             NurseRoster nurseRoster) {
-        List<Shift> shiftList = nurseRoster.getShiftList();
+        List<Employee> employeeList = nurseRoster.getEmployeeList();
         WorkingMemory workingMemory = localSearchSolverScope.getWorkingMemory();
 
         List<Assignment> assignmentList = createAssignmentList(nurseRoster);
         for (Assignment assignment : assignmentList) {
             FactHandle assignmentHandle = null;
             Score bestScore = DefaultHardAndSoftScore.valueOf(Integer.MIN_VALUE, Integer.MIN_VALUE);
-            Shift bestShift = null;
-            for (Shift shift : shiftList) {
+            Employee bestEmployee = null;
+            for (Employee employee : employeeList) {
                 if (assignmentHandle == null) {
-                    assignment.setShift(shift);
+                    assignment.setEmployee(employee);
                     assignmentHandle = workingMemory.insert(assignment);
                 } else {
-                    assignment.setShift(shift);
+                    assignment.setEmployee(employee);
                     workingMemory.update(assignmentHandle, assignment);
                 }
                 Score score = localSearchSolverScope.calculateScoreFromWorkingMemory();
                 if (score.compareTo(bestScore) > 0) {
                     bestScore = score;
-                    bestShift = shift;
+                    bestEmployee = employee;
                 }
             }
-            if (bestShift == null || bestShift == null) {
-                throw new IllegalStateException("The bestShift (" + bestShift + ") cannot be null.");
+            if (bestEmployee == null || bestEmployee == null) {
+                throw new IllegalStateException("The bestEmployee (" + bestEmployee + ") cannot be null.");
             }
-            assignment.setShift(bestShift);
+            assignment.setEmployee(bestEmployee);
             workingMemory.update(assignmentHandle, assignment);
             logger.debug("    Assignment ({}) initialized for starting solution.", assignment);
         }
@@ -70,105 +72,52 @@
     }
 
     public List<Assignment> createAssignmentList(NurseRoster nurseRoster) {
-        List<Employee> employeeList = nurseRoster.getEmployeeList();
-
-//        List<EmployeeInitializationWeight> employeeInitializationWeightList
-//                = new ArrayList<EmployeeInitializationWeight>(employeeList.size());
-//        for (Employee employee : employeeList) {
-//            employeeInitializationWeightList.add(new EmployeeInitializationWeight(nurseRoster, employee));
-//        }
-//        Collections.sort(employeeInitializationWeightList);
-//
-        List<Assignment> assignmentList = new ArrayList<Assignment>(employeeList.size() * 5);
-//        int employeeAssignmentId = 0;
-//        for (EmployeeInitializationWeight employeeInitializationWeight : employeeInitializationWeightList) {
-//            Employee employee = employeeInitializationWeight.getEmployee();
-//            for (int i = 0; i < employee.getEmployeeAssignmentSize(); i++) {
-//                Assignment employeeAssignment = new Assignment();
-//                employeeAssignment.setId((long) employeeAssignmentId);
-//                employeeAssignmentId++;
-//                employeeAssignment.setEmployee(employee);
-//                employeeAssignment.setEmployeeAssignmentIndexInEmployee(i);
-//                assignmentList.add(employeeAssignment);
-//            }
-//        }
-
-        // TODO tmp begin
         List<Shift> shiftList = nurseRoster.getShiftList();
-        int employeeAssignmentId = 0;
-        Random random = new Random(); // not seeded, tmp!
+        List<ShiftDate> shiftDateList = nurseRoster.getShiftDateList();
+
+        List<ShiftInitializationWeight> shiftInitializationWeightList
+                = new ArrayList<ShiftInitializationWeight>(shiftList.size());
         for (Shift shift : shiftList) {
+            shiftInitializationWeightList.add(new ShiftInitializationWeight(nurseRoster, shift));
+        }
+        Collections.sort(shiftInitializationWeightList);
+
+        List<Assignment> assignmentList = new ArrayList<Assignment>(
+                shiftDateList.size() * nurseRoster.getEmployeeList().size());
+        int assignmentId = 0;
+        for (ShiftInitializationWeight shiftInitializationWeight : shiftInitializationWeightList) {
+            Shift shift = shiftInitializationWeight.getShift();
             for (int i = 0; i < shift.getRequiredEmployeeSize(); i++) {
                 Assignment assignment = new Assignment();
-                assignment.setId((long) employeeAssignmentId);
-                employeeAssignmentId++;
+                assignment.setId((long) assignmentId);
                 assignment.setShift(shift);
-                int randomInt = random.nextInt(employeeList.size());
-                assignment.setEmployee(employeeList.get(randomInt));
                 assignmentList.add(assignment);
+                assignmentId++;
             }
         }
-        // TODO tmp end
-
         return assignmentList;
     }
 
-//    private class EmployeeInitializationWeight implements Comparable<EmployeeInitializationWeight> {
-//
-//        private Employee employee;
-//        private int unavailableShiftConstraintCount;
-//
-//        private EmployeeInitializationWeight(NurseRoster nurseRoster, Employee employee) {
-//            this.employee = employee;
-//            unavailableShiftConstraintCount = 0;
-//            // TODO this could be improved by iteration the unavailableShiftConstraintList and using a hashmap
-//            for (UnavailableShiftConstraint constraint : nurseRoster.getUnavailableShiftConstraintList()) {
-//                if (constraint.getEmployee().equals(employee)) {
-//                    unavailableShiftConstraintCount++;
-//                }
-//            }
-//        }
-//
-//        public Employee getEmployee() {
-//            return employee;
-//        }
-//
-//        public int compareTo(EmployeeInitializationWeight other) {
-//
-//            return new CompareToBuilder()
-//                    .append(other.employee.getCurriculumList().size(), employee.getCurriculumList().size()) // Descending
-//                    .append(other.unavailableShiftConstraintCount, unavailableShiftConstraintCount) // Descending
-//                    .append(other.employee.getEmployeeAssignmentSize(), employee.getEmployeeAssignmentSize()) // Descending
-//                    .append(other.employee.getStudentSize(), employee.getStudentSize()) // Descending
-//                    .append(other.employee.getMinWorkingDaySize(), employee.getMinWorkingDaySize()) // Descending
-//                    .append(employee.getId(), other.employee.getId()) // Ascending
-//                    .toComparison();
-//        }
-//
-//    }
-//
-//    private class ShiftScoring implements Comparable<ShiftScoring> {
-//
-//        private Shift shift;
-//        private Score score;
-//
-//        private ShiftScoring(Shift shift, Score score) {
-//            this.shift = shift;
-//            this.score = score;
-//        }
-//
-//        public Shift getShift() {
-//            return shift;
-//        }
-//
-//        public Score getScore() {
-//            return score;
-//        }
-//
-//        public int compareTo(ShiftScoring other) {
-//            return -new CompareToBuilder().append(score, other.score).toComparison();
-//        }
-//
-//    }
+    private class ShiftInitializationWeight implements Comparable<ShiftInitializationWeight> {
 
+        private Shift shift;
+
+        private ShiftInitializationWeight(NurseRoster nurseRoster, Shift shift) {
+            this.shift = shift;
+        }
+
+        public Shift getShift() {
+            return shift;
+        }
+
+        public int compareTo(ShiftInitializationWeight other) {
+            return new CompareToBuilder()
+                    .append(other.shift.getRequiredEmployeeSize(), shift.getRequiredEmployeeSize()) // Descending
+                    .append(shift.getShiftDate(), other.shift.getShiftDate()) // Ascending
+                    .append(shift.getShiftType(), other.shift.getShiftType()) // Ascending
+                    .toComparison();
+        }
+
+    }
+
 }

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-06-01 17:18:02 UTC (rev 33287)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl	2010-06-01 18:03:58 UTC (rev 33288)
@@ -271,6 +271,18 @@
     then
         insertLogical(new EmployeeFreeSequence($employee, $firstDayIndexMinusOne + 1, $lastDayIndex));
 end
+rule "insertEntireEmployeeFreeSequence"
+        salience 1 // Do these rules first (optional, for performance)
+    when
+        $employee : Employee()
+        // There are no working days after the last day
+        not EmployeeConsecutiveAssignmentStart(
+            employee == $employee
+        )
+        RosterInfo($firstDayIndex : firstShiftDateDayIndex, $lastDayIndex : lastShiftDateDayIndex)
+    then
+        insertLogical(new EmployeeFreeSequence($employee, $firstDayIndex, $lastDayIndex));
+end
 
 // Minimum number of consecutive free days
 rule "minimumConsecutiveFreeDays"



More information about the jboss-svn-commits mailing list