[jboss-svn-commits] JBL Code SVN: r17987 - in labs/jbossrules/trunk/drools-solver/drools-solver-examples: src/main/java/org/drools/solver/examples/itc2007/examination/domain and 4 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Jan 20 12:21:46 EST 2008


Author: ge0ffrey
Date: 2008-01-20 12:21:41 -0500 (Sun, 20 Jan 2008)
New Revision: 17987

Added:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/ExamCoincidence.java
Modified:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/data/itc2007/examination/unsolved/exam_comp_set3.xml
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/data/itc2007/examination/unsolved/exam_comp_set6.xml
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Exam.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Student.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Topic.java
   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/persistence/ExaminationInputConvertor.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/JumpingNeighbourExaminationMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/NeighbourExaminationMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/solution/initializer/ExaminationStartingSolutionInitializer.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationSolverBenchmarkConfig.xml
Log:
working with coincidences: initializing etc

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/data/itc2007/examination/unsolved/exam_comp_set3.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/data/itc2007/examination/unsolved/exam_comp_set3.xml	2008-01-20 16:17:57 UTC (rev 17986)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/data/itc2007/examination/unsolved/exam_comp_set3.xml	2008-01-20 17:21:41 UTC (rev 17987)
@@ -118244,224 +118244,212 @@
       <rightSideTopic reference="17712"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
     <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18472">
-      <id>146</id>
-      <periodHardConstraintType reference="18326"/>
-      <leftSideTopic reference="17742"/>
-      <rightSideTopic reference="17742"/>
-    </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18473">
       <id>147</id>
       <periodHardConstraintType reference="18326"/>
       <leftSideTopic reference="17754"/>
       <rightSideTopic reference="17770"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18474">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18473">
       <id>148</id>
       <periodHardConstraintType reference="18326"/>
       <leftSideTopic reference="17770"/>
       <rightSideTopic reference="17754"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18475">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18474">
       <id>149</id>
       <periodHardConstraintType reference="18326"/>
       <leftSideTopic reference="17796"/>
       <rightSideTopic reference="17798"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18476">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18475">
       <id>150</id>
       <periodHardConstraintType reference="18326"/>
       <leftSideTopic reference="17798"/>
       <rightSideTopic reference="17796"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18477">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18476">
       <id>151</id>
       <periodHardConstraintType reference="18326"/>
       <leftSideTopic reference="17800"/>
       <rightSideTopic reference="17812"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18478">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18477">
       <id>152</id>
       <periodHardConstraintType reference="18326"/>
       <leftSideTopic reference="17802"/>
       <rightSideTopic reference="17814"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18479">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18478">
       <id>153</id>
       <periodHardConstraintType reference="18326"/>
       <leftSideTopic reference="17806"/>
       <rightSideTopic reference="17826"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18480">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18479">
       <id>154</id>
       <periodHardConstraintType reference="18326"/>
       <leftSideTopic reference="17808"/>
       <rightSideTopic reference="17820"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18481">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18480">
       <id>155</id>
       <periodHardConstraintType reference="18326"/>
       <leftSideTopic reference="17810"/>
       <rightSideTopic reference="17822"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18482">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18481">
       <id>156</id>
       <periodHardConstraintType reference="18326"/>
       <leftSideTopic reference="17812"/>
       <rightSideTopic reference="17800"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18483">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18482">
       <id>157</id>
       <periodHardConstraintType reference="18326"/>
       <leftSideTopic reference="17814"/>
       <rightSideTopic reference="17802"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18484">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18483">
       <id>158</id>
       <periodHardConstraintType reference="18326"/>
       <leftSideTopic reference="17820"/>
       <rightSideTopic reference="17808"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18485">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18484">
       <id>159</id>
       <periodHardConstraintType reference="18326"/>
       <leftSideTopic reference="17822"/>
       <rightSideTopic reference="17810"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18486">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18485">
       <id>160</id>
       <periodHardConstraintType reference="18326"/>
       <leftSideTopic reference="17826"/>
       <rightSideTopic reference="17806"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18487">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18486">
       <id>161</id>
-      <periodHardConstraintType id="18488">EXCLUSION</periodHardConstraintType>
+      <periodHardConstraintType id="18487">EXCLUSION</periodHardConstraintType>
       <leftSideTopic reference="17966"/>
       <rightSideTopic reference="17972"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18489">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18488">
       <id>162</id>
-      <periodHardConstraintType reference="18488"/>
+      <periodHardConstraintType reference="18487"/>
       <leftSideTopic reference="17972"/>
       <rightSideTopic reference="17966"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18490">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18489">
       <id>163</id>
-      <periodHardConstraintType id="18491">AFTER</periodHardConstraintType>
+      <periodHardConstraintType id="18490">AFTER</periodHardConstraintType>
       <leftSideTopic reference="18004"/>
       <rightSideTopic reference="18002"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18492">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18491">
       <id>164</id>
-      <periodHardConstraintType reference="18491"/>
+      <periodHardConstraintType reference="18490"/>
       <leftSideTopic reference="18004"/>
       <rightSideTopic reference="18002"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18493">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18492">
       <id>165</id>
       <periodHardConstraintType reference="18326"/>
       <leftSideTopic reference="18014"/>
       <rightSideTopic reference="18042"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18494">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18493">
       <id>166</id>
       <periodHardConstraintType reference="18326"/>
       <leftSideTopic reference="18042"/>
       <rightSideTopic reference="18014"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18495">
-      <id>167</id>
-      <periodHardConstraintType reference="18326"/>
-      <leftSideTopic reference="18188"/>
-      <rightSideTopic reference="18188"/>
-    </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18496">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18494">
       <id>168</id>
       <periodHardConstraintType reference="18326"/>
       <leftSideTopic reference="18192"/>
       <rightSideTopic reference="18194"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18497">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="18495">
       <id>169</id>
       <periodHardConstraintType reference="18326"/>
       <leftSideTopic reference="18194"/>
       <rightSideTopic reference="18192"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
   </periodHardConstraintList>
-  <roomHardConstraintList id="18498">
-    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18499">
+  <roomHardConstraintList id="18496">
+    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18497">
       <id>0</id>
-      <roomHardConstraintType id="18500">ROOM_EXCLUSIVE</roomHardConstraintType>
+      <roomHardConstraintType id="18498">ROOM_EXCLUSIVE</roomHardConstraintType>
       <topic reference="16414"/>
     </org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18501">
+    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18499">
       <id>1</id>
-      <roomHardConstraintType reference="18500"/>
+      <roomHardConstraintType reference="18498"/>
       <topic reference="17480"/>
     </org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18502">
+    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18500">
       <id>2</id>
-      <roomHardConstraintType reference="18500"/>
+      <roomHardConstraintType reference="18498"/>
       <topic reference="17552"/>
     </org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18503">
+    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18501">
       <id>3</id>
-      <roomHardConstraintType reference="18500"/>
+      <roomHardConstraintType reference="18498"/>
       <topic reference="18106"/>
     </org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18504">
+    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18502">
       <id>4</id>
-      <roomHardConstraintType reference="18500"/>
+      <roomHardConstraintType reference="18498"/>
       <topic reference="18108"/>
     </org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18505">
+    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18503">
       <id>5</id>
-      <roomHardConstraintType reference="18500"/>
+      <roomHardConstraintType reference="18498"/>
       <topic reference="18110"/>
     </org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18506">
+    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18504">
       <id>6</id>
-      <roomHardConstraintType reference="18500"/>
+      <roomHardConstraintType reference="18498"/>
       <topic reference="18116"/>
     </org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18507">
+    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18505">
       <id>7</id>
-      <roomHardConstraintType reference="18500"/>
+      <roomHardConstraintType reference="18498"/>
       <topic reference="18118"/>
     </org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18508">
+    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18506">
       <id>8</id>
-      <roomHardConstraintType reference="18500"/>
+      <roomHardConstraintType reference="18498"/>
       <topic reference="18120"/>
     </org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18509">
+    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18507">
       <id>9</id>
-      <roomHardConstraintType reference="18500"/>
+      <roomHardConstraintType reference="18498"/>
       <topic reference="18122"/>
     </org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18510">
+    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18508">
       <id>10</id>
-      <roomHardConstraintType reference="18500"/>
+      <roomHardConstraintType reference="18498"/>
       <topic reference="18124"/>
     </org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18511">
+    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18509">
       <id>11</id>
-      <roomHardConstraintType reference="18500"/>
+      <roomHardConstraintType reference="18498"/>
       <topic reference="18126"/>
     </org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18512">
+    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18510">
       <id>12</id>
-      <roomHardConstraintType reference="18500"/>
+      <roomHardConstraintType reference="18498"/>
       <topic reference="18128"/>
     </org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18513">
+    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18511">
       <id>13</id>
-      <roomHardConstraintType reference="18500"/>
+      <roomHardConstraintType reference="18498"/>
       <topic reference="18220"/>
     </org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18514">
+    <org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint id="18512">
       <id>14</id>
-      <roomHardConstraintType reference="18500"/>
+      <roomHardConstraintType reference="18498"/>
       <topic reference="18222"/>
     </org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint>
   </roomHardConstraintList>

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/data/itc2007/examination/unsolved/exam_comp_set6.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/data/itc2007/examination/unsolved/exam_comp_set6.xml	2008-01-20 16:17:57 UTC (rev 17986)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/data/itc2007/examination/unsolved/exam_comp_set6.xml	2008-01-20 17:21:41 UTC (rev 17987)
@@ -44164,71 +44164,65 @@
       <rightSideTopic reference="8216"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
     <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8438">
-      <id>12</id>
-      <periodHardConstraintType reference="8426"/>
-      <leftSideTopic reference="8218"/>
-      <rightSideTopic reference="8218"/>
-    </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8439">
       <id>13</id>
       <periodHardConstraintType reference="8426"/>
       <leftSideTopic reference="8222"/>
       <rightSideTopic reference="8238"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8440">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8439">
       <id>14</id>
       <periodHardConstraintType reference="8426"/>
       <leftSideTopic reference="8240"/>
       <rightSideTopic reference="8244"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8441">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8440">
       <id>15</id>
       <periodHardConstraintType reference="8426"/>
       <leftSideTopic reference="8246"/>
       <rightSideTopic reference="8254"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8442">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8441">
       <id>16</id>
       <periodHardConstraintType reference="8426"/>
       <leftSideTopic reference="8260"/>
       <rightSideTopic reference="8292"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8443">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8442">
       <id>17</id>
       <periodHardConstraintType reference="8426"/>
       <leftSideTopic reference="8272"/>
       <rightSideTopic reference="8286"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8444">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8443">
       <id>18</id>
       <periodHardConstraintType reference="8426"/>
       <leftSideTopic reference="8294"/>
       <rightSideTopic reference="8312"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8445">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8444">
       <id>19</id>
-      <periodHardConstraintType id="8446">AFTER</periodHardConstraintType>
+      <periodHardConstraintType id="8445">AFTER</periodHardConstraintType>
       <leftSideTopic reference="8216"/>
       <rightSideTopic reference="7920"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8447">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8446">
       <id>20</id>
-      <periodHardConstraintType reference="8446"/>
+      <periodHardConstraintType reference="8445"/>
       <leftSideTopic reference="7980"/>
       <rightSideTopic reference="7924"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8448">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8447">
       <id>21</id>
-      <periodHardConstraintType id="8449">EXCLUSION</periodHardConstraintType>
+      <periodHardConstraintType id="8448">EXCLUSION</periodHardConstraintType>
       <leftSideTopic reference="8160"/>
       <rightSideTopic reference="8156"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
-    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8450">
+    <org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint id="8449">
       <id>22</id>
-      <periodHardConstraintType reference="8449"/>
+      <periodHardConstraintType reference="8448"/>
       <leftSideTopic reference="8246"/>
       <rightSideTopic reference="7950"/>
     </org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint>
   </periodHardConstraintList>
-  <roomHardConstraintList id="8451"/>
+  <roomHardConstraintList id="8450"/>
 </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/itc2007/examination/domain/Exam.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Exam.java	2008-01-20 16:17:57 UTC (rev 17986)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Exam.java	2008-01-20 17:21:41 UTC (rev 17987)
@@ -12,6 +12,9 @@
 
     private Topic topic;
 
+    private ExamCoincidence examCoincidence = null;
+
+    // Changed by moves, between score calculations.
     private Period period;
     private Room room;
 
@@ -23,6 +26,14 @@
         this.topic = topic;
     }
 
+    public ExamCoincidence getExamCoincidence() {
+        return examCoincidence;
+    }
+
+    public void setExamCoincidence(ExamCoincidence examCoincidence) {
+        this.examCoincidence = examCoincidence;
+    }
+
     public Period getPeriod() {
         return period;
     }
@@ -39,6 +50,12 @@
         this.room = room;
     }
 
+    public boolean isCoincidenceLeader() {
+        return examCoincidence == null
+                || examCoincidence.getFirstExam() == this;
+    }
+
+
     public int compareTo(Exam other) {
         return new CompareToBuilder()
                 .append(period, other.period)
@@ -57,8 +74,8 @@
     }
 
     /**
-     * The normal methods {@link #equals(Object)} and {@link #hashCode()} cannot be used
-     * because the rule engine already requires them (for performance in their original state).
+     * The normal methods {@link #equals(Object)} and {@link #hashCode()} cannot be used because the rule engine already
+     * requires them (for performance in their original state).
      * @see #solutionHashCode()
      */
     public boolean solutionEquals(Object o) {
@@ -78,8 +95,8 @@
     }
 
     /**
-     * The normal methods {@link #equals(Object)} and {@link #hashCode()} cannot be used
-     * because the rule engine already requires them (for performance in their original state).
+     * The normal methods {@link #equals(Object)} and {@link #hashCode()} cannot be used because the rule engine already
+     * requires them (for performance in their original state).
      * @see #solutionEquals(Object)
      */
     public int solutionHashCode() {

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/ExamCoincidence.java (from rev 17981, 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/ExamCoincidence.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/ExamCoincidence.java	2008-01-20 17:21:41 UTC (rev 17987)
@@ -0,0 +1,40 @@
+package org.drools.solver.examples.itc2007.examination.domain;
+
+import java.io.Serializable;
+import java.util.Set;
+
+/**
+ * Calculated during initialization, not used for score calculation, used for move creation.
+ * @author Geoffrey De Smet
+ */
+public class ExamCoincidence implements Serializable {
+
+    private Set<Exam> coincidenceExamSet;
+    private Exam firstExam;
+
+    public ExamCoincidence(Set<Exam> coincidenceExamSet) {
+        this.coincidenceExamSet = coincidenceExamSet;
+        for (Exam exam : coincidenceExamSet) {
+            if (firstExam == null || firstExam.getId() > exam.getId()) {
+                firstExam = exam;
+            }
+        }
+    }
+
+    public Set<Exam> getCoincidenceExamSet() {
+        return coincidenceExamSet;
+    }
+
+    public void setCoincidenceExamSet(Set<Exam> coincidenceExamSet) {
+        this.coincidenceExamSet = coincidenceExamSet;
+    }
+
+    public Exam getFirstExam() {
+        return firstExam;
+    }
+
+    public void setFirstExam(Exam firstExam) {
+        this.firstExam = firstExam;
+    }
+    
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Student.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Student.java	2008-01-20 16:17:57 UTC (rev 17986)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Student.java	2008-01-20 17:21:41 UTC (rev 17987)
@@ -4,6 +4,7 @@
 import org.drools.solver.examples.common.domain.AbstractPersistable;
 
 /**
+ * Not used during score calculation, so not inserted into the working memory.
  * @author Geoffrey De Smet
  */
 public class Student extends AbstractPersistable implements Comparable<Student> {

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Topic.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Topic.java	2008-01-20 16:17:57 UTC (rev 17986)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Topic.java	2008-01-20 17:21:41 UTC (rev 17987)
@@ -1,6 +1,7 @@
 package org.drools.solver.examples.itc2007.examination.domain;
 
 import java.util.List;
+import java.util.Set;
 
 import org.apache.commons.lang.builder.CompareToBuilder;
 import org.drools.solver.examples.common.domain.AbstractPersistable;
@@ -12,7 +13,10 @@
 
     private int duration;
     private List<Student> studentList;
+
+    // Calculated during initialization, not modified during score calculation.
     private boolean frontLoadLarge;
+    private Set<Topic> coincidenceTopicSet = null;
 
     public int getDuration() {
         return duration;
@@ -42,6 +46,19 @@
         this.frontLoadLarge = frontLoadLarge;
     }
 
+    public Set<Topic> getCoincidenceTopicSet() {
+        return coincidenceTopicSet;
+    }
+
+    public void setCoincidenceTopicSet(Set<Topic> coincidenceTopicSet) {
+        this.coincidenceTopicSet = coincidenceTopicSet;
+    }
+
+
+    public boolean hasCoincidenceTopic() {
+        return coincidenceTopicSet != null;
+    }
+
     public int compareTo(Topic other) {
         return new CompareToBuilder()
                 .append(id, other.id)

Modified: 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	2008-01-20 16:17:57 UTC (rev 17986)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/TopicConflict.java	2008-01-20 17:21:41 UTC (rev 17987)
@@ -7,6 +7,7 @@
 import org.apache.commons.lang.builder.HashCodeBuilder;
 
 /**
+ * Calculated during initialization, not modified during score calculation.
  * @author Geoffrey De Smet
  */
 public class TopicConflict implements Serializable {

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java	2008-01-20 16:17:57 UTC (rev 17986)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java	2008-01-20 17:21:41 UTC (rev 17987)
@@ -217,14 +217,22 @@
             if (lineTokens.length != 3) {
                 throw new IllegalArgumentException("Read line (" + line + ") is expected to contain 3 tokens.");
             }
-            periodHardConstraint.setLeftSideTopic(topicList.get(Integer.parseInt(lineTokens[0])));
-            periodHardConstraint.setPeriodHardConstraintType(PeriodHardConstraintType.valueOf(lineTokens[1]));
-            periodHardConstraint.setRightSideTopic(topicList.get(Integer.parseInt(lineTokens[2])));
-            if (periodHardConstraint.getPeriodHardConstraintType() == PeriodHardConstraintType.EXAM_COINCIDENCE
-                    && !Collections.disjoint(periodHardConstraint.getLeftSideTopic().getStudentList(),
-                            periodHardConstraint.getRightSideTopic().getStudentList())) {
-                logger.warn("Filtering out periodHardConstraint (" + periodHardConstraint
-                        + ") because the left and right topic share students.");
+            Topic leftTopic = topicList.get(Integer.parseInt(lineTokens[0]));
+            periodHardConstraint.setLeftSideTopic(leftTopic);
+            PeriodHardConstraintType periodHardConstraintType = PeriodHardConstraintType.valueOf(lineTokens[1]);
+            periodHardConstraint.setPeriodHardConstraintType(periodHardConstraintType);
+            Topic rightTopic = topicList.get(Integer.parseInt(lineTokens[2]));
+            periodHardConstraint.setRightSideTopic(rightTopic);
+            if (periodHardConstraintType == PeriodHardConstraintType.EXAM_COINCIDENCE) {
+                // It's not specified what happens
+                // when A coincidences with B and B coincidences with C
+                // and when A and C share students (but don't directly coincidence)
+                if (!Collections.disjoint(leftTopic.getStudentList(), rightTopic.getStudentList())) {
+                    logger.warn("Filtering out periodHardConstraint (" + periodHardConstraint
+                            + ") because the left and right topic share students.");
+                } else {
+                    periodHardConstraintList.add(periodHardConstraint);
+                }
             } else {
                 periodHardConstraintList.add(periodHardConstraint);
             }

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationMoveFactory.java	2008-01-20 16:17:57 UTC (rev 17986)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationMoveFactory.java	2008-01-20 17:21:41 UTC (rev 17987)
@@ -10,6 +10,7 @@
 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.move.PeriodChangeBulkMove;
 import org.drools.solver.examples.itc2007.examination.solver.move.PeriodChangeMove;
 import org.drools.solver.examples.itc2007.examination.solver.move.RoomChangeMove;
 
@@ -20,12 +21,23 @@
 
     public List<Move> createMoveList(Solution solution) {
         Examination examination = (Examination) solution;
+        List<Period> periodList = examination.getPeriodList();
+        List<Room> roomList = examination.getRoomList();
         List<Move> moveList = new ArrayList<Move>();
         for (Exam exam : examination.getExamList()) {
-            for (Period period : examination.getPeriodList()) {
-                moveList.add(new PeriodChangeMove(exam, period));
+            if (exam.getExamCoincidence() != null) {
+                if (exam.isCoincidenceLeader()) {
+                    for (Period period : periodList) {
+                        moveList.add(new PeriodChangeBulkMove(
+                                exam.getExamCoincidence().getCoincidenceExamSet(), period));
+                    }
+                }
+            } else {
+                for (Period period : periodList) {
+                    moveList.add(new PeriodChangeMove(exam, period));
+                }
             }
-            for (Room room : examination.getRoomList()) {
+            for (Room room : roomList) {
                 moveList.add(new RoomChangeMove(exam, room));
             }
         }

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/JumpingNeighbourExaminationMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/JumpingNeighbourExaminationMoveFactory.java	2008-01-20 16:17:57 UTC (rev 17986)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/JumpingNeighbourExaminationMoveFactory.java	2008-01-20 17:21:41 UTC (rev 17987)
@@ -10,6 +10,7 @@
 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.move.PeriodChangeBulkMove;
 import org.drools.solver.examples.itc2007.examination.solver.move.PeriodChangeMove;
 import org.drools.solver.examples.itc2007.examination.solver.move.RoomChangeMove;
 
@@ -22,17 +23,30 @@
     private int roomJump = 1;
 
     public Iterator<Move> iterator() {
-        List<Move> moveList = new ArrayList<Move>();
         Examination examination = (Examination) localSearchSolver.getCurrentSolution();
         List<Period> periodList = examination.getPeriodList();
         List<Room> roomList = examination.getRoomList();
+        List<Move> moveList = new ArrayList<Move>();
         for (Exam exam : examination.getExamList()) {
-            for (Period period : periodList) {
-                int distance = calculateShortestDistance(
-                        period.getPeriodIndex(), exam.getPeriod().getPeriodIndex(), periodList.size());
-                if (distance == periodJump) {
-                    moveList.add(new PeriodChangeMove(exam, period));
+            if (exam.getExamCoincidence() != null) {
+                if (exam.isCoincidenceLeader()) {
+                    for (Period period : periodList) {
+                        int distance = calculateShortestDistance(
+                                period.getPeriodIndex(), exam.getPeriod().getPeriodIndex(), periodList.size());
+                        if (distance == periodJump) {
+                            moveList.add(new PeriodChangeBulkMove(
+                                    exam.getExamCoincidence().getCoincidenceExamSet(), period));
+                        }
+                    }
                 }
+            } else {
+                for (Period period : periodList) {
+                    int distance = calculateShortestDistance(
+                            period.getPeriodIndex(), exam.getPeriod().getPeriodIndex(), periodList.size());
+                    if (distance == periodJump) {
+                        moveList.add(new PeriodChangeMove(exam, period));
+                    }
+                }
             }
             for (Room room : roomList) {
                 long distance = calculateShortestDistance(

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/NeighbourExaminationMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/NeighbourExaminationMoveFactory.java	2008-01-20 16:17:57 UTC (rev 17986)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/NeighbourExaminationMoveFactory.java	2008-01-20 17:21:41 UTC (rev 17987)
@@ -10,6 +10,7 @@
 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.move.PeriodChangeBulkMove;
 import org.drools.solver.examples.itc2007.examination.solver.move.PeriodChangeMove;
 import org.drools.solver.examples.itc2007.examination.solver.move.RoomChangeMove;
 
@@ -22,17 +23,30 @@
     private static final int ROOM_JUMP = 2;
 
     public Iterator<Move> iterator() {
-        List<Move> moveList = new ArrayList<Move>();
         Examination examination = (Examination) localSearchSolver.getCurrentSolution();
         List<Period> periodList = examination.getPeriodList();
         List<Room> roomList = examination.getRoomList();
+        List<Move> moveList = new ArrayList<Move>();
         for (Exam exam : examination.getExamList()) {
-            for (Period period : periodList) {
-                int distance = calculateShortestDistance(
-                        period.getPeriodIndex(), exam.getPeriod().getPeriodIndex(), periodList.size());
-                if (distance <= PERIOD_JUMP) {
-                    moveList.add(new PeriodChangeMove(exam, period));
+            if (exam.getExamCoincidence() != null) {
+                if (exam.isCoincidenceLeader()) {
+                    for (Period period : periodList) {
+                        int distance = calculateShortestDistance(
+                                period.getPeriodIndex(), exam.getPeriod().getPeriodIndex(), periodList.size());
+                        if (distance <= PERIOD_JUMP) {
+                            moveList.add(new PeriodChangeBulkMove(
+                                    exam.getExamCoincidence().getCoincidenceExamSet(), period));
+                        }
+                    }
                 }
+            } else {
+                for (Period period : periodList) {
+                    int distance = calculateShortestDistance(
+                            period.getPeriodIndex(), exam.getPeriod().getPeriodIndex(), periodList.size());
+                    if (distance <= PERIOD_JUMP) {
+                        moveList.add(new PeriodChangeMove(exam, period));
+                    }
+                }
             }
             for (Room room : roomList) {
                 long distance = calculateShortestDistance(

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/solution/initializer/ExaminationStartingSolutionInitializer.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/solution/initializer/ExaminationStartingSolutionInitializer.java	2008-01-20 16:17:57 UTC (rev 17986)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/solution/initializer/ExaminationStartingSolutionInitializer.java	2008-01-20 17:21:41 UTC (rev 17987)
@@ -2,8 +2,11 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import org.apache.commons.lang.builder.CompareToBuilder;
 import org.drools.FactHandle;
@@ -12,6 +15,7 @@
 import org.drools.solver.core.solution.initializer.AbstractStartingSolutionInitializer;
 import org.drools.solver.examples.common.domain.PersistableIdComparator;
 import org.drools.solver.examples.itc2007.examination.domain.Exam;
+import org.drools.solver.examples.itc2007.examination.domain.ExamCoincidence;
 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.PeriodHardConstraint;
@@ -33,126 +37,284 @@
 
     private void initializeExamList(Examination examination) {
         EvaluationHandler evaluationHandler = solver.getEvaluationHandler();
-        List<Topic> topicList = examination.getTopicList();
         List<Period> periodList = examination.getPeriodList();
         List<Room> roomList = examination.getRoomList();
-        List<Exam> examList = new ArrayList<Exam>(topicList.size());
+        List<Exam> examList = new ArrayList<Exam>(examination.getTopicList().size());
         examination.setExamList(examList);
         evaluationHandler.setSolution(examination);
         StatefulSession statefulSession = evaluationHandler.getStatefulSession();
 
-        List<Topic> assigningTopicList = createAssigningTopicList(examination);
+        List<ExamInitialWeight> examInitialWeightList = createExamAssigningScoreList(examination);
 
-        for (Topic topic : assigningTopicList) {
+        for (ExamInitialWeight examInitialWeight : examInitialWeightList) {
             double unscheduledScore = evaluationHandler.fireAllRulesAndCalculateStepScore();
+            Exam leader = examInitialWeight.getExam();
+            FactHandle leaderHandle = null;
 
-            Exam exam = new Exam();
-            exam.setId(topic.getId());
-            exam.setTopic(topic);
-            examList.add(exam);
-            FactHandle examHandle = null;
-
+            List<ExamToHandle> examToHandleList = new ArrayList<ExamToHandle>(5);
+            if (leader.getExamCoincidence() == null) {
+                examToHandleList.add(new ExamToHandle(leader));
+            } else {
+                for (Exam coincidenceExam : leader.getExamCoincidence().getCoincidenceExamSet()) {
+                    examToHandleList.add(new ExamToHandle(coincidenceExam));
+                }
+            }
+            
             List<PeriodScoring> periodScoringList = new ArrayList<PeriodScoring>(periodList.size());
-
             for (Period period : periodList) {
-                exam.setPeriod(period);
-                if (examHandle == null) {
-                    // Score rules don't support a nullable exam.getPeriod()
-                    examHandle = statefulSession.insert(exam);
-                } else {
-                    statefulSession.update(examHandle, exam);
+                for (ExamToHandle examToHandle : examToHandleList) {
+                    examToHandle.getExam().setPeriod(period);
+                    if (examToHandle.getExamHandle() == null) {
+                        examToHandle.setExamHandle(statefulSession.insert(examToHandle.getExam()));
+                        if (examToHandle.getExam().isCoincidenceLeader()) {
+                            leaderHandle = examToHandle.getExamHandle();
+                        }
+                    } else {
+                        statefulSession.update(examToHandle.getExamHandle(), examToHandle.getExam());
+                    }
                 }
                 double score = evaluationHandler.fireAllRulesAndCalculateStepScore();
                 periodScoringList.add(new PeriodScoring(period, score));
             }
             Collections.sort(periodScoringList);
 
-            boolean perfectMatch = false;
-            double bestScore = Double.NEGATIVE_INFINITY;
-            Period bestPeriod = null;
-            Room bestRoom = null;
-            for (PeriodScoring periodScoring : periodScoringList) {
-                if (bestScore >= periodScoring.getScore()) {
-                    // No need to check the rest
-                    break;
+            scheduleLeader(periodScoringList, roomList, evaluationHandler, statefulSession, unscheduledScore,
+                    examToHandleList, leader, leaderHandle);
+            examList.add(leader);
+
+            // Schedule the non leaders
+            for (ExamToHandle examToHandle : examToHandleList) {
+                Exam exam = examToHandle.getExam();
+                // Leader already has a room
+                if (!exam.isCoincidenceLeader()) {
+                    scheduleNonLeader(roomList, evaluationHandler, statefulSession, exam, examToHandle.getExamHandle());
+                    examList.add(exam);
                 }
-                exam.setPeriod(periodScoring.getPeriod());
-                for (Room room : roomList) {
-                    exam.setRoom(room);
-                    statefulSession.update(examHandle, exam);
-                    double score = evaluationHandler.fireAllRulesAndCalculateStepScore();
-                    if (score < unscheduledScore) {
-                        if (score > bestScore) {
-                            bestScore = score;
-                            bestPeriod = periodScoring.getPeriod();
-                            bestRoom = room;
-                        }
-                    } else if (score == unscheduledScore) {
-                        perfectMatch = true;
-                        break;
-                    } else {
-                        throw new IllegalStateException("The score (" + score
-                                + ") cannot be higher than unscheduledScore (" + unscheduledScore + ").");
+            }
+        }
+        Collections.sort(examList, new PersistableIdComparator());
+        examination.setExamList(examList);
+    }
+
+    private void scheduleLeader(List<PeriodScoring> periodScoringList, List<Room> roomList,
+            EvaluationHandler evaluationHandler, StatefulSession statefulSession, double unscheduledScore,
+            List<ExamToHandle> examToHandleList, Exam leader, FactHandle leaderHandle) {
+        boolean perfectMatch = false;
+        double bestScore = Double.NEGATIVE_INFINITY;
+        Period bestPeriod = null;
+        Room bestRoom = null;
+        for (PeriodScoring periodScoring : periodScoringList) {
+            if (bestScore >= periodScoring.getScore()) {
+                // No need to check the rest
+                break;
+            }
+            for (ExamToHandle examToHandle : examToHandleList) {
+                examToHandle.getExam().setPeriod(periodScoring.getPeriod());
+                statefulSession.update(examToHandle.getExamHandle(), examToHandle.getExam());
+            }
+            for (Room room : roomList) {
+                leader.setRoom(room);
+                statefulSession.update(leaderHandle, leader);
+                double score = evaluationHandler.fireAllRulesAndCalculateStepScore();
+                if (score < unscheduledScore) {
+                    if (score > bestScore) {
+                        bestScore = score;
+                        bestPeriod = periodScoring.getPeriod();
+                        bestRoom = room;
                     }
-                }
-                if (perfectMatch) {
+                } else if (score == unscheduledScore) {
+                    perfectMatch = true;
                     break;
+                } else {
+                    throw new IllegalStateException("The score (" + score
+                            + ") cannot be higher than unscheduledScore (" + unscheduledScore + ").");
                 }
             }
-            if (!perfectMatch) {
-                if (bestPeriod == null || bestRoom == null) {
-                    throw new IllegalStateException("The bestPeriod (" + bestPeriod + ") or the bestRoom ("
-                            + bestRoom + ") cannot be null.");
+            if (perfectMatch) {
+                break;
+            }
+        }
+        if (!perfectMatch) {
+            if (bestPeriod == null || bestRoom == null) {
+                throw new IllegalStateException("The bestPeriod (" + bestPeriod + ") or the bestRoom ("
+                        + bestRoom + ") cannot be null.");
+            }
+            leader.setRoom(bestRoom);
+            for (ExamToHandle examToHandle : examToHandleList) {
+                examToHandle.getExam().setPeriod(bestPeriod);
+                statefulSession.update(examToHandle.getExamHandle(), examToHandle.getExam());
+            }
+        }
+        logger.debug("    Exam ({}) initialized for starting solution.", leader);
+    }
+
+    private void scheduleNonLeader(List<Room> roomList,
+            EvaluationHandler evaluationHandler, StatefulSession statefulSession,
+            Exam exam, FactHandle examHandle) {
+        if (exam.getRoom() != null) {
+            throw new IllegalStateException("Exam (" + exam + ") already has a room.");
+        }
+        double unscheduledScore = evaluationHandler.fireAllRulesAndCalculateStepScore();
+        boolean perfectMatch = false;
+        double bestScore = Double.NEGATIVE_INFINITY;
+        Room bestRoom = null;
+        for (Room room : roomList) {
+            exam.setRoom(room);
+            statefulSession.update(examHandle, exam);
+            double score = evaluationHandler.fireAllRulesAndCalculateStepScore();
+            if (score < unscheduledScore) {
+                if (score > bestScore) {
+                    bestScore = score;
+                    bestRoom = room;
                 }
-                exam.setPeriod(bestPeriod);
-                exam.setRoom(bestRoom);
-                statefulSession.update(examHandle, exam);
+            } else if (score == unscheduledScore) {
+                perfectMatch = true;
+                break;
+            } else {
+                throw new IllegalStateException("The score (" + score
+                        + ") cannot be higher than unscheduledScore (" + unscheduledScore + ").");
             }
-            logger.debug("    Exam ({}) initialized for starting solution.", exam);
         }
-        Collections.sort(examList, new PersistableIdComparator());
+        if (!perfectMatch) {
+            if (bestRoom == null) {
+                throw new IllegalStateException("The bestRoom ("
+                        + bestRoom + ") cannot be null.");
+            }
+            exam.setRoom(bestRoom);
+            statefulSession.update(examHandle, exam);
+        }
+        logger.debug("    Exam ({}) initialized for starting solution. *", exam);
     }
 
+    public static class ExamToHandle {
+
+        private Exam exam;
+        private FactHandle examHandle;
+
+        public ExamToHandle(Exam exam) {
+            this.exam = exam;
+        }
+
+        public Exam getExam() {
+            return exam;
+        }
+
+        public FactHandle getExamHandle() {
+            return examHandle;
+        }
+
+        public void setExamHandle(FactHandle examHandle) {
+            this.examHandle = examHandle;
+        }
+    }
+
     /**
-     * Order the topics in the order which we 'll assign them into periods and rooms.
+     * Create and order the exams in the order which we 'll assign them into periods and rooms.
      * @param examination not null
      * @return not null
      */
-    private List<Topic> createAssigningTopicList(Examination examination) {
-        List<Topic> assigningTopicList = new ArrayList<Topic>(examination.getTopicList());
-        Collections.sort(assigningTopicList, new Comparator<Topic>() {
-            public int compare(Topic a, Topic b) {
-                return new CompareToBuilder()
-                        .append(b.getStudentListSize(), a.getStudentListSize()) // Descending
-                        .append(b.getDuration(), a.getDuration()) // Descending
-                        .append(a.getId(), b.getId()) // Ascending
-                        .toComparison();
+    private List<ExamInitialWeight> createExamAssigningScoreList(Examination examination) {
+        List<Exam> examList = createExamList(examination);
+        List<ExamInitialWeight> examInitialWeightList = new ArrayList<ExamInitialWeight>(examList.size());
+        for (Exam exam : examList) {
+            if (exam.isCoincidenceLeader()) {
+                examInitialWeightList.add(new ExamInitialWeight(exam));
             }
-        });
+        }
+        Collections.sort(examInitialWeightList);
         for (PeriodHardConstraint periodHardConstraint : examination.getPeriodHardConstraintList()) {
-            if (periodHardConstraint.getPeriodHardConstraintType() == PeriodHardConstraintType.EXAM_COINCIDENCE) {
-                int leftSideIndex = assigningTopicList.indexOf(periodHardConstraint.getLeftSideTopic());
-                int rightSideIndex = assigningTopicList.indexOf(periodHardConstraint.getRightSideTopic());
-                int firstIndex = Math.min(leftSideIndex, rightSideIndex);
-                int lastIndex = Math.max(leftSideIndex, rightSideIndex);
-                if ((lastIndex - firstIndex) > 1) {
-                    // TODO lastIndex - firstIndex can be 2 with another COINCIDENCE in the middle of it
-                    Topic lastTopic = assigningTopicList.remove(lastIndex);
-                    assigningTopicList.add(firstIndex + 1, lastTopic);
+            if (periodHardConstraint.getPeriodHardConstraintType() == PeriodHardConstraintType.AFTER) {
+                int afterSideIndex = -1;
+                int beforeSideIndex = -1;
+                for (int i = 0; i < examInitialWeightList.size(); i++) {
+                    Topic topic = examInitialWeightList.get(i).getExam().getTopic();
+                    if (topic.equals(periodHardConstraint.getLeftSideTopic())) { // TODO FIXME topic could be in coinc.
+                        afterSideIndex = i;
+                    }
+                    if (topic.equals(periodHardConstraint.getRightSideTopic())) { // TODO FIXME topic could be in coinc.
+                        beforeSideIndex = i;
+                    }
                 }
-            } else if (periodHardConstraint.getPeriodHardConstraintType() == PeriodHardConstraintType.AFTER) {
-                int afterSideIndex = assigningTopicList.indexOf(periodHardConstraint.getLeftSideTopic());
-                int beforeSideIndex = assigningTopicList.indexOf(periodHardConstraint.getRightSideTopic());
                 if (afterSideIndex < beforeSideIndex) {
-                    Topic beforeTopic = assigningTopicList.remove(beforeSideIndex);
-                    assigningTopicList.add(afterSideIndex, beforeTopic);
+                    ExamInitialWeight beforeExamInitialWeight = examInitialWeightList.remove(beforeSideIndex);
+                    examInitialWeightList.add(afterSideIndex, beforeExamInitialWeight);
                 }
             }
         }
 
-        return assigningTopicList;
+        return examInitialWeightList;
     }
 
+    public List<Exam> createExamList(Examination examination) {
+        List<Topic> topicList = examination.getTopicList();
+        List<Exam> examList = new ArrayList<Exam>(topicList.size());
+        Map<Topic, Exam> topicToExamMap = new HashMap<Topic, Exam>(topicList.size());
+        for (Topic topic : topicList) {
+            Exam exam = new Exam();
+            exam.setId(topic.getId());
+            exam.setTopic(topic);
+            examList.add(exam);
+            topicToExamMap.put(topic, exam);
+        }
+        for (PeriodHardConstraint periodHardConstraint : examination.getPeriodHardConstraintList()) {
+            if (periodHardConstraint.getPeriodHardConstraintType() == PeriodHardConstraintType.EXAM_COINCIDENCE) {
+                Exam leftExam = topicToExamMap.get(periodHardConstraint.getLeftSideTopic());
+                Exam rightExam = topicToExamMap.get(periodHardConstraint.getRightSideTopic());
+
+                Set<Exam> newCoincidenceExamSet = new HashSet<Exam>();
+                ExamCoincidence leftExamCoincidence = leftExam.getExamCoincidence();
+                if (leftExamCoincidence != null) {
+                    newCoincidenceExamSet.addAll(leftExamCoincidence.getCoincidenceExamSet());
+                } else {
+                    newCoincidenceExamSet.add(leftExam);
+                }
+                ExamCoincidence rightExamCoincidence = rightExam.getExamCoincidence();
+                if (rightExamCoincidence != null) {
+                    newCoincidenceExamSet.addAll(rightExamCoincidence.getCoincidenceExamSet());
+                } else {
+                    newCoincidenceExamSet.add(rightExam);
+                }
+                ExamCoincidence newExamCoincidence = new ExamCoincidence(newCoincidenceExamSet);
+                leftExam.setExamCoincidence(newExamCoincidence);
+                rightExam.setExamCoincidence(newExamCoincidence);
+            }
+        }
+        return examList;
+    }
+
+    private class ExamInitialWeight implements Comparable<ExamInitialWeight> {
+
+        private Exam exam;
+        private int totalStudentSize;
+
+        private ExamInitialWeight(Exam exam) {
+            this.exam = exam;
+            if (exam.getExamCoincidence() == null) {
+                totalStudentSize = exam.getTopicStudentListSize();
+            } else {
+                totalStudentSize = 0;
+                for (Exam coincidenceExam : exam.getExamCoincidence().getCoincidenceExamSet()) {
+                    totalStudentSize += coincidenceExam.getTopicStudentListSize();
+                }
+            }
+
+        }
+
+        public Exam getExam() {
+            return exam;
+        }
+
+        public int compareTo(ExamInitialWeight other) {
+            // TODO calculate a assigningScore based on the properties of a topic and sort on that assigningScore
+            return new CompareToBuilder()
+                    .append(other.totalStudentSize, totalStudentSize) // Descending
+                    .append(other.exam.getTopic().getDuration(), exam.getTopic().getDuration()) // Descending
+                    .append(exam.getId(), other.exam.getId()) // Ascending
+                    .toComparison();
+        }
+
+    }
+
     private class PeriodScoring implements Comparable<PeriodScoring> {
 
         private Period period;
@@ -172,7 +334,7 @@
         }
 
         public int compareTo(PeriodScoring other) {
-            return - new CompareToBuilder().append(score, other.score).toComparison();
+            return -new CompareToBuilder().append(score, other.score).toComparison();
         }
 
     }

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationSolverBenchmarkConfig.xml	2008-01-20 16:17:57 UTC (rev 17986)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationSolverBenchmarkConfig.xml	2008-01-20 17:21:41 UTC (rev 17987)
@@ -26,7 +26,7 @@
                 ge0ffrey's main pc: 429
                 ge0ffrey's old pc: 1152
             -->
-            <maximumSecondsSpend>1152</maximumSecondsSpend>
+            <maximumSecondsSpend>1</maximumSecondsSpend>
         </finish>
     </inheritedLocalSearchSolver>
 




More information about the jboss-svn-commits mailing list