[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