[jboss-svn-commits] JBL Code SVN: r27232 - in labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main: java/org/drools/solver/examples/patientadmissionschedule/solver/move and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Jun 28 07:43:34 EDT 2009


Author: ge0ffrey
Date: 2009-06-28 07:43:33 -0400 (Sun, 28 Jun 2009)
New Revision: 27232

Added:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/solver/move/BedDesignationSwitchMove.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/solver/move/factory/BedDesignationSwitchMoveFactory.java
Modified:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/AdmissionPart.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/PatientAdmissionSchedule.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/solver/move/BedChangeMove.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/solver/move/factory/BedChangeMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleSolverConfig.xml
Log:
pas: switch admission moves

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/AdmissionPart.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/AdmissionPart.java	2009-06-28 11:08:42 UTC (rev 27231)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/AdmissionPart.java	2009-06-28 11:43:33 UTC (rev 27232)
@@ -2,6 +2,7 @@
 
 import org.apache.commons.lang.builder.CompareToBuilder;
 import org.drools.solver.examples.common.domain.AbstractPersistable;
+import org.drools.solver.examples.patientadmissionschedule.domain.solver.AdmissionPartConflict;
 
 /**
  * @author Geoffrey De Smet
@@ -58,4 +59,10 @@
         return patient + "(" + firstNight + "-" + lastNight + ")";
     }
 
+    public int calculateSameNightCount(AdmissionPart other) {
+        int firstNightIndex = Math.max(getFirstNight().getIndex(), other.getFirstNight().getIndex());
+        int lastNightIndex = Math.min(getLastNight().getIndex(), other.getLastNight().getIndex());
+        return Math.max(0, lastNightIndex - firstNightIndex + 1);
+    }
+
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/PatientAdmissionSchedule.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/PatientAdmissionSchedule.java	2009-06-28 11:08:42 UTC (rev 27231)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/PatientAdmissionSchedule.java	2009-06-28 11:43:33 UTC (rev 27232)
@@ -177,13 +177,10 @@
         for (AdmissionPart leftAdmissionPart : admissionPartList) {
             for (AdmissionPart rightAdmissionPart : admissionPartList) {
                 if (leftAdmissionPart.getId() < rightAdmissionPart.getId()) {
-                    int firstNightIndex = Math.max(leftAdmissionPart.getFirstNight().getIndex(),
-                            rightAdmissionPart.getFirstNight().getIndex());
-                    int lastNightIndex = Math.min(leftAdmissionPart.getLastNight().getIndex(),
-                            rightAdmissionPart.getLastNight().getIndex());
-                    if (firstNightIndex <= lastNightIndex) {
+                    int sameNightCount = leftAdmissionPart.calculateSameNightCount(rightAdmissionPart);
+                    if (sameNightCount > 0) {
                         admissionPartConflictList.add(new AdmissionPartConflict(
-                                leftAdmissionPart, rightAdmissionPart, lastNightIndex - firstNightIndex + 1));
+                                leftAdmissionPart, rightAdmissionPart, sameNightCount));
                     }
                 }
             }

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/solver/move/BedChangeMove.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/solver/move/BedChangeMove.java	2009-06-28 11:08:42 UTC (rev 27231)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/solver/move/BedChangeMove.java	2009-06-28 11:43:33 UTC (rev 27232)
@@ -10,8 +10,8 @@
 import org.drools.runtime.rule.FactHandle;
 import org.drools.solver.core.localsearch.decider.accepter.tabu.TabuPropertyEnabled;
 import org.drools.solver.core.move.Move;
+import org.drools.solver.examples.patientadmissionschedule.domain.Bed;
 import org.drools.solver.examples.patientadmissionschedule.domain.BedDesignation;
-import org.drools.solver.examples.patientadmissionschedule.domain.Bed;
 
 /**
  * @author Geoffrey De Smet

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/solver/move/BedDesignationSwitchMove.java (from rev 27229, labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/manners2009/solver/move/SeatDesignationSwitchMove.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/solver/move/BedDesignationSwitchMove.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/solver/move/BedDesignationSwitchMove.java	2009-06-28 11:43:33 UTC (rev 27232)
@@ -0,0 +1,82 @@
+package org.drools.solver.examples.patientadmissionschedule.solver.move;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.drools.WorkingMemory;
+import org.drools.runtime.rule.FactHandle;
+import org.drools.solver.core.localsearch.decider.accepter.tabu.TabuPropertyEnabled;
+import org.drools.solver.core.move.Move;
+import org.drools.solver.examples.patientadmissionschedule.domain.Bed;
+import org.drools.solver.examples.patientadmissionschedule.domain.BedDesignation;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class BedDesignationSwitchMove implements Move, TabuPropertyEnabled {
+
+    private BedDesignation leftBedDesignation;
+    private BedDesignation rightBedDesignation;
+
+    public BedDesignationSwitchMove(BedDesignation leftBedDesignation, BedDesignation rightBedDesignation) {
+        this.leftBedDesignation = leftBedDesignation;
+        this.rightBedDesignation = rightBedDesignation;
+    }
+
+    public boolean isMoveDoable(WorkingMemory workingMemory) {
+        return !ObjectUtils.equals(leftBedDesignation.getBed(), rightBedDesignation.getBed())
+                && rightBedDesignation.getBed().allowsAdmissionPart(leftBedDesignation.getAdmissionPart())
+                && leftBedDesignation.getBed().allowsAdmissionPart(rightBedDesignation.getAdmissionPart());
+    }
+
+    public Move createUndoMove(WorkingMemory workingMemory) {
+        return new BedDesignationSwitchMove(rightBedDesignation, leftBedDesignation);
+    }
+
+    public void doMove(WorkingMemory workingMemory) {
+        Bed oldLeftBed = leftBedDesignation.getBed();
+        Bed oldRightBed = rightBedDesignation.getBed();
+        moveBed(workingMemory, leftBedDesignation, oldRightBed);
+        moveBed(workingMemory, rightBedDesignation, oldLeftBed);
+    }
+
+    // Extract to helper class if other moves are created
+    private static void moveBed(WorkingMemory workingMemory, BedDesignation bedDesignation, Bed toBed) {
+        FactHandle factHandle = workingMemory.getFactHandle(bedDesignation);
+        bedDesignation.setBed(toBed);
+        workingMemory.update(factHandle, bedDesignation);
+    }
+
+    public Collection<? extends Object> getTabuProperties() {
+        return Arrays.<BedDesignation>asList(leftBedDesignation, rightBedDesignation);
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        } else if (o instanceof BedDesignationSwitchMove) {
+            BedDesignationSwitchMove other = (BedDesignationSwitchMove) o;
+            return new EqualsBuilder()
+                    .append(leftBedDesignation, other.leftBedDesignation)
+                    .append(rightBedDesignation, other.rightBedDesignation)
+                    .isEquals();
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+                .append(leftBedDesignation)
+                .append(rightBedDesignation)
+                .toHashCode();
+    }
+
+    public String toString() {
+        return leftBedDesignation + " <=> " + rightBedDesignation;
+    }
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/solver/move/factory/BedChangeMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/solver/move/factory/BedChangeMoveFactory.java	2009-06-28 11:08:42 UTC (rev 27231)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/solver/move/factory/BedChangeMoveFactory.java	2009-06-28 11:43:33 UTC (rev 27232)
@@ -6,14 +6,9 @@
 import org.drools.solver.core.move.Move;
 import org.drools.solver.core.move.factory.CachedMoveFactory;
 import org.drools.solver.core.solution.Solution;
-import org.drools.solver.examples.itc2007.examination.domain.Exam;
-import org.drools.solver.examples.itc2007.examination.domain.Examination;
-import org.drools.solver.examples.itc2007.examination.domain.Period;
-import org.drools.solver.examples.itc2007.examination.solver.move.PeriodChangeMove;
-import org.drools.solver.examples.patientadmissionschedule.domain.PatientAdmissionSchedule;
 import org.drools.solver.examples.patientadmissionschedule.domain.Bed;
-import org.drools.solver.examples.patientadmissionschedule.domain.AdmissionPart;
 import org.drools.solver.examples.patientadmissionschedule.domain.BedDesignation;
+import org.drools.solver.examples.patientadmissionschedule.domain.PatientAdmissionSchedule;
 import org.drools.solver.examples.patientadmissionschedule.solver.move.BedChangeMove;
 
 /**

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/solver/move/factory/BedDesignationSwitchMoveFactory.java (from rev 27229, labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/manners2009/solver/move/factory/SeatDesignationSwitchMoveFactory.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/solver/move/factory/BedDesignationSwitchMoveFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/solver/move/factory/BedDesignationSwitchMoveFactory.java	2009-06-28 11:43:33 UTC (rev 27232)
@@ -0,0 +1,36 @@
+package org.drools.solver.examples.patientadmissionschedule.solver.move.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+
+import org.drools.solver.core.move.Move;
+import org.drools.solver.core.move.factory.CachedMoveFactory;
+import org.drools.solver.core.solution.Solution;
+import org.drools.solver.examples.patientadmissionschedule.domain.BedDesignation;
+import org.drools.solver.examples.patientadmissionschedule.domain.PatientAdmissionSchedule;
+import org.drools.solver.examples.patientadmissionschedule.solver.move.BedDesignationSwitchMove;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class BedDesignationSwitchMoveFactory extends CachedMoveFactory {
+
+    public List<Move> createCachedMoveList(Solution solution) {
+        PatientAdmissionSchedule patientAdmissionSchedule = (PatientAdmissionSchedule) solution;
+        List<BedDesignation> bedDesignationList = patientAdmissionSchedule.getBedDesignationList();
+        List<Move> moveList = new ArrayList<Move>();
+        for (ListIterator<BedDesignation> leftIt = bedDesignationList.listIterator(); leftIt.hasNext();) {
+            BedDesignation leftBedDesignation = leftIt.next();
+            for (ListIterator<BedDesignation> rightIt = bedDesignationList.listIterator(leftIt.nextIndex());
+                    rightIt.hasNext();) {
+                BedDesignation rightBedDesignation = rightIt.next();
+                if (leftBedDesignation.getAdmissionPart().calculateSameNightCount(rightBedDesignation.getAdmissionPart()) > 0) {
+                    moveList.add(new BedDesignationSwitchMove(leftBedDesignation, rightBedDesignation));
+                }
+            }
+        }
+        return moveList;
+    }
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleSolverConfig.xml	2009-06-28 11:08:42 UTC (rev 27231)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleSolverConfig.xml	2009-06-28 11:43:33 UTC (rev 27232)
@@ -22,10 +22,10 @@
             <moveFactoryClass>org.drools.solver.examples.patientadmissionschedule.solver.move.factory.BedChangeMoveFactory</moveFactoryClass>
             <relativeSelection>0.002</relativeSelection>
         </selector>
-        <!--<selector>-->
-            <!--<moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.move.factory.ExamSwitchMoveFactory</moveFactoryClass>-->
-            <!--<relativeSelection>0.002</relativeSelection>-->
-        <!--</selector>-->
+        <selector>
+            <moveFactoryClass>org.drools.solver.examples.patientadmissionschedule.solver.move.factory.BedDesignationSwitchMoveFactory</moveFactoryClass>
+            <relativeSelection>0.002</relativeSelection>
+        </selector>
     </selector>
     <accepter>
         <completeSolutionTabuSize>1000</completeSolutionTabuSize>




More information about the jboss-svn-commits mailing list