[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