[jboss-svn-commits] JBL Code SVN: r17413 - in labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main: resources/org/drools/solver/examples/itc2007/examination/solver and 1 other directory.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Thu Dec 27 11:30:06 EST 2007
Author: ge0ffrey
Date: 2007-12-27 11:30:06 -0500 (Thu, 27 Dec 2007)
New Revision: 17413
Added:
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/TopicConflict.java
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/resources/org/drools/solver/examples/itc2007/examination/solver/examinationScoreRules.drl
Log:
usage of topicconflict for faster score calculation
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 2007-12-27 15:55:22 UTC (rev 17412)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Examination.java 2007-12-27 16:30:06 UTC (rev 17413)
@@ -101,6 +101,24 @@
facts.addAll(periodHardConstraintList);
facts.addAll(roomHardConstraintList);
facts.addAll(examList);
+ // A faster alternative to the insertLogicalTopicConflicts rule.
+ List<TopicConflict> topicConflictList = new ArrayList<TopicConflict>();
+ for (Topic leftTopic : topicList) {
+ for (Topic rightTopic : topicList) {
+ if (leftTopic.getId() < rightTopic.getId()) {
+ int studentSize = 0;
+ for (Student student : leftTopic.getStudentList()) {
+ if (rightTopic.getStudentList().contains(student)) {
+ studentSize++;
+ }
+ }
+ if (studentSize > 0) {
+ topicConflictList.add(new TopicConflict(leftTopic, rightTopic, studentSize));
+ }
+ }
+ }
+ }
+ facts.addAll(topicConflictList);
return facts;
}
Added: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/TopicConflict.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/TopicConflict.java (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/TopicConflict.java 2007-12-27 16:30:06 UTC (rev 17413)
@@ -0,0 +1,88 @@
+package org.drools.solver.examples.itc2007.examination.domain;
+
+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;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class TopicConflict implements Serializable {
+
+ private Topic leftTopic;
+ 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;
+ this.studentSize = studentSize;
+ }
+
+ public Topic getLeftTopic() {
+ return leftTopic;
+ }
+
+ public void setLeftTopic(Topic leftTopic) {
+ this.leftTopic = leftTopic;
+ }
+
+ public Topic getRightTopic() {
+ return rightTopic;
+ }
+
+ public void setRightTopic(Topic rightTopic) {
+ this.rightTopic = rightTopic;
+ }
+
+ public int getStudentSize() {
+ return studentSize;
+ }
+
+ public void setStudentSize(int studentSize) {
+ this.studentSize = studentSize;
+ }
+
+ // TODO decide to keep or remove this object logicallyAsserted
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ } else if (o instanceof TopicConflict) {
+ TopicConflict other = (TopicConflict) o;
+ return new EqualsBuilder()
+ .append(leftTopic, other.leftTopic)
+ .append(rightTopic, other.rightTopic)
+ .isEquals();
+ } else {
+ return false;
+ }
+ }
+
+ // TODO decide to keep or remove this object logicallyAsserted
+ public int hashCode() {
+ return new HashCodeBuilder()
+ .append(leftTopic)
+ .append(rightTopic)
+ .toHashCode();
+ }
+
+ public int compareTo(TopicConflict other) {
+ return new CompareToBuilder()
+ .append(leftTopic, other.leftTopic)
+ .append(rightTopic, other.rightTopic)
+ .toComparison();
+ }
+
+ @Override
+ public String toString() {
+ return leftTopic + " & " + rightTopic + " = " + studentSize;
+ }
+
+}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationScoreRules.drl
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationScoreRules.drl 2007-12-27 15:55:22 UTC (rev 17412)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationScoreRules.drl 2007-12-27 16:30:06 UTC (rev 17413)
@@ -16,11 +16,35 @@
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 java.util.HashSet;
global HardAndSoftConstraintScoreCalculator scoreCalculator;
+// This rule has horrible performance, scalability and memory consumption
+// It proved to be much better to do with basic java in the Examination.getFacts() method.
+//rule "insertLogicalTopicConflicts"
+// when
+// $leftTopic : Topic($id : id, $leftStudentList : studentList);
+// $rightTopic : Topic(id > $id, $rightStudentList : studentList);
+// // collect based implementation:
+// $studentSet : HashSet( size > 0 )
+// from collect(
+// Student( this memberOf $leftStudentList, this memberOf $rightStudentList)
+// );
+// // accumulate based implementation:
+// //$studentSize : Number(intValue > 0) from accumulate(
+// // $student : Student(this memberOf $leftStudentList, this memberOf $rightStudentList),
+// // count($student)
+// //);
+// then
+// // collect based implementation:
+// insertLogical(new TopicConflict($leftTopic, $rightTopic, $studentSet.size()));
+// // accumulate based implementation:
+// // insertLogical(new TopicConflict($leftTopic, $rightTopic, $studentSize.intValue()));
+//end
+
// ############################################################################
// Hard constraints
// ############################################################################
@@ -28,12 +52,9 @@
// Two exams in the same period which share students.
rule "conflictingExamsInSamePeriod"
when
- $leftExam : Exam($id : id, $period : period, $leftStudentList : topic.studentList);
- $rightExam : Exam(period == $period, id > $id, $rightStudentList : topic.studentList);
- $studentSet : HashSet( size > 0 )
- from collect(
- Student( this memberOf $leftStudentList, this memberOf $rightStudentList)
- );
+ $topicConflict : TopicConflict($leftTopic : leftTopic, $rightTopic : rightTopic);
+ $leftExam : Exam(topic == $leftTopic, $period : period);
+ $rightExam : Exam(topic == $rightTopic, period == $period);
then
insertLogical(new IntConstraintOccurrence("conflictingExamsInSamePeriod", ConstraintType.NEGATIVE_HARD,
$leftExam, $rightExam));
More information about the jboss-svn-commits
mailing list