[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