[jboss-svn-commits] JBL Code SVN: r27713 - in labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main: resources/org/drools/solver/examples/pas/solver and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Jul 7 16:24:00 EDT 2009


Author: ge0ffrey
Date: 2009-07-07 16:23:59 -0400 (Tue, 07 Jul 2009)
New Revision: 27713

Modified:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/pas/solver/move/factory/BedDesignationPillarPartSwitchMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/pas/solver/patientAdmissionScheduleSolverConfig.xml
Log:
BedDesignationPillarPartSwitchMoveFactory: conflict improvements

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/pas/solver/move/factory/BedDesignationPillarPartSwitchMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/pas/solver/move/factory/BedDesignationPillarPartSwitchMoveFactory.java	2009-07-07 20:10:24 UTC (rev 27712)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/pas/solver/move/factory/BedDesignationPillarPartSwitchMoveFactory.java	2009-07-07 20:23:59 UTC (rev 27713)
@@ -83,17 +83,32 @@
                     // which is bad for memory, but the opposite is bad for performance (which is worse)
                     List<Move> moveListByPillarPartDuo = new ArrayList<Move>(
                             leftBedDesignationList.size() + rightBedDesignationList.size());
-                    int minimumLastNightIndex = pillarPartBedDesignation.getAdmissionPart().getLastNight().getIndex();
-                    Bed otherBed = pillarPartBedDesignation.getBed().equals(leftBed) ? rightBed : leftBed;
+                    int lastNightIndex = pillarPartBedDesignation.getAdmissionPart().getLastNight().getIndex();
+                    Bed otherBed;
+                    int leftMinimumLastNightIndex = Integer.MIN_VALUE;
+                    int rightMinimumLastNightIndex = Integer.MIN_VALUE;
+                    if (lowestIt.isLastNextWasLeft()) {
+                        otherBed = rightBed;
+                        leftMinimumLastNightIndex = lastNightIndex;
+                    } else {
+                        otherBed = leftBed;
+                        rightMinimumLastNightIndex = lastNightIndex;
+                    }
                     boolean allBedsAllowAdmissionPart = otherBed.allowsAdmissionPart(
                             pillarPartBedDesignation.getAdmissionPart());
                     moveListByPillarPartDuo.add(new BedChangeMove(pillarPartBedDesignation, otherBed));
                     // For every BedDesignation in that pillar part duo
-                    while (lowestIt.hasNextWithMaximumFirstNightIndex(minimumLastNightIndex)) {
+                    while (lowestIt.hasNextWithMaximumFirstNightIndexes(
+                            leftMinimumLastNightIndex, rightMinimumLastNightIndex)) {
                         pillarPartBedDesignation = lowestIt.next();
-                        minimumLastNightIndex = Math.max(minimumLastNightIndex,
-                                pillarPartBedDesignation.getAdmissionPart().getLastNight().getIndex());
-                        otherBed = pillarPartBedDesignation.getBed().equals(leftBed) ? rightBed : leftBed;
+                        lastNightIndex = pillarPartBedDesignation.getAdmissionPart().getLastNight().getIndex();
+                        if (lowestIt.isLastNextWasLeft()) {
+                            otherBed = rightBed;
+                            leftMinimumLastNightIndex = Math.max(leftMinimumLastNightIndex, lastNightIndex);
+                        } else {
+                            otherBed = leftBed;
+                            rightMinimumLastNightIndex = Math.max(rightMinimumLastNightIndex, lastNightIndex);
+                        }
                         allBedsAllowAdmissionPart = allBedsAllowAdmissionPart
                                 && otherBed.allowsAdmissionPart(pillarPartBedDesignation.getAdmissionPart());
                         moveListByPillarPartDuo.add(new BedChangeMove(pillarPartBedDesignation, otherBed));
@@ -118,8 +133,11 @@
         private BedDesignation nextLeft;
         private BedDesignation nextRight;
 
+        private boolean lastNextWasLeft;
+
         public LowestFirstNightBedDesignationIterator(
                 List<BedDesignation> leftBedDesignationList, List<BedDesignation> rightBedDesignationList) {
+            // Buffer the nextLeft and nextRight
             leftIterator = leftBedDesignationList.iterator();
             if (leftIterator.hasNext()) {
                 nextLeft = leftIterator.next();
@@ -140,32 +158,28 @@
             return leftHasNext || rightHasNext;
         }
 
-        public boolean hasNextWithMaximumFirstNightIndex(int maximumFirstNightIndex) {
-            return (leftHasNext
-                    && nextLeft.getAdmissionPart().getFirstNight().getIndex() <= maximumFirstNightIndex)
-                    || (rightHasNext
-                    && nextRight.getAdmissionPart().getFirstNight().getIndex() <= maximumFirstNightIndex);
+        public boolean hasNextWithMaximumFirstNightIndexes(
+                int leftMinimumLastNightIndex, int rightMinimumLastNightIndex) {
+            if (!hasNext()) {
+                return false;
+            }
+            boolean nextIsLeft = nextIsLeft();
+            if (nextIsLeft) {
+                int firstNightIndex = nextLeft.getAdmissionPart().getFirstNight().getIndex();
+                // It should not be conflict in the same pillar and it should be in conflict with the other pillar
+                return firstNightIndex > leftMinimumLastNightIndex && firstNightIndex <= rightMinimumLastNightIndex;
+            } else {
+                int firstNightIndex = nextRight.getAdmissionPart().getFirstNight().getIndex();
+                // It should not be conflict in the same pillar and it should be in conflict with the other pillar
+                return firstNightIndex > rightMinimumLastNightIndex && firstNightIndex <= leftMinimumLastNightIndex;
+            }
         }
 
         public BedDesignation next() {
-            boolean returnLeft;
-            if (leftHasNext) {
-                if (rightHasNext) {
-                    int leftFirstNightIndex = nextLeft.getAdmissionPart().getFirstNight().getIndex();
-                    int rightFirstNightIndex = nextRight.getAdmissionPart().getFirstNight().getIndex();
-                    returnLeft = leftFirstNightIndex < rightFirstNightIndex;
-                } else {
-                    returnLeft = true;
-                }
-            } else {
-                if (rightHasNext) {
-                    returnLeft = false;
-                } else {
-                    throw new NoSuchElementException();
-                }
-            }
+            lastNextWasLeft = nextIsLeft();
+            // Buffer the nextLeft or nextRight
             BedDesignation lowest;
-            if (returnLeft) {
+            if (lastNextWasLeft) {
                 lowest = nextLeft;
                 if (leftIterator.hasNext()) {
                     nextLeft = leftIterator.next();
@@ -185,9 +199,33 @@
             return lowest;
         }
 
+        private boolean nextIsLeft() {
+            boolean returnLeft;
+            if (leftHasNext) {
+                if (rightHasNext) {
+                    int leftFirstNightIndex = nextLeft.getAdmissionPart().getFirstNight().getIndex();
+                    int rightFirstNightIndex = nextRight.getAdmissionPart().getFirstNight().getIndex();
+                    returnLeft = leftFirstNightIndex < rightFirstNightIndex;
+                } else {
+                    returnLeft = true;
+                }
+            } else {
+                if (rightHasNext) {
+                    returnLeft = false;
+                } else {
+                    throw new NoSuchElementException();
+                }
+            }
+            return returnLeft;
+        }
+
         public void remove() {
             throw new UnsupportedSynchronousOperationException("Remove not supported.");
         }
+
+        public boolean isLastNextWasLeft() {
+            return lastNextWasLeft;
+        }
     }
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/pas/solver/patientAdmissionScheduleSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/pas/solver/patientAdmissionScheduleSolverConfig.xml	2009-07-07 20:10:24 UTC (rev 27712)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/pas/solver/patientAdmissionScheduleSolverConfig.xml	2009-07-07 20:23:59 UTC (rev 27713)
@@ -13,18 +13,22 @@
         <maximumSecondsSpend>3720</maximumSecondsSpend>
     </finish>
     <selector>
+        <!--<selector>-->
+            <!--<moveFactoryClass>org.drools.solver.examples.pas.solver.move.factory.BedChangeMoveFactory</moveFactoryClass>-->
+            <!--<relativeSelection>0.0008</relativeSelection>-->
+        <!--</selector>-->
+        <!--<selector>-->
+            <!--<moveFactoryClass>org.drools.solver.examples.pas.solver.move.factory.BedDesignationSwitchMoveFactory</moveFactoryClass>-->
+            <!--<relativeSelection>0.0008</relativeSelection>-->
+        <!--</selector>-->
         <selector>
-            <moveFactoryClass>org.drools.solver.examples.pas.solver.move.factory.BedChangeMoveFactory</moveFactoryClass>
+            <moveFactoryClass>org.drools.solver.examples.pas.solver.move.factory.BedDesignationPillarPartSwitchMoveFactory</moveFactoryClass>
             <relativeSelection>0.0008</relativeSelection>
         </selector>
-        <selector>
-            <moveFactoryClass>org.drools.solver.examples.pas.solver.move.factory.BedDesignationSwitchMoveFactory</moveFactoryClass>
-            <relativeSelection>0.0008</relativeSelection>
-        </selector>
     </selector>
     <accepter>
         <completeSolutionTabuSize>1000</completeSolutionTabuSize>
-        <!--<completePropertyTabuSize>7</completePropertyTabuSize>-->
+        <!--<completeMoveTabuSize>7</completeMoveTabuSize>-->
     </accepter>
     <forager>
         <foragerType>MAX_SCORE_OF_ALL</foragerType>




More information about the jboss-svn-commits mailing list