[jboss-svn-commits] JBL Code SVN: r33370 - in labs/jbossrules/trunk/drools-planner/drools-planner-examples/src: main/java/org/drools/planner/examples/nurserostering/persistence and 4 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Jun 6 15:21:39 EDT 2010


Author: ge0ffrey
Date: 2010-06-06 15:21:38 -0400 (Sun, 06 Jun 2010)
New Revision: 33370

Added:
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/move/factory/AssignmentSequenceSwitchMoveFactory.java
Modified:
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/NurseRoster.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/persistence/NurseRosteringSolutionExporter.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/move/factory/AssignmentSwitchMoveFactory.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/move/factory/EmployeeChangeMoveFactory.java
   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/swingui/NurseRosteringPanel.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/test/java/org/drools/planner/examples/nurserostering/solver/NurseRosteringScoreRulesTest.java
Log:
AssignmentSequenceSwitchMoveFactory

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/NurseRoster.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/NurseRoster.java	2010-06-06 16:50:08 UTC (rev 33369)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/NurseRoster.java	2010-06-06 19:21:38 UTC (rev 33370)
@@ -175,11 +175,11 @@
         this.shiftOnRequestList = shiftOnRequestList;
     }
 
-    public List<Assignment> getEmployeeAssignmentList() {
+    public List<Assignment> getAssignmentList() {
         return assignmentList;
     }
 
-    public void setEmployeeAssignmentList(List<Assignment> assignmentList) {
+    public void setAssignmentList(List<Assignment> assignmentList) {
         this.assignmentList = assignmentList;
     }
 

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/persistence/NurseRosteringSolutionExporter.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/persistence/NurseRosteringSolutionExporter.java	2010-06-06 16:50:08 UTC (rev 33369)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/persistence/NurseRosteringSolutionExporter.java	2010-06-06 19:21:38 UTC (rev 33370)
@@ -50,7 +50,7 @@
             softConstraintsPenaltyElement.setText(Integer.toString(nurseRoster.getScore().getSoftScore()));
             solutionElement.addContent(softConstraintsPenaltyElement);
 
-            for (Assignment assignment : nurseRoster.getEmployeeAssignmentList()) {
+            for (Assignment assignment : nurseRoster.getAssignmentList()) {
                 Shift shift = assignment.getShift();
                 if (shift != null) {
                     Element assignmentElement = new Element("Assignment");

Added: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/move/factory/AssignmentSequenceSwitchMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/move/factory/AssignmentSequenceSwitchMoveFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/move/factory/AssignmentSequenceSwitchMoveFactory.java	2010-06-06 19:21:38 UTC (rev 33370)
@@ -0,0 +1,137 @@
+package org.drools.planner.examples.nurserostering.solver.move.factory;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.NoSuchElementException;
+
+import org.apache.commons.lang.builder.CompareToBuilder;
+import org.drools.planner.core.move.CompositeMove;
+import org.drools.planner.core.move.Move;
+import org.drools.planner.core.move.factory.AbstractMoveFactory;
+import org.drools.planner.core.solution.Solution;
+import org.drools.planner.examples.nurserostering.domain.Assignment;
+import org.drools.planner.examples.nurserostering.domain.Employee;
+import org.drools.planner.examples.nurserostering.domain.NurseRoster;
+import org.drools.planner.examples.nurserostering.domain.ShiftDate;
+import org.drools.planner.examples.nurserostering.domain.solver.EmployeeWorkSequence;
+import org.drools.planner.examples.nurserostering.solver.move.EmployeeChangeMove;
+import org.drools.planner.examples.pas.domain.Bed;
+import org.drools.planner.examples.pas.domain.BedDesignation;
+import org.drools.planner.examples.pas.solver.move.BedChangeMove;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class AssignmentSequenceSwitchMoveFactory extends AbstractMoveFactory {
+
+    public List<Move> createMoveList(Solution solution) {
+        NurseRoster nurseRoster = (NurseRoster) solution;
+        List<Employee> employeeList = nurseRoster.getEmployeeList();
+        // This code assumes the assignmentList is sorted
+        List<Assignment> assignmentList = nurseRoster.getAssignmentList();
+
+        // Hash the assignments per employee
+        Map<Employee, List<AssignmentSequence>> employeeToAssignmentSequenceListMap
+                = new HashMap<Employee, List<AssignmentSequence>>(employeeList.size());
+        int assignmentSequenceCapacity = nurseRoster.getShiftDateList().size() + 1 / 2;
+        for (Employee employee : employeeList) {
+            employeeToAssignmentSequenceListMap.put(employee,
+                    new ArrayList<AssignmentSequence>(assignmentSequenceCapacity));
+        }
+        for (Assignment assignment : assignmentList) {
+            Employee employee = assignment.getEmployee();
+            List<AssignmentSequence> assignmentSequenceList = employeeToAssignmentSequenceListMap.get(employee);
+            if (assignmentSequenceList.isEmpty()) {
+                AssignmentSequence assignmentSequence = new AssignmentSequence(assignment);
+                assignmentSequenceList.add(assignmentSequence);
+            } else {
+                AssignmentSequence lastAssignmentSequence = assignmentSequenceList // getLast()
+                        .get(assignmentSequenceList.size() - 1);
+                if (lastAssignmentSequence.belongsHere(assignment)) {
+                    lastAssignmentSequence.add(assignment);
+                } else {
+                    AssignmentSequence assignmentSequence = new AssignmentSequence(assignment);
+                    assignmentSequenceList.add(assignmentSequence);
+                }
+            }
+        }
+
+        // The create the move list
+        List<Move> moveList = new ArrayList<Move>();
+        // For every 2 distinct employees
+        for (ListIterator<Employee> leftEmployeeIt = employeeList.listIterator(); leftEmployeeIt.hasNext();) {
+            Employee leftEmployee = leftEmployeeIt.next();
+            List<AssignmentSequence> leftAssignmentSequenceList
+                    = employeeToAssignmentSequenceListMap.get(leftEmployee);
+            for (ListIterator<Employee> rightEmployeeIt = employeeList.listIterator(leftEmployeeIt.nextIndex());
+                    rightEmployeeIt.hasNext();) {
+                Employee rightEmployee = rightEmployeeIt.next();
+                List<AssignmentSequence> rightAssignmentSequenceList
+                        = employeeToAssignmentSequenceListMap.get(rightEmployee);
+
+                for (AssignmentSequence leftAssignmentSequence : leftAssignmentSequenceList) {
+                    List<Assignment> leftAssignmentList = leftAssignmentSequence.getAssignmentList();
+                    for (AssignmentSequence rightAssignmentSequence : rightAssignmentSequenceList) {
+                        List<Assignment> rightAssignmentList = rightAssignmentSequence.getAssignmentList();
+                        // Only if not covered by AssignmentSwitchMoveFactory
+                        if (leftAssignmentList.size() > 1 || rightAssignmentList.size() > 1) {
+                            int pillarSize = 2; // TODO
+                            List<Move> subMoveList = new ArrayList<Move>(pillarSize * 2);
+                            for (Assignment leftAssignment : leftAssignmentList
+                                    .subList(0, Math.min(pillarSize, leftAssignmentList.size()))) {
+                                subMoveList.add(new EmployeeChangeMove(leftAssignment, rightEmployee));
+                            }
+                            for (Assignment rightAssignment : rightAssignmentList
+                                    .subList(0, Math.min(pillarSize, rightAssignmentList.size()))) {
+                                subMoveList.add(new EmployeeChangeMove(rightAssignment, leftEmployee));
+                            }
+                            moveList.add(new CompositeMove(subMoveList));
+                        }
+                    }
+                }
+            }
+        }
+        return moveList;
+    }
+
+    /**
+     * TODO DRY with {@link EmployeeWorkSequence}
+     */
+    private static class AssignmentSequence {
+
+        private List<Assignment> assignmentList;
+        private int firstDayIndex;
+        private int lastDayIndex;
+
+        private AssignmentSequence(Assignment assignment) {
+            assignmentList = new ArrayList<Assignment>();
+            firstDayIndex = assignment.getShiftDateDayIndex();
+            lastDayIndex = firstDayIndex;
+        }
+
+        public List<Assignment> getAssignmentList() {
+            return assignmentList;
+        }
+
+        private void add(Assignment assignment) {
+            assignmentList.add(assignment);
+            int dayIndex = assignment.getShiftDateDayIndex();
+            if (dayIndex < lastDayIndex) {
+                throw new IllegalStateException("The assignmentList is expected to be sorted by shiftDate.");
+            }
+            lastDayIndex = dayIndex;
+        }
+
+        private boolean belongsHere(Assignment assignment) {
+            return assignment.getShiftDateDayIndex() <= (lastDayIndex + 1);
+        }
+
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/move/factory/AssignmentSwitchMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/move/factory/AssignmentSwitchMoveFactory.java	2010-06-06 16:50:08 UTC (rev 33369)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/move/factory/AssignmentSwitchMoveFactory.java	2010-06-06 19:21:38 UTC (rev 33370)
@@ -18,7 +18,7 @@
 
     public List<Move> createCachedMoveList(Solution solution) {
         NurseRoster nurseRoster = (NurseRoster) solution;
-        List<Assignment> assignmentList = nurseRoster.getEmployeeAssignmentList();
+        List<Assignment> assignmentList = nurseRoster.getAssignmentList();
         List<Move> moveList = new ArrayList<Move>();
         for (ListIterator<Assignment> leftIt = assignmentList.listIterator(); leftIt.hasNext();) {
             Assignment leftAssignment = leftIt.next();

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/move/factory/EmployeeChangeMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/move/factory/EmployeeChangeMoveFactory.java	2010-06-06 16:50:08 UTC (rev 33369)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/move/factory/EmployeeChangeMoveFactory.java	2010-06-06 19:21:38 UTC (rev 33370)
@@ -20,7 +20,7 @@
         NurseRoster nurseRoster = (NurseRoster) solution;
         List<Move> moveList = new ArrayList<Move>();
         List<Employee> employeeList = nurseRoster.getEmployeeList();
-        for (Assignment assignment : nurseRoster.getEmployeeAssignmentList()) {
+        for (Assignment assignment : nurseRoster.getAssignmentList()) {
             for (Employee employee : employeeList) {
                 moveList.add(new EmployeeChangeMove(assignment, employee));
             }

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-06 16:50:08 UTC (rev 33369)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/solution/initializer/NurseRosteringStartingSolutionInitializer.java	2010-06-06 19:21:38 UTC (rev 33370)
@@ -3,7 +3,6 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.Random;
 
 import org.apache.commons.lang.builder.CompareToBuilder;
 import org.drools.FactHandle;
@@ -68,7 +67,7 @@
         }
 
         Collections.sort(assignmentList, new PersistableIdComparator());
-        nurseRoster.setEmployeeAssignmentList(assignmentList);
+        nurseRoster.setAssignmentList(assignmentList);
     }
 
     public List<Assignment> createAssignmentList(NurseRoster nurseRoster) {
@@ -95,6 +94,7 @@
                 assignmentId++;
             }
         }
+        Collections.sort(assignmentList);
         return assignmentList;
     }
 

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/swingui/NurseRosteringPanel.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/swingui/NurseRosteringPanel.java	2010-06-06 16:50:08 UTC (rev 33369)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/swingui/NurseRosteringPanel.java	2010-06-06 19:21:38 UTC (rev 33370)
@@ -17,7 +17,6 @@
 
 import org.drools.planner.examples.common.swingui.SolutionPanel;
 import org.drools.planner.examples.nurserostering.domain.Assignment;
-import org.drools.planner.examples.nurserostering.domain.DayOfWeek;
 import org.drools.planner.examples.nurserostering.domain.ShiftDate;
 import org.drools.planner.examples.nurserostering.domain.NurseRoster;
 import org.drools.planner.examples.nurserostering.domain.Employee;
@@ -85,10 +84,10 @@
             }
         }
         if (schedule.isInitialized()) {
-            for (Assignment assignment : schedule.getEmployeeAssignmentList()) {
+            for (Assignment assignment : schedule.getAssignmentList()) {
                 Employee employee = assignment.getEmployee();
                 EmployeeShiftDatePanel employeeShiftDatePanel = employeeShiftDatePanelMap.get(employee).get(assignment.getShiftDate());
-                employeeShiftDatePanel.addEmployeeAssignment(assignment);
+                employeeShiftDatePanel.addAssignment(assignment);
             }
         }
     }
@@ -102,18 +101,18 @@
                     BorderFactory.createEmptyBorder(2, 2, 2, 2)));
         }
 
-        public void addEmployeeAssignment(Assignment assignment) {
-            JButton button = new JButton(new EmployeeAssignmentAction(assignment));
+        public void addAssignment(Assignment assignment) {
+            JButton button = new JButton(new AssignmentAction(assignment));
             add(button);
         }
 
     }
 
-    private class EmployeeAssignmentAction extends AbstractAction {
+    private class AssignmentAction extends AbstractAction {
 
         private Assignment assignment;
 
-        public EmployeeAssignmentAction(Assignment assignment) {
+        public AssignmentAction(Assignment assignment) {
             super(assignment.getLabel());
             this.assignment = assignment;
         }

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/test/java/org/drools/planner/examples/nurserostering/solver/NurseRosteringScoreRulesTest.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/test/java/org/drools/planner/examples/nurserostering/solver/NurseRosteringScoreRulesTest.java	2010-06-06 16:50:08 UTC (rev 33369)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/test/java/org/drools/planner/examples/nurserostering/solver/NurseRosteringScoreRulesTest.java	2010-06-06 19:21:38 UTC (rev 33370)
@@ -38,10 +38,10 @@
         Score firstScore = localSearchSolverScope.calculateScoreFromWorkingMemory();
         // do AssignmentSwitchMove
         Employee leftEmployee = findEmployeeById(nurseRoster, 0L);
-        Assignment leftAssignment = findEmployeeAssignmentById(nurseRoster, 200204001L);
+        Assignment leftAssignment = findAssignmentById(nurseRoster, 200204001L);
         assertEquals(leftEmployee, leftAssignment.getEmployee());
         Employee rightEmployee = findEmployeeById(nurseRoster, 12L);
-        Assignment rightAssignment = findEmployeeAssignmentById(nurseRoster, 200204002L);
+        Assignment rightAssignment = findAssignmentById(nurseRoster, 200204002L);
         assertEquals(rightEmployee, rightAssignment.getEmployee());
         NurseRosterMoveHelper.moveEmployee(workingMemory, leftAssignment, rightEmployee);
         NurseRosterMoveHelper.moveEmployee(workingMemory, rightAssignment, leftEmployee);
@@ -84,8 +84,8 @@
         throw new IllegalArgumentException("Invalid id (" + id + ")");
     }
 
-    private Assignment findEmployeeAssignmentById(NurseRoster nurseRoster, long id) {
-        for (Assignment assignment : nurseRoster.getEmployeeAssignmentList()) {
+    private Assignment findAssignmentById(NurseRoster nurseRoster, long id) {
+        for (Assignment assignment : nurseRoster.getAssignmentList()) {
             if (assignment.getId() == id) {
                 return assignment;
             }



More information about the jboss-svn-commits mailing list