[jboss-svn-commits] JBL Code SVN: r27226 - in labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main: java/org/drools/solver/examples/itc2007/examination/domain and 9 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sun Jun 28 06:09:54 EDT 2009
Author: ge0ffrey
Date: 2009-06-28 06:09:54 -0400 (Sun, 28 Jun 2009)
New Revision: 27226
Added:
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/solver/AdmissionPartConflict.java
Modified:
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/domain/CurriculumCourseSchedule.java
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Examination.java
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/solver/TopicConflict.java
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/domain/LessonSchedule.java
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/manners2009/domain/Manners2009.java
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/domain/NQueens.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/persistence/PatientAdmissionScheduleInputConvertor.java
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/domain/TravelingTournament.java
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleScoreRules.drl
Log:
pas: HB4 same bed conflict
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/domain/CurriculumCourseSchedule.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/domain/CurriculumCourseSchedule.java 2009-06-28 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/domain/CurriculumCourseSchedule.java 2009-06-28 10:09:54 UTC (rev 27226)
@@ -130,7 +130,7 @@
}
/**
- * Clone will only deep copy the lectures
+ * Clone will only deep copy the lectureList
*/
public CurriculumCourseSchedule cloneSolution() {
CurriculumCourseSchedule clone = new CurriculumCourseSchedule();
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Examination.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Examination.java 2009-06-28 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Examination.java 2009-06-28 10:09:54 UTC (rev 27226)
@@ -110,7 +110,7 @@
if (isInitialized()) {
facts.addAll(examList);
}
- // A faster alternative to the insertLogicalTopicConflicts rule.
+ // A faster alternative to a insertLogicalTopicConflicts rule.
facts.addAll(calculateTopicConflictList());
return facts;
}
@@ -137,7 +137,7 @@
}
/**
- * Clone will only deep copy the exams
+ * Clone will only deep copy the examList
*/
public Examination cloneSolution() {
Examination clone = new Examination();
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/solver/TopicConflict.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/solver/TopicConflict.java 2009-06-28 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/solver/TopicConflict.java 2009-06-28 10:09:54 UTC (rev 27226)
@@ -17,11 +17,6 @@
private Topic rightTopic;
private int studentSize;
- public TopicConflict(Topic leftTopic, Topic rightTopic) {
- this.leftTopic = leftTopic;
- this.rightTopic = rightTopic;
- }
-
public TopicConflict(Topic leftTopic, Topic rightTopic, int studentSize) {
this.leftTopic = leftTopic;
this.rightTopic = rightTopic;
@@ -52,7 +47,6 @@
this.studentSize = studentSize;
}
- // TODO decide to keep or remove this object logicallyAsserted
public boolean equals(Object o) {
if (this == o) {
return true;
@@ -67,7 +61,6 @@
}
}
- // TODO decide to keep or remove this object logicallyAsserted
public int hashCode() {
return new HashCodeBuilder()
.append(leftTopic)
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/domain/LessonSchedule.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/domain/LessonSchedule.java 2009-06-28 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/domain/LessonSchedule.java 2009-06-28 10:09:54 UTC (rev 27226)
@@ -61,7 +61,7 @@
}
/**
- * Clone will only deep copy the lessons
+ * Clone will only deep copy the lessonList
*/
public LessonSchedule cloneSolution() {
LessonSchedule clone = new LessonSchedule();
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/manners2009/domain/Manners2009.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/manners2009/domain/Manners2009.java 2009-06-28 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/manners2009/domain/Manners2009.java 2009-06-28 10:09:54 UTC (rev 27226)
@@ -92,7 +92,7 @@
}
/**
- * Clone will only deep copy the matches
+ * Clone will only deep copy the seatDesignationList
*/
public Manners2009 cloneSolution() {
Manners2009 clone = new Manners2009();
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/domain/NQueens.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/domain/NQueens.java 2009-06-28 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/domain/NQueens.java 2009-06-28 10:09:54 UTC (rev 27226)
@@ -44,7 +44,7 @@
}
/**
- * Clone will only deep copy the queens
+ * Clone will only deep copy the queenList
*/
public NQueens cloneSolution() {
NQueens clone = new NQueens();
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 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/PatientAdmissionSchedule.java 2009-06-28 10:09:54 UTC (rev 27226)
@@ -8,6 +8,10 @@
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.drools.solver.core.solution.Solution;
import org.drools.solver.examples.common.domain.AbstractPersistable;
+import org.drools.solver.examples.itc2007.examination.domain.solver.TopicConflict;
+import org.drools.solver.examples.itc2007.examination.domain.Topic;
+import org.drools.solver.examples.itc2007.examination.domain.Student;
+import org.drools.solver.examples.patientadmissionschedule.domain.solver.AdmissionPartConflict;
/**
* @author Geoffrey De Smet
@@ -164,11 +168,31 @@
if (isInitialized()) {
facts.addAll(bedDesignationList);
}
+ facts.addAll(calculateAdmissionPartConflictList());
return facts;
}
+ private List<AdmissionPartConflict> calculateAdmissionPartConflictList() {
+ List<AdmissionPartConflict> admissionPartConflictList = new ArrayList<AdmissionPartConflict>();
+ 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) {
+ admissionPartConflictList.add(new AdmissionPartConflict(
+ leftAdmissionPart, rightAdmissionPart, lastNightIndex - firstNightIndex + 1));
+ }
+ }
+ }
+ }
+ return admissionPartConflictList;
+ }
+
/**
- * Clone will only deep copy the exams
+ * Clone will only deep copy the bedDesignationList
*/
public PatientAdmissionSchedule cloneSolution() {
PatientAdmissionSchedule clone = new PatientAdmissionSchedule();
Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/solver/AdmissionPartConflict.java (from rev 27222, labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/solver/TopicConflict.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/solver/AdmissionPartConflict.java (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/solver/AdmissionPartConflict.java 2009-06-28 10:09:54 UTC (rev 27226)
@@ -0,0 +1,83 @@
+package org.drools.solver.examples.patientadmissionschedule.domain.solver;
+
+import java.io.Serializable;
+
+import org.apache.commons.lang.builder.CompareToBuilder;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.drools.solver.examples.patientadmissionschedule.domain.AdmissionPart;
+
+/**
+ * Calculated during initialization, not modified during score calculation.
+ * @author Geoffrey De Smet
+ */
+public class AdmissionPartConflict implements Serializable {
+
+ private AdmissionPart leftAdmissionPart;
+ private AdmissionPart rightAdmissionPart;
+ private int nightSize;
+
+ public AdmissionPartConflict(AdmissionPart leftAdmissionPart, AdmissionPart rightAdmissionPart, int nightSize) {
+ this.leftAdmissionPart = leftAdmissionPart;
+ this.rightAdmissionPart = rightAdmissionPart;
+ this.nightSize = nightSize;
+ }
+
+ public AdmissionPart getLeftAdmissionPart() {
+ return leftAdmissionPart;
+ }
+
+ public void setLeftAdmissionPart(AdmissionPart leftAdmissionPart) {
+ this.leftAdmissionPart = leftAdmissionPart;
+ }
+
+ public AdmissionPart getRightAdmissionPart() {
+ return rightAdmissionPart;
+ }
+
+ public void setRightAdmissionPart(AdmissionPart rightAdmissionPart) {
+ this.rightAdmissionPart = rightAdmissionPart;
+ }
+
+ public int getNightSize() {
+ return nightSize;
+ }
+
+ public void setNightSize(int nightSize) {
+ this.nightSize = nightSize;
+ }
+
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ } else if (o instanceof AdmissionPartConflict) {
+ AdmissionPartConflict other = (AdmissionPartConflict) o;
+ return new EqualsBuilder()
+ .append(leftAdmissionPart, other.leftAdmissionPart)
+ .append(rightAdmissionPart, other.rightAdmissionPart)
+ .isEquals();
+ } else {
+ return false;
+ }
+ }
+
+ public int hashCode() {
+ return new HashCodeBuilder()
+ .append(leftAdmissionPart)
+ .append(rightAdmissionPart)
+ .toHashCode();
+ }
+
+ public int compareTo(AdmissionPartConflict other) {
+ return new CompareToBuilder()
+ .append(leftAdmissionPart, other.leftAdmissionPart)
+ .append(rightAdmissionPart, other.rightAdmissionPart)
+ .toComparison();
+ }
+
+ @Override
+ public String toString() {
+ return leftAdmissionPart + " & " + rightAdmissionPart + " = " + nightSize;
+ }
+
+}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/persistence/PatientAdmissionScheduleInputConvertor.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/persistence/PatientAdmissionScheduleInputConvertor.java 2009-06-28 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/persistence/PatientAdmissionScheduleInputConvertor.java 2009-06-28 10:09:54 UTC (rev 27226)
@@ -2,31 +2,32 @@
import java.io.IOException;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.HashMap;
+import org.drools.solver.core.solution.Solution;
import org.drools.solver.examples.common.persistence.AbstractInputConvertor;
-import org.drools.solver.examples.patientadmissionschedule.domain.PatientAdmissionSchedule;
-import org.drools.solver.examples.patientadmissionschedule.domain.Specialism;
+import org.drools.solver.examples.patientadmissionschedule.domain.AdmissionPart;
+import org.drools.solver.examples.patientadmissionschedule.domain.Bed;
import org.drools.solver.examples.patientadmissionschedule.domain.Department;
import org.drools.solver.examples.patientadmissionschedule.domain.DepartmentSpecialism;
import org.drools.solver.examples.patientadmissionschedule.domain.Equipment;
-import org.drools.solver.examples.patientadmissionschedule.domain.Room;
-import org.drools.solver.examples.patientadmissionschedule.domain.RoomSpecialism;
+import org.drools.solver.examples.patientadmissionschedule.domain.Gender;
import org.drools.solver.examples.patientadmissionschedule.domain.GenderLimitation;
-import org.drools.solver.examples.patientadmissionschedule.domain.RoomEquipment;
-import org.drools.solver.examples.patientadmissionschedule.domain.Bed;
import org.drools.solver.examples.patientadmissionschedule.domain.Night;
import org.drools.solver.examples.patientadmissionschedule.domain.Patient;
-import org.drools.solver.examples.patientadmissionschedule.domain.AdmissionPart;
+import org.drools.solver.examples.patientadmissionschedule.domain.PatientAdmissionSchedule;
+import org.drools.solver.examples.patientadmissionschedule.domain.PreferredPatientEquipment;
import org.drools.solver.examples.patientadmissionschedule.domain.RequiredPatientEquipment;
-import org.drools.solver.examples.patientadmissionschedule.domain.PreferredPatientEquipment;
-import org.drools.solver.examples.patientadmissionschedule.domain.Gender;
-import org.drools.solver.core.solution.Solution;
+import org.drools.solver.examples.patientadmissionschedule.domain.Room;
+import org.drools.solver.examples.patientadmissionschedule.domain.RoomEquipment;
+import org.drools.solver.examples.patientadmissionschedule.domain.RoomSpecialism;
+import org.drools.solver.examples.patientadmissionschedule.domain.Specialism;
/**
* @author Geoffrey De Smet
+ * @author Wim Vancroonenburg
*/
public class PatientAdmissionScheduleInputConvertor extends AbstractInputConvertor {
@@ -321,35 +322,37 @@
ensureEnoughNights(lastNightIndex);
Night endNight = indexToNightMap.get(lastNightIndex);
int patientNightListSize = endNight.getIndex() - firstNight.getIndex();
-
- String[] admissionPartTokens = splitBySpace(lineTokens[2]);
- if (admissionPartTokens.length % 2 != 1) {
+ // A patient with no nights doesn't have a admissionPart
+ if (patientNightListSize != 0) {
+ String[] admissionPartTokens = splitBySpace(lineTokens[2]);
+ if (admissionPartTokens.length % 2 != 1) {
+ }
+ int patientAdmissionPartListSize = Integer.parseInt(admissionPartTokens[0]);
+ if (admissionPartTokens.length != ((patientAdmissionPartListSize * 2) + 1)) {
+ throw new IllegalArgumentException("Read line (" + line
+ + ") is expected to contain " + ((patientAdmissionPartListSize * 2) + 1)
+ + " number of tokens after 2th pipeline (|).");
+ }
+ int nextFirstNightIndex = firstNight.getIndex();
+ for (int j = 1; j < admissionPartTokens.length; j += 2) {
+ long specialismId = Long.parseLong(admissionPartTokens[j]);
+ int admissionPartNightListSize = Integer.parseInt(admissionPartTokens[j + 1]);
+ AdmissionPart admissionPart = new AdmissionPart();
+ admissionPart.setId(admissionPartId);
+ admissionPart.setPatient(patient);
+ admissionPart.setSpecialism(idToSpecialismMap.get(specialismId));
+ admissionPart.setFirstNight(indexToNightMap.get(nextFirstNightIndex));
+ admissionPart.setLastNight(indexToNightMap.get(nextFirstNightIndex + admissionPartNightListSize - 1));
+ admissionPartList.add(admissionPart);
+ admissionPartId++;
+ nextFirstNightIndex += admissionPartNightListSize;
+ }
+ if (nextFirstNightIndex != nextFirstNightIndex) {
+ throw new IllegalArgumentException("Read line (" + line
+ + ") has patientNightListSize (" + patientNightListSize
+ + ") different from the sum of admissionPartNightListSize (" + nextFirstNightIndex + ")");
+ }
}
- int patientAdmissionPartListSize = Integer.parseInt(admissionPartTokens[0]);
- if (admissionPartTokens.length != ((patientAdmissionPartListSize * 2) + 1)) {
- throw new IllegalArgumentException("Read line (" + line
- + ") is expected to contain " + ((patientAdmissionPartListSize * 2) + 1)
- + " number of tokens after 2th pipeline (|).");
- }
- int nextFirstNightIndex = firstNight.getIndex();
- for (int j = 1; j < admissionPartTokens.length; j += 2) {
- long specialismId = Long.parseLong(admissionPartTokens[j]);
- int admissionPartNightListSize = Integer.parseInt(admissionPartTokens[j + 1]);
- AdmissionPart admissionPart = new AdmissionPart();
- admissionPart.setId(admissionPartId);
- admissionPart.setPatient(patient);
- admissionPart.setSpecialism(idToSpecialismMap.get(specialismId));
- admissionPart.setFirstNight(indexToNightMap.get(nextFirstNightIndex));
- admissionPart.setLastNight(indexToNightMap.get(nextFirstNightIndex + admissionPartNightListSize - 1));
- admissionPartList.add(admissionPart);
- admissionPartId++;
- nextFirstNightIndex += admissionPartNightListSize;
- }
- if (nextFirstNightIndex != nextFirstNightIndex) {
- throw new IllegalArgumentException("Read line (" + line
- + ") has patientNightListSize (" + patientNightListSize
- + ") different from the sum of admissionPartNightListSize (" + nextFirstNightIndex + ")");
- }
List<RequiredPatientEquipment> requiredPatientEquipmentOfPatientList = new ArrayList<RequiredPatientEquipment>(equipmentListSize);
String[] requiredPatientEquipmentTokens = splitBySpace(lineTokens[4]);
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/domain/TravelingTournament.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/domain/TravelingTournament.java 2009-06-28 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/domain/TravelingTournament.java 2009-06-28 10:09:54 UTC (rev 27226)
@@ -57,7 +57,7 @@
}
/**
- * Clone will only deep copy the matches
+ * Clone will only deep copy the matchList
*/
public TravelingTournament cloneSolution() {
TravelingTournament clone = new TravelingTournament();
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleScoreRules.drl
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleScoreRules.drl 2009-06-28 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleScoreRules.drl 2009-06-28 10:09:54 UTC (rev 27226)
@@ -5,18 +5,24 @@
import org.drools.solver.core.score.constraint.IntConstraintOccurrence;
import org.drools.solver.core.score.constraint.ConstraintType;
-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.InstitutionalWeighting;
-import org.drools.solver.examples.itc2007.examination.domain.Period;
-import org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint;
-import org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraintType;
-import org.drools.solver.examples.itc2007.examination.domain.Room;
-import org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint;
-import org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraintType;
-import org.drools.solver.examples.itc2007.examination.domain.Student;
-import org.drools.solver.examples.itc2007.examination.domain.Topic;
-import org.drools.solver.examples.itc2007.examination.domain.TopicConflict;
+import org.drools.solver.examples.patientadmissionschedule.domain.AdmissionPart;
+import org.drools.solver.examples.patientadmissionschedule.domain.Bed;
+import org.drools.solver.examples.patientadmissionschedule.domain.BedDesignation;
+import org.drools.solver.examples.patientadmissionschedule.domain.Department;
+import org.drools.solver.examples.patientadmissionschedule.domain.DepartmentSpecialism;
+import org.drools.solver.examples.patientadmissionschedule.domain.Equipment;
+import org.drools.solver.examples.patientadmissionschedule.domain.Gender;
+import org.drools.solver.examples.patientadmissionschedule.domain.GenderLimitation;
+import org.drools.solver.examples.patientadmissionschedule.domain.Night;
+import org.drools.solver.examples.patientadmissionschedule.domain.Patient;
+import org.drools.solver.examples.patientadmissionschedule.domain.PatientAdmissionSchedule;
+import org.drools.solver.examples.patientadmissionschedule.domain.PreferredPatientEquipment;
+import org.drools.solver.examples.patientadmissionschedule.domain.RequiredPatientEquipment;
+import org.drools.solver.examples.patientadmissionschedule.domain.Room;
+import org.drools.solver.examples.patientadmissionschedule.domain.RoomEquipment;
+import org.drools.solver.examples.patientadmissionschedule.domain.RoomSpecialism;
+import org.drools.solver.examples.patientadmissionschedule.domain.Specialism;
+import org.drools.solver.examples.patientadmissionschedule.domain.solver.AdmissionPartConflict;
global HardAndSoftConstraintScoreCalculator scoreCalculator;
@@ -24,113 +30,18 @@
// Hard constraints
// ############################################################################
-// Two exams in the same period which share students.
-rule "conflictingExamsInSamePeriod"
+// Two admissionParts in the same bed for a number of nights.
+rule "conflictingBedDesignationInSameNight"
when
- $topicConflict : TopicConflict($leftTopic : leftTopic, $rightTopic : rightTopic);
- $leftExam : Exam(topic == $leftTopic, $period : period);
- $rightExam : Exam(topic == $rightTopic, period == $period);
+ $admissionPartConflict : AdmissionPartConflict($leftAdmissionPart : leftAdmissionPart, $rightAdmissionPart : rightAdmissionPart);
+ $leftBedDesignation : BedDesignation(admissionPart == $leftAdmissionPart, $bed : bed);
+ $rightBedDesignation : BedDesignation(admissionPart == $rightAdmissionPart, bed == $bed);
then
- insertLogical(new IntConstraintOccurrence("conflictingExamsInSamePeriod", ConstraintType.NEGATIVE_HARD,
- $topicConflict.getStudentSize(),
- $leftExam, $rightExam));
+ insertLogical(new IntConstraintOccurrence("conflictingBedDesignationInSameNight", ConstraintType.NEGATIVE_HARD,
+ $admissionPartConflict.getNightSize(),
+ $leftBedDesignation, $rightBedDesignation));
end
-// More time required during a period than available in that period.
-rule "periodDurationTooShort"
- when
- $exam : Exam(eval(topicDuration > periodDuration));
- then
- insertLogical(new IntConstraintOccurrence("periodDurationTooShort", ConstraintType.NEGATIVE_HARD,
- $exam.getTopicStudentSize(),
- $exam));
-end
-
-// More seating required during a period in a room than available in that room.
-rule "roomCapacityTooSmall" // TODO improve performance, as it takes 50% of the performance
- when
- $period : Period();
- $room : Room($capacity : capacity);
- $totalStudentSize : Number(intValue > $capacity) from accumulate(
- Exam(period == $period, room == $room, $studentSize : topicStudentSize),
- sum($studentSize) // Vote for http://jira.jboss.com/jira/browse/JBRULES-1075
- );
- // HACK to fix wierd truth maintance behavior in drools
- // because making weight part of the equals/hashcode doesn't cut it
- not IntConstraintOccurrence(
- ruleId == "roomCapacityTooSmall",
- constraintType == ConstraintType.NEGATIVE_HARD,
- causes contains $period, causes contains $room,
- eval(weight != ($totalStudentSize.intValue() - $capacity))
- );
- then
- insertLogical(new IntConstraintOccurrence("roomCapacityTooSmall", ConstraintType.NEGATIVE_HARD,
- ($totalStudentSize.intValue() - $capacity),
- $period, $room));
-end
-
-// Period hard constraints
-rule "periodHardConstraintExamCoincidence"
- when
- $periodHardConstraint : PeriodHardConstraint(
- periodHardConstraintType == PeriodHardConstraintType.EXAM_COINCIDENCE,
- $leftSideTopic : leftSideTopic,
- $rightSideTopic : rightSideTopic
- );
- $leftExam : Exam(topic == $leftSideTopic, $leftSidePeriod : period);
- $rightExam : Exam(topic == $rightSideTopic, period != $leftSidePeriod);
- // LeftSide and rightSide don't share a student because those are filtered out in the InputConvertor
- then
- insertLogical(new IntConstraintOccurrence("periodHardConstraintExamCoincidence", ConstraintType.NEGATIVE_HARD,
- ($leftSideTopic.getStudentSize() + $rightSideTopic.getStudentSize()),
- $leftExam, $rightExam));
-end
-rule "periodHardConstraintExclusion"
- when
- $periodHardConstraint : PeriodHardConstraint(
- periodHardConstraintType == PeriodHardConstraintType.EXCLUSION,
- $leftSideTopic : leftSideTopic,
- $rightSideTopic : rightSideTopic
- );
- $leftExam : Exam(topic == $leftSideTopic, $leftSidePeriod : period);
- $rightExam : Exam(topic == $rightSideTopic, period == $leftSidePeriod);
- then
- insertLogical(new IntConstraintOccurrence("periodHardConstraintExclusion", ConstraintType.NEGATIVE_HARD,
- ($leftSideTopic.getStudentSize() + $rightSideTopic.getStudentSize()),
- $leftExam, $rightExam));
-end
-rule "periodHardConstraintAfter"
- when
- $periodHardConstraint : PeriodHardConstraint(
- periodHardConstraintType == PeriodHardConstraintType.AFTER,
- $leftSideTopic : leftSideTopic,
- $rightSideTopic : rightSideTopic
- );
- $leftExam : Exam(topic == $leftSideTopic, $afterSidePeriod : period);
- $rightExam : Exam(topic == $rightSideTopic, eval($afterSidePeriod.getPeriodIndex() <= period.getPeriodIndex()),
- $beforeSidePeriod : period
- );
- then
- insertLogical(new IntConstraintOccurrence("periodHardConstraintAfter", ConstraintType.NEGATIVE_HARD,
- ($leftSideTopic.getStudentSize() + $rightSideTopic.getStudentSize()),
- $leftExam, $rightExam));
-end
-
-// Room hard constraints
-rule "roomHardConstraintExclusive"
- when
- $roomHardConstraint : RoomHardConstraint(
- roomHardConstraintType == RoomHardConstraintType.ROOM_EXCLUSIVE,
- $topic : topic
- );
- $leftExam : Exam(topic == $topic, $room : room);
- $rightExam : Exam(room == $room, topic != $topic, $otherTopic : topic);
- then
- insertLogical(new IntConstraintOccurrence("roomHardConstraintExclusive", ConstraintType.NEGATIVE_HARD,
- ($topic.getStudentSize() + $otherTopic.getStudentSize()),
- $leftExam, $rightExam));
-end
-
// Accumulate hard constraints
rule "hardConstraintsBroken"
salience -1 // Finish the other rules first (optional, for performance)
@@ -147,110 +58,6 @@
// Soft constraints
// ############################################################################
-// Two exams in a row which share students
-rule "twoExamsInARow"
- when
- $institutionalWeighting : InstitutionalWeighting(twoInARowPenality != 0);
- $topicConflict : TopicConflict($leftTopic : leftTopic, $rightTopic : rightTopic);
- $leftExam : Exam(topic == $leftTopic, $leftPeriod : period);
- $rightExam : Exam(topic == $rightTopic, $rightPeriod : period);
- eval($leftPeriod.getDayIndex() == $rightPeriod.getDayIndex());
- eval(Math.abs($leftPeriod.getPeriodIndex() - $rightPeriod.getPeriodIndex()) == 1);
- then
- insertLogical(new IntConstraintOccurrence("twoExamsInARow", ConstraintType.NEGATIVE_SOFT,
- $topicConflict.getStudentSize() * $institutionalWeighting.getTwoInARowPenality(),
- $leftExam, $rightExam));
-end
-
-// TODO check if merging twoExamsInARow and twoExamsInADay can be a noticable performance boost
-// Two exams in a day which share students
-rule "twoExamsInADay"
- when
- $institutionalWeighting : InstitutionalWeighting(twoInADayPenality != 0);
- $topicConflict : TopicConflict($leftTopic : leftTopic, $rightTopic : rightTopic);
- $leftExam : Exam(topic == $leftTopic, $leftPeriod : period);
- $rightExam : Exam(topic == $rightTopic, $rightPeriod : period);
- eval($leftPeriod.getDayIndex() == $rightPeriod.getDayIndex());
- eval(Math.abs($leftPeriod.getPeriodIndex() - $rightPeriod.getPeriodIndex()) > 1);
- then
- insertLogical(new IntConstraintOccurrence("twoExamsInADay", ConstraintType.NEGATIVE_SOFT,
- $topicConflict.getStudentSize() * $institutionalWeighting.getTwoInADayPenality(),
- $leftExam, $rightExam));
-end
-
-// Exams which share students have to few periods between them
-rule "periodSpread"
- when
- $institutionalWeighting : InstitutionalWeighting(periodSpreadPenality != 0);
- $topicConflict : TopicConflict($leftTopic : leftTopic, $rightTopic : rightTopic);
- $leftExam : Exam(topic == $leftTopic, $leftPeriod : period);
- $rightExam : Exam(topic == $rightTopic, $rightPeriod : period);
- eval(Math.abs($leftPeriod.getPeriodIndex() - $rightPeriod.getPeriodIndex())
- < ($institutionalWeighting.getPeriodSpreadLength() + 1));
- then
- insertLogical(new IntConstraintOccurrence("periodSpread", ConstraintType.NEGATIVE_SOFT,
- $topicConflict.getStudentSize() * $institutionalWeighting.getPeriodSpreadPenality(),
- $leftExam, $rightExam));
-end
-
-// Several exams in the same room and period have different durations
-rule "mixedDurations"
- when
- $institutionalWeighting : InstitutionalWeighting(mixedDurationPenality != 0);
- $leftExam : Exam($leftId : id, $period : period, room != null, $room : room, $leftTopic : topic);
- // 4 mixed durations of 100, 150, 200 and 200 should only result in 2 penalty's (for 100&150 and 100&200)
- // leftExam has lowest id of the period+room combo
- not Exam(period == $period, room == $room, id < $leftId);
- // rightExam has a different duration
- $rightExam : Exam(period == $period, room == $room, id > $leftId,
- eval(topic.getDuration() != $leftTopic.getDuration()),
- $rightId : id, $rightTopic : topic
- );
- // rightExam has the lowest id of the period+room+rightDuration combo
- not Exam(period == $period, room == $room, id < $rightId,
- eval(topic.getDuration() == $rightTopic.getDuration())
- );
- then
- insertLogical(new IntConstraintOccurrence("mixedDurations", ConstraintType.NEGATIVE_SOFT,
- $institutionalWeighting.getMixedDurationPenality(),
- $leftExam, $rightExam));
-end
-
-// Larger Exams towards the beginning of the examination session
-rule "frontLoad"
- when
- $institutionalWeighting : InstitutionalWeighting(frontLoadPenality != 0);
- $topic : Topic(frontLoadLarge == true);
- $period : Period(frontLoadLast == true);
- $exam : Exam(topic == $topic, period == $period);
- then
- insertLogical(new IntConstraintOccurrence("frontLoad", ConstraintType.NEGATIVE_SOFT,
- $institutionalWeighting.getFrontLoadPenality(),
- $exam));
-end
-
-// Period Penalty
-rule "periodPenalty"
- when
- $period : Period(penalty != 0);
- $exam: Exam(period == $period);
- then
- insertLogical(new IntConstraintOccurrence("periodPenalty", ConstraintType.NEGATIVE_SOFT,
- $period.getPenalty(),
- $exam));
-end
-
-// Room Penalty
-rule "roomPenalty"
- when
- $room : Room(penalty != 0);
- $exam: Exam(room == $room);
- then
- insertLogical(new IntConstraintOccurrence("roomPenalty", ConstraintType.NEGATIVE_SOFT,
- $room.getPenalty(),
- $exam));
-end
-
// Accumulate soft constraints
rule "softConstraintsBroken"
salience -1 // Finish the other rules first (optional, for performance)
More information about the jboss-svn-commits
mailing list