[jboss-svn-commits] JBL Code SVN: r16289 - in labs/jbossrules/trunk/drools-solver/drools-solver-examples: src/main/java/org/drools/solver/examples/common/business and 3 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Fri Nov 2 11:53:57 EDT 2007
Author: ge0ffrey
Date: 2007-11-02 11:53:57 -0400 (Fri, 02 Nov 2007)
New Revision: 16289
Added:
labs/jbossrules/trunk/drools-solver/drools-solver-examples/data/itc2007/examination/unsolved/constraint_test_set.xml
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/PeriodChangeMove.java
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/RoomChangeMove.java
Modified:
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/common/business/SolutionBusiness.java
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/swingui/ExaminationPanel.java
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationScoreRules.drl
Log:
period and room change move
Added: labs/jbossrules/trunk/drools-solver/drools-solver-examples/data/itc2007/examination/unsolved/constraint_test_set.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/data/itc2007/examination/unsolved/constraint_test_set.xml (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/data/itc2007/examination/unsolved/constraint_test_set.xml 2007-11-02 15:53:57 UTC (rev 16289)
@@ -0,0 +1,116 @@
+<org.drools.solver.examples.itc2007.examination.domain.Examination id="1">
+ <id>0</id>
+ <institutionalWeighting id="2">
+ <twoInARowPenality>7</twoInARowPenality>
+ <twoInADayPenality>5</twoInADayPenality>
+ <periodSpreadPenality>5</periodSpreadPenality>
+ <mixedDurationPenality>10</mixedDurationPenality>
+ <frontLoadLargestExamSize>100</frontLoadLargestExamSize>
+ <frontLoadLastPeriodSize>30</frontLoadLastPeriodSize>
+ <frontLoadPenality>5</frontLoadPenality>
+ </institutionalWeighting>
+ <studentList id="3">
+ <org.drools.solver.examples.itc2007.examination.domain.Student id="30">
+ <id>0</id>
+ </org.drools.solver.examples.itc2007.examination.domain.Student>
+ <org.drools.solver.examples.itc2007.examination.domain.Student id="31">
+ <id>1</id>
+ </org.drools.solver.examples.itc2007.examination.domain.Student>
+ <org.drools.solver.examples.itc2007.examination.domain.Student id="32">
+ <id>2</id>
+ </org.drools.solver.examples.itc2007.examination.domain.Student>
+ </studentList>
+ <topicList id="4">
+ <org.drools.solver.examples.itc2007.examination.domain.Topic id="40">
+ <id>0</id>
+ <duration>195</duration>
+ <studentList id="7889">
+ <org.drools.solver.examples.itc2007.examination.domain.Student reference="30"/>
+ <org.drools.solver.examples.itc2007.examination.domain.Student reference="31"/>
+ </studentList>
+ </org.drools.solver.examples.itc2007.examination.domain.Topic>
+ <org.drools.solver.examples.itc2007.examination.domain.Topic id="41">
+ <id>1</id>
+ <duration>135</duration>
+ <studentList id="7891">
+ <org.drools.solver.examples.itc2007.examination.domain.Student reference="30"/>
+ <org.drools.solver.examples.itc2007.examination.domain.Student reference="31"/>
+ </studentList>
+ </org.drools.solver.examples.itc2007.examination.domain.Topic>
+ <org.drools.solver.examples.itc2007.examination.domain.Topic id="42">
+ <id>2</id>
+ <duration>135</duration>
+ <studentList id="7891">
+ <org.drools.solver.examples.itc2007.examination.domain.Student reference="30"/>
+ <org.drools.solver.examples.itc2007.examination.domain.Student reference="31"/>
+ <org.drools.solver.examples.itc2007.examination.domain.Student reference="32"/>
+ </studentList>
+ </org.drools.solver.examples.itc2007.examination.domain.Topic>
+ </topicList>
+ <periodList id="5">
+ <org.drools.solver.examples.itc2007.examination.domain.Period id="50">
+ <id>0</id>
+ <startDateTimeString>15:04:2005 09:30:00</startDateTimeString>
+ <dateInDays>1930</dateInDays>
+ <startTimeInMinutes>570</startTimeInMinutes>
+ <durationInMinutes>210</durationInMinutes>
+ <penalty>0</penalty>
+ </org.drools.solver.examples.itc2007.examination.domain.Period>
+ <org.drools.solver.examples.itc2007.examination.domain.Period id="51">
+ <id>1</id>
+ <startDateTimeString>15:04:2005 14:00:00</startDateTimeString>
+ <dateInDays>1931</dateInDays>
+ <startTimeInMinutes>840</startTimeInMinutes>
+ <durationInMinutes>210</durationInMinutes>
+ <penalty>0</penalty>
+ </org.drools.solver.examples.itc2007.examination.domain.Period>
+ <org.drools.solver.examples.itc2007.examination.domain.Period id="52">
+ <id>2</id>
+ <startDateTimeString>18:04:2005 09:30:00</startDateTimeString>
+ <dateInDays>1933</dateInDays>
+ <startTimeInMinutes>570</startTimeInMinutes>
+ <durationInMinutes>210</durationInMinutes>
+ <penalty>0</penalty>
+ </org.drools.solver.examples.itc2007.examination.domain.Period>
+ </periodList>
+ <roomList id="6">
+ <org.drools.solver.examples.itc2007.examination.domain.Room id="60">
+ <id>0</id>
+ <capacity>260</capacity>
+ <penalty>0</penalty>
+ </org.drools.solver.examples.itc2007.examination.domain.Room>
+ <org.drools.solver.examples.itc2007.examination.domain.Room id="61">
+ <id>1</id>
+ <capacity>100</capacity>
+ <penalty>0</penalty>
+ </org.drools.solver.examples.itc2007.examination.domain.Room>
+ </roomList>
+ <periodHardConstraintList id="7">
+ <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="70">
+ <periodHardConstraintType>AFTER</periodHardConstraintType>
+ <leftSideTopic reference="41"/>
+ <rightSideTopic reference="42"/>
+ </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
+ </periodHardConstraintList>
+ <roomHardConstraintList id="8"/>
+ <examList id="7">
+ <org.drools.solver.examples.itc2007.examination.domain.Exam id="70">
+ <id>0</id>
+ <topic reference="40"/>
+ <period reference="50"/>
+ <room reference="60"/>
+ </org.drools.solver.examples.itc2007.examination.domain.Exam>
+ <org.drools.solver.examples.itc2007.examination.domain.Exam id="71">
+ <id>1</id>
+ <topic reference="41"/>
+ <period reference="50"/>
+ <room reference="60"/>
+ </org.drools.solver.examples.itc2007.examination.domain.Exam>
+ <org.drools.solver.examples.itc2007.examination.domain.Exam id="72">
+ <id>2</id>
+ <topic reference="42"/>
+ <period reference="50"/>
+ <room reference="61"/>
+ </org.drools.solver.examples.itc2007.examination.domain.Exam>
+ </examList>
+</org.drools.solver.examples.itc2007.examination.domain.Examination>
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/common/business/SolutionBusiness.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/common/business/SolutionBusiness.java 2007-11-02 12:46:54 UTC (rev 16288)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/common/business/SolutionBusiness.java 2007-11-02 15:53:57 UTC (rev 16289)
@@ -86,7 +86,11 @@
}
public void doMove(Move move) {
- logger.info("Doing user move ({})", move);
+ if (!move.isMoveDoable(evaluationHandler.getStatefulSession())) {
+ logger.info("Not doing user move ({}) because it is not doable.", move);
+ return;
+ }
+ logger.info("Doing user move ({}).", move);
move.doMove(evaluationHandler.getStatefulSession());
}
Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/PeriodChangeMove.java (from rev 15967, labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/solver/TimeslotChangeMove.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/PeriodChangeMove.java (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/PeriodChangeMove.java 2007-11-02 15:53:57 UTC (rev 16289)
@@ -0,0 +1,75 @@
+package org.drools.solver.examples.itc2007.examination.solver;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.drools.FactHandle;
+import org.drools.WorkingMemory;
+import org.drools.solver.core.localsearch.decider.accepter.tabu.TabuPropertyEnabled;
+import org.drools.solver.core.move.Move;
+import org.drools.solver.examples.itc2007.examination.domain.Exam;
+import org.drools.solver.examples.itc2007.examination.domain.Period;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class PeriodChangeMove implements Move, TabuPropertyEnabled {
+
+ private Exam exam;
+ private Period toPeriod;
+
+ public PeriodChangeMove(Exam exam, Period toPeriod) {
+ this.exam = exam;
+ this.toPeriod = toPeriod;
+ }
+
+ public boolean isMoveDoable(WorkingMemory workingMemory) {
+ Period fromPeriod = exam.getPeriod();
+ if (fromPeriod == null) {
+ return (toPeriod != null);
+ }
+ return !fromPeriod.equals(toPeriod);
+ }
+
+ public Move createUndoMove(WorkingMemory workingMemory) {
+ return new PeriodChangeMove(exam, exam.getPeriod());
+ }
+
+ public void doMove(WorkingMemory workingMemory) {
+ FactHandle lessonHandle = workingMemory.getFactHandle(exam);
+ exam.setPeriod(toPeriod);
+ workingMemory.update(lessonHandle, exam);
+ }
+
+ public List<? extends Object> getTabuPropertyList() {
+ return Collections.singletonList(exam);
+ }
+
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ } else if (o instanceof PeriodChangeMove) {
+ PeriodChangeMove other = (PeriodChangeMove) o;
+ return new EqualsBuilder()
+ .append(exam, other.exam)
+ .append(toPeriod, other.toPeriod)
+ .isEquals();
+ } else {
+ return false;
+ }
+ }
+
+ public int hashCode() {
+ return new HashCodeBuilder()
+ .append(exam)
+ .append(toPeriod)
+ .toHashCode();
+ }
+
+ public String toString() {
+ return exam + " => " + toPeriod;
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/RoomChangeMove.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/RoomChangeMove.java (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/RoomChangeMove.java 2007-11-02 15:53:57 UTC (rev 16289)
@@ -0,0 +1,75 @@
+package org.drools.solver.examples.itc2007.examination.solver;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.drools.FactHandle;
+import org.drools.WorkingMemory;
+import org.drools.solver.core.localsearch.decider.accepter.tabu.TabuPropertyEnabled;
+import org.drools.solver.core.move.Move;
+import org.drools.solver.examples.itc2007.examination.domain.Exam;
+import org.drools.solver.examples.itc2007.examination.domain.Room;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class RoomChangeMove implements Move, TabuPropertyEnabled {
+
+ private Exam exam;
+ private Room toRoom;
+
+ public RoomChangeMove(Exam exam, Room toRoom) {
+ this.exam = exam;
+ this.toRoom = toRoom;
+ }
+
+ public boolean isMoveDoable(WorkingMemory workingMemory) {
+ Room fromRoom = exam.getRoom();
+ if (fromRoom == null) {
+ return (toRoom != null);
+ }
+ return !fromRoom.equals(toRoom);
+ }
+
+ public Move createUndoMove(WorkingMemory workingMemory) {
+ return new RoomChangeMove(exam, exam.getRoom());
+ }
+
+ public void doMove(WorkingMemory workingMemory) {
+ FactHandle lessonHandle = workingMemory.getFactHandle(exam);
+ exam.setRoom(toRoom);
+ workingMemory.update(lessonHandle, exam);
+ }
+
+ public List<? extends Object> getTabuPropertyList() {
+ return Collections.singletonList(exam);
+ }
+
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ } else if (o instanceof PeriodChangeMove) {
+ RoomChangeMove other = (RoomChangeMove) o;
+ return new EqualsBuilder()
+ .append(exam, other.exam)
+ .append(toRoom, other.toRoom)
+ .isEquals();
+ } else {
+ return false;
+ }
+ }
+
+ public int hashCode() {
+ return new HashCodeBuilder()
+ .append(exam)
+ .append(toRoom)
+ .toHashCode();
+ }
+
+ public String toString() {
+ return exam + " => " + toRoom;
+ }
+
+}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/swingui/ExaminationPanel.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/swingui/ExaminationPanel.java 2007-11-02 12:46:54 UTC (rev 16288)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/swingui/ExaminationPanel.java 2007-11-02 15:53:57 UTC (rev 16289)
@@ -4,12 +4,15 @@
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;
+import javax.swing.JComboBox;
import javax.swing.JLabel;
+import javax.swing.JOptionPane;
import javax.swing.JPanel;
import org.drools.solver.examples.common.swingui.SolutionPanel;
@@ -17,6 +20,8 @@
import org.drools.solver.examples.itc2007.examination.domain.Examination;
import org.drools.solver.examples.itc2007.examination.domain.Period;
import org.drools.solver.examples.itc2007.examination.domain.Room;
+import org.drools.solver.examples.itc2007.examination.solver.PeriodChangeMove;
+import org.drools.solver.examples.itc2007.examination.solver.RoomChangeMove;
/**
* @author Geoffrey De Smet
@@ -106,18 +111,24 @@
}
public void actionPerformed(ActionEvent e) {
- // TODO
-// List<Day> dayList = getExamination().getDayList();
-// JComboBox dayListField = new JComboBox(dayList.toArray());
-// dayListField.setSelectedItem(match.getDay());
-// int result = JOptionPane.showConfirmDialog(ExaminationPanel.this, dayListField, "Select day",
-// JOptionPane.OK_CANCEL_OPTION);
-// if (result == JOptionPane.OK_OPTION) {
-// Day toDay = (Day) dayListField.getSelectedItem();
-// Move move = new DayChangeMove(match, toDay);
-// solutionBusiness.doMove(move);
-// workflowFrame.updateScreen();
-// }
+ JPanel listFieldsPanel = new JPanel(new GridLayout(2, 1));
+ List<Period> periodList = getExamination().getPeriodList();
+ JComboBox periodListField = new JComboBox(periodList.toArray());
+ periodListField.setSelectedItem(exam.getPeriod());
+ listFieldsPanel.add(periodListField);
+ List<Room> roomList = getExamination().getRoomList();
+ JComboBox roomListField = new JComboBox(roomList.toArray());
+ roomListField.setSelectedItem(exam.getRoom());
+ listFieldsPanel.add(roomListField);
+ int result = JOptionPane.showConfirmDialog(ExaminationPanel.this, listFieldsPanel, "Select period and room",
+ JOptionPane.OK_CANCEL_OPTION);
+ if (result == JOptionPane.OK_OPTION) {
+ Period toPeriod = (Period) periodListField.getSelectedItem();
+ solutionBusiness.doMove(new PeriodChangeMove(exam, toPeriod));
+ Room toRoom = (Room) roomListField.getSelectedItem();
+ solutionBusiness.doMove(new RoomChangeMove(exam, toRoom));
+ workflowFrame.updateScreen();
+ }
}
}
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-11-02 12:46:54 UTC (rev 16288)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationScoreRules.drl 2007-11-02 15:53:57 UTC (rev 16289)
@@ -17,4 +17,47 @@
global HardAndSoftConstraintScoreCalculator scoreCalculator;
+//Conflicts: Two conflicting exams in the same period.
+rule "conflictingExamsInSamePeriod"
+ when
+ $student : Student();
+ $exam : Exam($id : id, topic.studentList contains $student, $period : period);
+ Exam(id > $id, topic.studentList contains $student, period == $period);
+ then
+ insertLogical(new WorkaroundMultiplePatternAccumulate("conflictingExamsInSamePeriod", $exam));
+end
+
+//RoomOccupancy: More seating required in any individual period than that available.
+//
+//PeriodUtilisation: More time required in any individual period than that available.
+//
+//PeriodRelated: Ordering requirements not obeyed.
+//
+//RoomRelated: Room requirements not obeyed
+
+
+rule "hardConstraintsBroken"
+ salience -1 // Finish the other rules first (optional, for performance)
+ when
+ $hardCount : Number() from accumulate(
+ $w : WorkaroundMultiplePatternAccumulate(),
+ // countInteger($w) // Vote for http://jira.jboss.com/jira/browse/JBRULES-1075
+ count($w) // Vote for http://jira.jboss.com/jira/browse/JBRULES-1075
+ );
+ then
+ scoreCalculator.setHardConstraintsBroken($hardCount.intValue());
+end
// TODO implement me
+//Two Exams in a Row
+//
+//Two Exams in a Day
+//
+//Period Spread
+//
+//Mixed Durations
+//
+//Larger Exams Constraints
+//
+//Room Penalty
+//
+//Period Penalty
More information about the jboss-svn-commits
mailing list