[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