[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