[jboss-svn-commits] JBL Code SVN: r32267 - in labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main: java/org/drools/planner/examples/nurserostering/solver/solution/initializer and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sun Mar 28 15:17:36 EDT 2010
Author: ge0ffrey
Date: 2010-03-28 15:17:36 -0400 (Sun, 28 Mar 2010)
New Revision: 32267
Added:
labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/app/NurseRosteringApp.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/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: GUI, dummy initializer, first score rule
Copied: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/app/NurseRosteringApp.java (from rev 32249, labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/curriculumcourse/app/CurriculumCourseApp.java)
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/app/NurseRosteringApp.java (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/app/NurseRosteringApp.java 2010-03-28 19:17:36 UTC (rev 32267)
@@ -0,0 +1,40 @@
+package org.drools.planner.examples.nurserostering.app;
+
+import org.drools.planner.config.XmlSolverConfigurer;
+import org.drools.planner.core.Solver;
+import org.drools.planner.examples.common.app.CommonApp;
+import org.drools.planner.examples.common.persistence.SolutionDao;
+import org.drools.planner.examples.common.swingui.SolutionPanel;
+import org.drools.planner.examples.nurserostering.persistence.NurseRosteringDaoImpl;
+import org.drools.planner.examples.nurserostering.swingui.NurseRosteringPanel;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class NurseRosteringApp extends CommonApp {
+
+ public static final String SOLVER_CONFIG
+ = "/org/drools/planner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml";
+
+ public static void main(String[] args) {
+ new NurseRosteringApp().init();
+ }
+
+ @Override
+ protected SolutionDao createSolutionDao() {
+ return new NurseRosteringDaoImpl();
+ }
+
+ @Override
+ protected Solver createSolver() {
+ XmlSolverConfigurer configurer = new XmlSolverConfigurer();
+ configurer.configure(SOLVER_CONFIG);
+ return configurer.buildSolver();
+ }
+
+ @Override
+ protected SolutionPanel createSolutionPanel() {
+ return new NurseRosteringPanel();
+ }
+
+}
Copied: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/solution/initializer/NurseRosteringStartingSolutionInitializer.java (from rev 32249, labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/curriculumcourse/solver/solution/initializer/CurriculumCourseStartingSolutionInitializer.java)
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/solution/initializer/NurseRosteringStartingSolutionInitializer.java (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/solver/solution/initializer/NurseRosteringStartingSolutionInitializer.java 2010-03-28 19:17:36 UTC (rev 32267)
@@ -0,0 +1,211 @@
+package org.drools.planner.examples.nurserostering.solver.solution.initializer;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.commons.lang.builder.CompareToBuilder;
+import org.drools.WorkingMemory;
+import org.drools.planner.core.localsearch.LocalSearchSolverScope;
+import org.drools.planner.core.score.DefaultHardAndSoftScore;
+import org.drools.planner.core.score.Score;
+import org.drools.planner.core.solution.initializer.AbstractStartingSolutionInitializer;
+import org.drools.planner.examples.common.domain.PersistableIdComparator;
+import org.drools.planner.examples.nurserostering.domain.Employee;
+import org.drools.planner.examples.nurserostering.domain.EmployeeAssignment;
+import org.drools.planner.examples.nurserostering.domain.NurseRoster;
+import org.drools.planner.examples.nurserostering.domain.Shift;
+import org.drools.planner.examples.nurserostering.domain.ShiftDate;
+import org.drools.runtime.rule.FactHandle;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class NurseRosteringStartingSolutionInitializer extends AbstractStartingSolutionInitializer {
+
+ @Override
+ public boolean isSolutionInitialized(LocalSearchSolverScope localSearchSolverScope) {
+ NurseRoster schedule = (NurseRoster) localSearchSolverScope.getWorkingSolution();
+ return schedule.isInitialized();
+ }
+
+ public void initializeSolution(LocalSearchSolverScope localSearchSolverScope) {
+ NurseRoster schedule = (NurseRoster) localSearchSolverScope.getWorkingSolution();
+ initializeEmployeeAssignmentList(localSearchSolverScope, schedule);
+ }
+
+ private void initializeEmployeeAssignmentList(LocalSearchSolverScope localSearchSolverScope,
+ NurseRoster nurseRoster) {
+ List<Shift> shiftList = nurseRoster.getShiftList();
+ WorkingMemory workingMemory = localSearchSolverScope.getWorkingMemory();
+
+ List<EmployeeAssignment> employeeAssignmentList = createEmployeeAssignmentList(nurseRoster);
+ // TODO implement this class
+// for (EmployeeAssignment employeeAssignment : employeeAssignmentList) {
+// Score unnurseRosterdScore = localSearchSolverScope.calculateScoreFromWorkingMemory();
+// FactHandle employeeAssignmentHandle = null;
+//
+// List<ShiftScoring> shiftScoringList = new ArrayList<ShiftScoring>(shiftList.size());
+// for (Shift shift : shiftList) {
+// if (employeeAssignmentHandle == null) {
+// employeeAssignment.setShift(shift);
+// employeeAssignmentHandle = workingMemory.insert(employeeAssignment);
+// } else {
+// employeeAssignment.setShift(shift);
+// workingMemory.update(employeeAssignmentHandle, employeeAssignment);
+// }
+// Score score = localSearchSolverScope.calculateScoreFromWorkingMemory();
+// shiftScoringList.add(new ShiftScoring(shift, score));
+// }
+// Collections.sort(shiftScoringList);
+//
+// boolean almostPerfectMatch = false;
+// Score bestScore = DefaultHardAndSoftScore.valueOf(Integer.MIN_VALUE, Integer.MIN_VALUE);
+// Shift bestShift = null;
+// Room bestRoom = null;
+// for (ShiftScoring shiftScoring : shiftScoringList) {
+// if (bestScore.compareTo(shiftScoring.getScore()) >= 0) {
+// // No need to check the rest
+// break;
+// }
+// employeeAssignment.setShift(shiftScoring.getShift());
+// workingMemory.update(employeeAssignmentHandle, employeeAssignment);
+//
+// for (Room room : roomList) {
+// employeeAssignment.setRoom(room);
+// workingMemory.update(employeeAssignmentHandle, employeeAssignment);
+// Score score = localSearchSolverScope.calculateScoreFromWorkingMemory();
+// if (score.compareTo(unnurseRosterdScore) < 0) {
+// if (score.compareTo(bestScore) > 0) {
+// bestScore = score;
+// bestShift = shiftScoring.getShift();
+// bestRoom = room;
+// }
+// } else if (score.compareTo(unnurseRosterdScore) >= 0) {
+// // TODO due to the score rules, the score can unnurseRosterdScore can be higher than the score
+// // In theory every possibility should be looked into
+// almostPerfectMatch = true;
+// break;
+// }
+// }
+// if (almostPerfectMatch) {
+// break;
+// }
+// }
+// if (!almostPerfectMatch) {
+// if (bestShift == null || bestRoom == null) {
+// throw new IllegalStateException("The bestShift (" + bestShift + ") or the bestRoom ("
+// + bestRoom + ") cannot be null.");
+// }
+// employeeAssignment.setShift(bestShift);
+// employeeAssignment.setRoom(bestRoom);
+// workingMemory.update(employeeAssignmentHandle, employeeAssignment);
+// }
+// logger.debug(" EmployeeAssignment ({}) initialized for starting solution.", employeeAssignment);
+// }
+
+ Collections.sort(employeeAssignmentList, new PersistableIdComparator());
+ nurseRoster.setEmployeeAssignmentList(employeeAssignmentList);
+ }
+
+ public List<EmployeeAssignment> createEmployeeAssignmentList(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<EmployeeAssignment> employeeAssignmentList = new ArrayList<EmployeeAssignment>(employeeList.size() * 5);
+// int employeeAssignmentId = 0;
+// for (EmployeeInitializationWeight employeeInitializationWeight : employeeInitializationWeightList) {
+// Employee employee = employeeInitializationWeight.getEmployee();
+// for (int i = 0; i < employee.getEmployeeAssignmentSize(); i++) {
+// EmployeeAssignment employeeAssignment = new EmployeeAssignment();
+// employeeAssignment.setId((long) employeeAssignmentId);
+// employeeAssignmentId++;
+// employeeAssignment.setEmployee(employee);
+// employeeAssignment.setEmployeeAssignmentIndexInEmployee(i);
+// employeeAssignmentList.add(employeeAssignment);
+// }
+// }
+
+ // TODO tmp begin
+ List<ShiftDate> shiftDateList = nurseRoster.getShiftDateList();
+ int employeeAssignmentId = 0;
+ for (Employee employee : employeeList) {
+ for (ShiftDate shiftDate : shiftDateList) {
+ EmployeeAssignment employeeAssignment = new EmployeeAssignment();
+ employeeAssignment.setId((long) employeeAssignmentId);
+ employeeAssignmentId++;
+ employeeAssignment.setEmployee(employee);
+ employeeAssignment.setShiftDate(shiftDate);
+ employeeAssignmentList.add(employeeAssignment);
+ }
+ }
+ // TODO tmp end
+
+ return employeeAssignmentList;
+ }
+
+// 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();
+// }
+//
+// }
+
+}
Copied: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/swingui/NurseRosteringPanel.java (from rev 32249, labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/curriculumcourse/swingui/CurriculumCoursePanel.java)
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/swingui/NurseRosteringPanel.java (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/swingui/NurseRosteringPanel.java 2010-03-28 19:17:36 UTC (rev 32267)
@@ -0,0 +1,132 @@
+package org.drools.planner.examples.nurserostering.swingui;
+
+import java.awt.Color;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.AbstractAction;
+import javax.swing.BorderFactory;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+
+import org.drools.planner.examples.common.swingui.SolutionPanel;
+import org.drools.planner.examples.nurserostering.domain.Employee;
+import org.drools.planner.examples.nurserostering.domain.EmployeeAssignment;
+import org.drools.planner.examples.nurserostering.domain.NurseRoster;
+import org.drools.planner.examples.nurserostering.domain.Shift;
+import org.drools.planner.examples.nurserostering.solver.move.ShiftChangeMove;
+
+/**
+ * TODO this code is highly unoptimized
+ * @author Geoffrey De Smet
+ */
+public class NurseRosteringPanel extends SolutionPanel {
+
+ private static final Color HEADER_COLOR = Color.YELLOW;
+
+ private GridLayout gridLayout;
+
+ public NurseRosteringPanel() {
+ gridLayout = new GridLayout(0, 1);
+ setLayout(gridLayout);
+ }
+
+ private NurseRoster getNurseRoster() {
+ return (NurseRoster) solutionBusiness.getSolution();
+ }
+
+ public void resetPanel() {
+ removeAll();
+ NurseRoster schedule = getNurseRoster();
+ gridLayout.setColumns(schedule.getEmployeeList().size() + 1);
+ JLabel headerCornerLabel = new JLabel("Shift \\ Employee");
+ headerCornerLabel.setBorder(BorderFactory.createCompoundBorder(
+ BorderFactory.createLineBorder(Color.DARK_GRAY),
+ BorderFactory.createEmptyBorder(2, 2, 2, 2)));
+ headerCornerLabel.setBackground(HEADER_COLOR);
+ headerCornerLabel.setOpaque(true);
+ add(headerCornerLabel);
+ for (Employee employee : schedule.getEmployeeList()) {
+ JLabel employeeLabel = new JLabel(employee.toString());
+ employeeLabel.setBorder(BorderFactory.createCompoundBorder(
+ BorderFactory.createLineBorder(Color.DARK_GRAY),
+ BorderFactory.createEmptyBorder(2, 2, 2, 2)));
+ employeeLabel.setBackground(HEADER_COLOR);
+ employeeLabel.setOpaque(true);
+ add(employeeLabel);
+ }
+ Map<Shift, Map<Employee, ShiftEmployeePanel>> shiftEmployeePanelMap = new HashMap<Shift, Map<Employee, ShiftEmployeePanel>>();
+ for (Shift shift : schedule.getShiftList()) {
+ JLabel shiftLabel = new JLabel(shift.toString());
+ shiftLabel.setBorder(BorderFactory.createCompoundBorder(
+ BorderFactory.createLineBorder(Color.DARK_GRAY),
+ BorderFactory.createEmptyBorder(2, 2, 2, 2)));
+ shiftLabel.setBackground(HEADER_COLOR);
+ shiftLabel.setOpaque(true);
+ add(shiftLabel);
+ Map<Employee, ShiftEmployeePanel> employeePanelMap = new HashMap<Employee, ShiftEmployeePanel>();
+ shiftEmployeePanelMap.put(shift, employeePanelMap);
+ for (Employee employee : schedule.getEmployeeList()) {
+ ShiftEmployeePanel shiftEmployeePanel = new ShiftEmployeePanel();
+ add(shiftEmployeePanel);
+ employeePanelMap.put(employee, shiftEmployeePanel);
+ }
+ }
+ if (schedule.isInitialized()) {
+ for (EmployeeAssignment employeeAssignment : schedule.getEmployeeAssignmentList()) {
+ Shift shift = employeeAssignment.getShift();
+ if (shift != null) {
+ ShiftEmployeePanel shiftEmployeePanel = shiftEmployeePanelMap.get(shift).get(employeeAssignment.getEmployee());
+ shiftEmployeePanel.addEmployeeAssignment(employeeAssignment);
+ }
+ }
+ }
+ }
+
+ private class ShiftEmployeePanel extends JPanel {
+
+ public ShiftEmployeePanel() {
+ super(new GridLayout(0, 1));
+ setBorder(BorderFactory.createCompoundBorder(
+ BorderFactory.createLineBorder(Color.DARK_GRAY),
+ BorderFactory.createEmptyBorder(2, 2, 2, 2)));
+ }
+
+ public void addEmployeeAssignment(EmployeeAssignment employeeAssignment) {
+ JButton button = new JButton(new ExamAction(employeeAssignment));
+ add(button);
+ }
+
+ }
+
+ private class ExamAction extends AbstractAction {
+
+ private EmployeeAssignment employeeAssignment;
+
+ public ExamAction(EmployeeAssignment employeeAssignment) {
+ super(employeeAssignment.getLabel());
+ this.employeeAssignment = employeeAssignment;
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ List<Shift> shiftList = getNurseRoster().getShiftList();
+ JComboBox shiftListField = new JComboBox(shiftList.toArray());
+ shiftListField.setSelectedItem(employeeAssignment.getShift());
+ int result = JOptionPane.showConfirmDialog(NurseRosteringPanel.this.getRootPane(), shiftListField,
+ "Select shift", JOptionPane.OK_CANCEL_OPTION);
+ if (result == JOptionPane.OK_OPTION) {
+ Shift toShift = (Shift) shiftListField.getSelectedItem();
+ solutionBusiness.doMove(new ShiftChangeMove(employeeAssignment, toShift));
+ workflowFrame.updateScreen();
+ }
+ }
+
+ }
+
+}
Copied: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl (from rev 32249, labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/curriculumcourse/solver/curriculumCourseScoreRules.drl)
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl 2010-03-28 19:17:36 UTC (rev 32267)
@@ -0,0 +1,77 @@
+package org.drools.planner.examples.nurserostering.solver;
+ dialect "java"
+
+import org.drools.planner.core.score.calculator.HardAndSoftConstraintScoreCalculator;
+import org.drools.planner.core.score.constraint.IntConstraintOccurrence;
+import org.drools.planner.core.score.constraint.ConstraintType;
+
+import org.drools.planner.examples.nurserostering.domain.Contract;
+import org.drools.planner.examples.nurserostering.domain.DayOfWeek;
+import org.drools.planner.examples.nurserostering.domain.DayOffRequest;
+import org.drools.planner.examples.nurserostering.domain.DayOnRequest;
+import org.drools.planner.examples.nurserostering.domain.Employee;
+import org.drools.planner.examples.nurserostering.domain.EmployeeAssignment;
+import org.drools.planner.examples.nurserostering.domain.NurseRoster;
+import org.drools.planner.examples.nurserostering.domain.Pattern;
+import org.drools.planner.examples.nurserostering.domain.Shift;
+import org.drools.planner.examples.nurserostering.domain.ShiftDate;
+import org.drools.planner.examples.nurserostering.domain.ShiftOffRequest;
+import org.drools.planner.examples.nurserostering.domain.ShiftOnRequest;
+import org.drools.planner.examples.nurserostering.domain.ShiftType;
+import org.drools.planner.examples.nurserostering.domain.ShiftTypeSkillRequirement;
+import org.drools.planner.examples.nurserostering.domain.Skill;
+import org.drools.planner.examples.nurserostering.domain.SkillProficiency;
+
+// @author Geoffrey De Smet
+
+global HardAndSoftConstraintScoreCalculator scoreCalculator;
+
+// ############################################################################
+// Hard constraints
+// ############################################################################
+
+// All demanded shifts must be assigned to a nurse
+rule "requiredEmployeeSizePerShift"
+ when
+ $shift : Shift(requiredEmployeeSize > 0, $requiredEmployeeSize : requiredEmployeeSize);
+
+ $totalEmployeeSize : Number(intValue < $requiredEmployeeSize) from accumulate(
+ $assignment : EmployeeAssignment(shift == $shift),
+ count($assignment)
+ );
+ then
+ insertLogical(new IntConstraintOccurrence("requiredEmployeeSizePerShift",
+ ConstraintType.NEGATIVE_HARD, $requiredEmployeeSize - $totalEmployeeSize.intValue(), $shift));
+end
+
+// ############################################################################
+// Soft constraints
+// ############################################################################
+
+// ############################################################################
+// Calculate score
+// ############################################################################
+
+// Accumulate hard constraints
+rule "hardConstraintsBroken"
+ salience -1 // Do the other rules first (optional, for performance)
+ when
+ $hardTotal : Number() from accumulate(
+ IntConstraintOccurrence(constraintType == ConstraintType.NEGATIVE_HARD, $weight : weight),
+ sum($weight) // Vote for http://jira.jboss.com/jira/browse/JBRULES-1075
+ );
+ then
+ scoreCalculator.setHardConstraintsBroken($hardTotal.intValue());
+end
+
+// Accumulate soft constraints
+rule "softConstraintsBroken"
+ salience -1 // Do the other rules first (optional, for performance)
+ when
+ $softTotal : Number() from accumulate(
+ IntConstraintOccurrence(constraintType == ConstraintType.NEGATIVE_SOFT, $weight : weight),
+ sum($weight) // Vote for http://jira.jboss.com/jira/browse/JBRULES-1075
+ );
+ then
+ scoreCalculator.setSoftConstraintsBroken($softTotal.intValue());
+end
Copied: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml (from rev 32249, labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/curriculumcourse/solver/curriculumCourseSolverConfig.xml)
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml 2010-03-28 19:17:36 UTC (rev 32267)
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<localSearchSolver>
+ <scoreDrl>/org/drools/planner/examples/nurserostering/solver/nurseRosteringScoreRules.drl</scoreDrl>
+ <scoreDefinition>
+ <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>
+ </scoreDefinition>
+ <startingSolutionInitializerClass>org.drools.planner.examples.nurserostering.solver.solution.initializer.NurseRosteringStartingSolutionInitializer</startingSolutionInitializerClass>
+ <termination>
+ <!--
+ Official benchmark maximumSecondsSpend allowed on:
+ ge0ffrey's main pc: TODO
+ ge0ffrey's old pc: TODO
+ -->
+ <maximumSecondsSpend>429</maximumSecondsSpend>
+ <!--<scoreAttained>-0hard/-999999soft</scoreAttained>-->
+ <!--<maximumStepCount>100</maximumStepCount>-->
+ </termination>
+ <selector>
+ <selector>
+ <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.ShiftChangeMoveFactory</moveFactoryClass>
+ <absoluteSelection>500</absoluteSelection>
+ </selector>
+ <!--<selector>-->
+ <!--<moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.ShiftSwitchMoveFactory</moveFactoryClass>-->
+ <!--<absoluteSelection>500</absoluteSelection>-->
+ <!--</selector>-->
+ </selector>
+ <acceptor>
+ <completePropertyTabuSize>7</completePropertyTabuSize>
+ <completeSolutionTabuSize>1000</completeSolutionTabuSize>
+ </acceptor>
+ <forager>
+ <foragerType>MAX_SCORE_OF_ALL</foragerType>
+ </forager>
+</localSearchSolver>
More information about the jboss-svn-commits
mailing list