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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Jun 27 12:02:01 EDT 2009


Author: ge0ffrey
Date: 2009-06-27 12:02:01 -0400 (Sat, 27 Jun 2009)
New Revision: 27196

Added:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/benchmark/
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver/
   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/patientAdmissionScheduleSolverConfig.xml
Removed:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionscheduling/
Log:
pas: scheduling rename to schedule + basic plumbing

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule (from rev 27151, labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionscheduling)

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/benchmark (from rev 27156, labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionscheduling/benchmark)

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver (from rev 27156, labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionscheduling/solver)

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleScoreRules.drl (from rev 27151, 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/patientadmissionschedule/solver/patientAdmissionScheduleScoreRules.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleScoreRules.drl	2009-06-27 16:02:01 UTC (rev 27196)
@@ -0,0 +1,264 @@
+package org.drools.solver.examples.itc2007.examination.solver;
+    dialect "java"
+
+import org.drools.solver.core.score.calculator.HardAndSoftConstraintScoreCalculator;
+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;
+
+global HardAndSoftConstraintScoreCalculator scoreCalculator;
+
+// ############################################################################
+// Hard constraints
+// ############################################################################
+
+// Two exams in the same period which share students.
+rule "conflictingExamsInSamePeriod"
+    when
+        $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,
+                $topicConflict.getStudentSize(),
+                $leftExam, $rightExam));
+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)
+    when
+        $hardTotal : Number() from accumulate(
+            IntConstraintOccurrence(constraintType == ConstraintType.NEGATIVE_HARD, $weight : weight),
+            sum($weight) // Vote for http://jira.jboss.com/jira/browse/JBRULES-1075
+        );
+    then
+        scoreCalculator.setHardConstraintsBroken($hardTotal.intValue());
+end
+
+// ############################################################################
+// 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)
+    when
+        $softTotal : Number() from accumulate(
+            IntConstraintOccurrence(constraintType == ConstraintType.NEGATIVE_SOFT, $weight : weight),
+            sum($weight) // Vote for http://jira.jboss.com/jira/browse/JBRULES-1075
+        );
+    then
+        scoreCalculator.setSoftConstraintsBroken($softTotal.intValue());
+end

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleSolverConfig.xml (from rev 27151, labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleSolverConfig.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleSolverConfig.xml	2009-06-27 16:02:01 UTC (rev 27196)
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<localSearchSolver>
+    <scoreDrl>/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleScoreRules.drl</scoreDrl>
+    <scoreDefinition>
+        <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>
+    </scoreDefinition>
+    <startingSolutionInitializerClass>org.drools.solver.examples.patientadmissionschedule.solver.solution.initializer.PatientAdmissionScheduleStartingSolutionInitializer</startingSolutionInitializerClass>
+    <finish>
+        <maximumMinutesSpend>5</maximumMinutesSpend>
+    </finish>
+    <!--<deciderScoreComparatorFactory>-->
+        <!--<deciderScoreComparatorFactoryType>SHIFTING_HARD_PENALTY</deciderScoreComparatorFactoryType>-->
+        <!--<hardScoreActivationThreshold>0</hardScoreActivationThreshold>-->
+        <!--<successiveNoHardChangeMinimum>2</successiveNoHardChangeMinimum>-->
+        <!--<successiveNoHardChangeMaximum>20</successiveNoHardChangeMaximum>-->
+        <!--<successiveNoHardChangeRepetitionMultiplicand>20.0</successiveNoHardChangeRepetitionMultiplicand>-->
+        <!--<hardWeightSurvivalRatio>0.2</hardWeightSurvivalRatio>-->
+        <!--<startingHardWeight>1000</startingHardWeight>-->
+    <!--</deciderScoreComparatorFactory>-->
+    <selector>
+        <selector>
+            <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>
+            <relativeSelection>0.002</relativeSelection>
+        </selector>
+        <selector>
+            <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.move.factory.RoomChangeMoveFactory</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>
+    <accepter>
+        <completeSolutionTabuSize>1000</completeSolutionTabuSize>
+        <completePropertyTabuSize>7</completePropertyTabuSize>
+    </accepter>
+    <forager>
+        <foragerType>FIRST_BEST_SCORE_IMPROVING</foragerType>
+    </forager>
+</localSearchSolver>
+        
\ No newline at end of file




More information about the jboss-svn-commits mailing list