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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Jan 20 05:48:37 EST 2008


Author: ge0ffrey
Date: 2008-01-20 05:48:36 -0500 (Sun, 20 Jan 2008)
New Revision: 17981

Added:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/move/
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/move/PeriodChangeMove.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/move/RoomChangeMove.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/solution/
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/solution/initializer/
   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/lessonschedule/solver/move/
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/solver/move/TimeslotChangeMove.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/solver/move/
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/solver/move/YChangeMove.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/move/
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/move/DayChangeMove.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/move/
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/move/MatchSwapMove.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/move/MultipleMatchListRotateMove.java
Removed:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationStartingSolutionInitializer.java
   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
   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/lessonschedule/solver/domain/
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/solver/YChangeMove.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/DayChangeMove.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/SimpleTravelingTournamentScoreCalculator.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/MatchSwapMove.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/MultipleMatchListRotateMove.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/SmartTravelingTournamentScoreCalculator.java
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/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/swingui/ExaminationPanel.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/solver/LessonScheduleMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/swingui/LessonSchedulePanel.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/solver/NQueensMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/swingui/NQueensPanel.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/SimpleTravelingTournamentMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/SmartTravelingTournamentMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/swingui/TravelingTournamentPanel.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationShortSolverBenchmarkConfig.xml
   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/solver/examinationSolverConfig.xml
Log:
put moves into a subpackage

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 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationMoveFactory.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -10,6 +10,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.move.PeriodChangeMove;
+import org.drools.solver.examples.itc2007.examination.solver.move.RoomChangeMove;
 
 /**
  * @author Geoffrey De Smet

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationStartingSolutionInitializer.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationStartingSolutionInitializer.java	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationStartingSolutionInitializer.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -1,180 +0,0 @@
-package org.drools.solver.examples.itc2007.examination.solver;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-import org.apache.commons.lang.builder.CompareToBuilder;
-import org.drools.FactHandle;
-import org.drools.StatefulSession;
-import org.drools.solver.core.evaluation.EvaluationHandler;
-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.Examination;
-import org.drools.solver.examples.itc2007.examination.domain.Period;
-import org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint;
-import org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraintType;
-import org.drools.solver.examples.itc2007.examination.domain.Room;
-import org.drools.solver.examples.itc2007.examination.domain.Topic;
-
-/**
- * @author Geoffrey De Smet
- */
-public class ExaminationStartingSolutionInitializer extends AbstractStartingSolutionInitializer {
-
-    public void intializeSolution() {
-        Examination examination = (Examination) solver.getEvaluationHandler().getSolution();
-        if (!examination.isInitialized()) {
-            initializeExamList(examination);
-        }
-    }
-
-    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());
-        examination.setExamList(examList);
-        evaluationHandler.setSolution(examination);
-        StatefulSession statefulSession = evaluationHandler.getStatefulSession();
-
-        List<Topic> assigningTopicList = createAssigningTopicList(examination);
-
-        for (Topic topic : assigningTopicList) {
-            double unscheduledScore = evaluationHandler.fireAllRulesAndCalculateStepScore();
-
-            Exam exam = new Exam();
-            exam.setId(topic.getId());
-            exam.setTopic(topic);
-            examList.add(exam);
-            FactHandle examHandle = null;
-
-            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);
-                }
-                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;
-                }
-                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 + ").");
-                    }
-                }
-                if (perfectMatch) {
-                    break;
-                }
-            }
-            if (!perfectMatch) {
-                if (bestPeriod == null || bestRoom == null) {
-                    throw new IllegalStateException("The bestPeriod (" + bestPeriod + ") or the bestRoom ("
-                            + bestRoom + ") cannot be null.");
-                }
-                exam.setPeriod(bestPeriod);
-                exam.setRoom(bestRoom);
-                statefulSession.update(examHandle, exam);
-            }
-            logger.debug("    Exam ({}) initialized for starting solution.", exam);
-        }
-        Collections.sort(examList, new PersistableIdComparator());
-    }
-
-    /**
-     * Order the topics 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();
-            }
-        });
-        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);
-                }
-            } 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);
-                }
-            }
-        }
-
-        return assigningTopicList;
-    }
-
-    private class PeriodScoring implements Comparable<PeriodScoring> {
-
-        private Period period;
-        private double score;
-
-        private PeriodScoring(Period period, double score) {
-            this.period = period;
-            this.score = score;
-        }
-
-        public Period getPeriod() {
-            return period;
-        }
-
-        public double getScore() {
-            return score;
-        }
-
-        public int compareTo(PeriodScoring other) {
-            return - new CompareToBuilder().append(score, other.score).toComparison();
-        }
-
-    }
-
-}

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 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/JumpingNeighbourExaminationMoveFactory.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -10,6 +10,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.move.PeriodChangeMove;
+import org.drools.solver.examples.itc2007.examination.solver.move.RoomChangeMove;
 
 /**
  * @author Geoffrey De Smet

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 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/NeighbourExaminationMoveFactory.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -10,6 +10,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.move.PeriodChangeMove;
+import org.drools.solver.examples.itc2007.examination.solver.move.RoomChangeMove;
 
 /**
  * @author Geoffrey De Smet

Deleted: 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/PeriodChangeMove.java	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/PeriodChangeMove.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -1,75 +0,0 @@
-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

Deleted: 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	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/RoomChangeMove.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -1,75 +0,0 @@
-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

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/move/PeriodChangeMove.java (from rev 17904, 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/move/PeriodChangeMove.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/move/PeriodChangeMove.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -0,0 +1,75 @@
+package org.drools.solver.examples.itc2007.examination.solver.move;
+
+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

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/move/RoomChangeMove.java (from rev 17904, 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/move/RoomChangeMove.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/move/RoomChangeMove.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -0,0 +1,75 @@
+package org.drools.solver.examples.itc2007.examination.solver.move;
+
+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

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/solution/initializer/ExaminationStartingSolutionInitializer.java (from rev 17904, labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationStartingSolutionInitializer.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/solution/initializer/ExaminationStartingSolutionInitializer.java	                        (rev 0)
+++ 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 10:48:36 UTC (rev 17981)
@@ -0,0 +1,180 @@
+package org.drools.solver.examples.itc2007.examination.solver.solution.initializer;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.apache.commons.lang.builder.CompareToBuilder;
+import org.drools.FactHandle;
+import org.drools.StatefulSession;
+import org.drools.solver.core.evaluation.EvaluationHandler;
+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.Examination;
+import org.drools.solver.examples.itc2007.examination.domain.Period;
+import org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint;
+import org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraintType;
+import org.drools.solver.examples.itc2007.examination.domain.Room;
+import org.drools.solver.examples.itc2007.examination.domain.Topic;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class ExaminationStartingSolutionInitializer extends AbstractStartingSolutionInitializer {
+
+    public void intializeSolution() {
+        Examination examination = (Examination) solver.getEvaluationHandler().getSolution();
+        if (!examination.isInitialized()) {
+            initializeExamList(examination);
+        }
+    }
+
+    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());
+        examination.setExamList(examList);
+        evaluationHandler.setSolution(examination);
+        StatefulSession statefulSession = evaluationHandler.getStatefulSession();
+
+        List<Topic> assigningTopicList = createAssigningTopicList(examination);
+
+        for (Topic topic : assigningTopicList) {
+            double unscheduledScore = evaluationHandler.fireAllRulesAndCalculateStepScore();
+
+            Exam exam = new Exam();
+            exam.setId(topic.getId());
+            exam.setTopic(topic);
+            examList.add(exam);
+            FactHandle examHandle = null;
+
+            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);
+                }
+                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;
+                }
+                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 + ").");
+                    }
+                }
+                if (perfectMatch) {
+                    break;
+                }
+            }
+            if (!perfectMatch) {
+                if (bestPeriod == null || bestRoom == null) {
+                    throw new IllegalStateException("The bestPeriod (" + bestPeriod + ") or the bestRoom ("
+                            + bestRoom + ") cannot be null.");
+                }
+                exam.setPeriod(bestPeriod);
+                exam.setRoom(bestRoom);
+                statefulSession.update(examHandle, exam);
+            }
+            logger.debug("    Exam ({}) initialized for starting solution.", exam);
+        }
+        Collections.sort(examList, new PersistableIdComparator());
+    }
+
+    /**
+     * Order the topics 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();
+            }
+        });
+        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);
+                }
+            } 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);
+                }
+            }
+        }
+
+        return assigningTopicList;
+    }
+
+    private class PeriodScoring implements Comparable<PeriodScoring> {
+
+        private Period period;
+        private double score;
+
+        private PeriodScoring(Period period, double score) {
+            this.period = period;
+            this.score = score;
+        }
+
+        public Period getPeriod() {
+            return period;
+        }
+
+        public double getScore() {
+            return score;
+        }
+
+        public int compareTo(PeriodScoring other) {
+            return - new CompareToBuilder().append(score, other.score).toComparison();
+        }
+
+    }
+
+}

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	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/swingui/ExaminationPanel.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -20,8 +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;
+import org.drools.solver.examples.itc2007.examination.solver.move.PeriodChangeMove;
+import org.drools.solver.examples.itc2007.examination.solver.move.RoomChangeMove;
 
 /**
  * @author Geoffrey De Smet

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/solver/LessonScheduleMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/solver/LessonScheduleMoveFactory.java	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/solver/LessonScheduleMoveFactory.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -9,6 +9,7 @@
 import org.drools.solver.examples.lessonschedule.domain.Lesson;
 import org.drools.solver.examples.lessonschedule.domain.LessonSchedule;
 import org.drools.solver.examples.lessonschedule.domain.Timeslot;
+import org.drools.solver.examples.lessonschedule.solver.move.TimeslotChangeMove;
 
 /**
  * @author Geoffrey De Smet

Deleted: 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/lessonschedule/solver/TimeslotChangeMove.java	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/solver/TimeslotChangeMove.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -1,75 +0,0 @@
-package org.drools.solver.examples.lessonschedule.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.lessonschedule.domain.Lesson;
-import org.drools.solver.examples.lessonschedule.domain.Timeslot;
-
-/**
- * @author Geoffrey De Smet
- */
-public class TimeslotChangeMove implements Move, TabuPropertyEnabled {
-
-    private Lesson lesson;
-    private Timeslot toTimeslot;
-
-    public TimeslotChangeMove(Lesson lesson, Timeslot toTimeslot) {
-        this.lesson = lesson;
-        this.toTimeslot = toTimeslot;
-    }
-
-    public boolean isMoveDoable(WorkingMemory workingMemory) {
-        Timeslot fromTimeslot = lesson.getTimeslot();
-        if (fromTimeslot == null) {
-            return (toTimeslot != null);
-        }
-        return !fromTimeslot.equals(toTimeslot);
-    }
-
-    public Move createUndoMove(WorkingMemory workingMemory) {
-        return new TimeslotChangeMove(lesson, lesson.getTimeslot());
-    }
-
-    public void doMove(WorkingMemory workingMemory) {
-        FactHandle lessonHandle = workingMemory.getFactHandle(lesson);
-        lesson.setTimeslot(toTimeslot);
-        workingMemory.update(lessonHandle, lesson);
-    }
-
-    public List<? extends Object> getTabuPropertyList() {
-        return Collections.singletonList(lesson);
-    }
-
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        } else if (o instanceof TimeslotChangeMove) {
-            TimeslotChangeMove other = (TimeslotChangeMove) o;
-            return new EqualsBuilder()
-                    .append(lesson, other.lesson)
-                    .append(toTimeslot, other.toTimeslot)
-                    .isEquals();
-        } else {
-            return false;
-        }
-    }
-
-    public int hashCode() {
-        return new HashCodeBuilder()
-                .append(lesson)
-                .append(toTimeslot)
-                .toHashCode();
-    }
-
-    public String toString() {
-        return lesson + " => " + toTimeslot;
-    }
-
-}

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/solver/move/TimeslotChangeMove.java (from rev 17904, 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/lessonschedule/solver/move/TimeslotChangeMove.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/solver/move/TimeslotChangeMove.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -0,0 +1,75 @@
+package org.drools.solver.examples.lessonschedule.solver.move;
+
+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.lessonschedule.domain.Lesson;
+import org.drools.solver.examples.lessonschedule.domain.Timeslot;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class TimeslotChangeMove implements Move, TabuPropertyEnabled {
+
+    private Lesson lesson;
+    private Timeslot toTimeslot;
+
+    public TimeslotChangeMove(Lesson lesson, Timeslot toTimeslot) {
+        this.lesson = lesson;
+        this.toTimeslot = toTimeslot;
+    }
+
+    public boolean isMoveDoable(WorkingMemory workingMemory) {
+        Timeslot fromTimeslot = lesson.getTimeslot();
+        if (fromTimeslot == null) {
+            return (toTimeslot != null);
+        }
+        return !fromTimeslot.equals(toTimeslot);
+    }
+
+    public Move createUndoMove(WorkingMemory workingMemory) {
+        return new TimeslotChangeMove(lesson, lesson.getTimeslot());
+    }
+
+    public void doMove(WorkingMemory workingMemory) {
+        FactHandle lessonHandle = workingMemory.getFactHandle(lesson);
+        lesson.setTimeslot(toTimeslot);
+        workingMemory.update(lessonHandle, lesson);
+    }
+
+    public List<? extends Object> getTabuPropertyList() {
+        return Collections.singletonList(lesson);
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        } else if (o instanceof TimeslotChangeMove) {
+            TimeslotChangeMove other = (TimeslotChangeMove) o;
+            return new EqualsBuilder()
+                    .append(lesson, other.lesson)
+                    .append(toTimeslot, other.toTimeslot)
+                    .isEquals();
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+                .append(lesson)
+                .append(toTimeslot)
+                .toHashCode();
+    }
+
+    public String toString() {
+        return lesson + " => " + toTimeslot;
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/swingui/LessonSchedulePanel.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/swingui/LessonSchedulePanel.java	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/swingui/LessonSchedulePanel.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -20,7 +20,7 @@
 import org.drools.solver.examples.lessonschedule.domain.Lesson;
 import org.drools.solver.examples.lessonschedule.domain.LessonSchedule;
 import org.drools.solver.examples.lessonschedule.domain.Timeslot;
-import org.drools.solver.examples.lessonschedule.solver.TimeslotChangeMove;
+import org.drools.solver.examples.lessonschedule.solver.move.TimeslotChangeMove;
 
 /**
  * @author Geoffrey De Smet

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/solver/NQueensMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/solver/NQueensMoveFactory.java	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/solver/NQueensMoveFactory.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -8,6 +8,7 @@
 import org.drools.solver.core.solution.Solution;
 import org.drools.solver.examples.nqueens.domain.NQueens;
 import org.drools.solver.examples.nqueens.domain.Queen;
+import org.drools.solver.examples.nqueens.solver.move.YChangeMove;
 
 /**
  * @author Geoffrey De Smet

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/solver/YChangeMove.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/solver/YChangeMove.java	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/solver/YChangeMove.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -1,71 +0,0 @@
-package org.drools.solver.examples.nqueens.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.nqueens.domain.Queen;
-
-/**
- * @author Geoffrey De Smet
- */
-public class YChangeMove implements Move, TabuPropertyEnabled {
-
-    private Queen queen;
-    private int toY;
-
-    public YChangeMove(Queen queen, int toY) {
-        this.queen = queen;
-        this.toY = toY;
-    }
-
-    public boolean isMoveDoable(WorkingMemory workingMemory) {
-        int fromY = queen.getY();
-        return fromY != toY;
-    }
-
-    public Move createUndoMove(WorkingMemory workingMemory) {
-        return new YChangeMove(queen, queen.getY());
-    }
-
-    public void doMove(WorkingMemory workingMemory) {
-        FactHandle queenHandle = workingMemory.getFactHandle(queen);
-        queen.setY(toY);
-        workingMemory.update(queenHandle, queen);
-    }
-
-    public List<? extends Object> getTabuPropertyList() {
-        return Collections.singletonList(queen);
-    }
-
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        } else if (o instanceof YChangeMove) {
-            YChangeMove other = (YChangeMove) o;
-            return new EqualsBuilder()
-                    .append(queen, other.queen)
-                    .append(toY, other.toY)
-                    .isEquals();
-        } else {
-            return false;
-        }
-    }
-
-    public int hashCode() {
-        return new HashCodeBuilder()
-                .append(queen)
-                .append(toY)
-                .toHashCode();
-    }
-
-    public String toString() {
-        return queen + " => " + toY;
-    }
-
-}

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/solver/move/YChangeMove.java (from rev 17904, labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/solver/YChangeMove.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/solver/move/YChangeMove.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/solver/move/YChangeMove.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -0,0 +1,71 @@
+package org.drools.solver.examples.nqueens.solver.move;
+
+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.nqueens.domain.Queen;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class YChangeMove implements Move, TabuPropertyEnabled {
+
+    private Queen queen;
+    private int toY;
+
+    public YChangeMove(Queen queen, int toY) {
+        this.queen = queen;
+        this.toY = toY;
+    }
+
+    public boolean isMoveDoable(WorkingMemory workingMemory) {
+        int fromY = queen.getY();
+        return fromY != toY;
+    }
+
+    public Move createUndoMove(WorkingMemory workingMemory) {
+        return new YChangeMove(queen, queen.getY());
+    }
+
+    public void doMove(WorkingMemory workingMemory) {
+        FactHandle queenHandle = workingMemory.getFactHandle(queen);
+        queen.setY(toY);
+        workingMemory.update(queenHandle, queen);
+    }
+
+    public List<? extends Object> getTabuPropertyList() {
+        return Collections.singletonList(queen);
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        } else if (o instanceof YChangeMove) {
+            YChangeMove other = (YChangeMove) o;
+            return new EqualsBuilder()
+                    .append(queen, other.queen)
+                    .append(toY, other.toY)
+                    .isEquals();
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+                .append(queen)
+                .append(toY)
+                .toHashCode();
+    }
+
+    public String toString() {
+        return queen + " => " + toY;
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/swingui/NQueensPanel.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/swingui/NQueensPanel.java	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/swingui/NQueensPanel.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -19,7 +19,7 @@
 import org.drools.solver.examples.common.swingui.SolutionPanel;
 import org.drools.solver.examples.nqueens.domain.NQueens;
 import org.drools.solver.examples.nqueens.domain.Queen;
-import org.drools.solver.examples.nqueens.solver.YChangeMove;
+import org.drools.solver.examples.nqueens.solver.move.YChangeMove;
 
 /**
  * @author Geoffrey De Smet

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/DayChangeMove.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/DayChangeMove.java	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/DayChangeMove.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -1,75 +0,0 @@
-package org.drools.solver.examples.travelingtournament.solver.simple;
-
-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.travelingtournament.domain.Day;
-import org.drools.solver.examples.travelingtournament.domain.Match;
-
-/**
- * @author Geoffrey De Smet
- */
-public class DayChangeMove implements Move, TabuPropertyEnabled {
-
-    private Match match;
-    private Day toDay;
-
-    public DayChangeMove(Match match, Day toDay) {
-        this.match = match;
-        this.toDay = toDay;
-    }
-
-    public boolean isMoveDoable(WorkingMemory workingMemory) {
-        Day fromDay = match.getDay();
-        if (fromDay == null) {
-            return (toDay != null);
-        }
-        return !fromDay.equals(toDay);
-    }
-
-    public Move createUndoMove(WorkingMemory workingMemory) {
-        return new DayChangeMove(match, match.getDay());
-    }
-
-    public void doMove(WorkingMemory workingMemory) {
-        FactHandle matchHandle = workingMemory.getFactHandle(match);
-        match.setDay(toDay);
-        workingMemory.update(matchHandle, match);
-    }
-
-    public List<? extends Object> getTabuPropertyList() {
-        return Collections.singletonList(match);
-    }
-
-    public boolean equals(Object o) {        
-        if (this == o) {
-            return true;
-        } else if (o instanceof DayChangeMove) {
-            DayChangeMove other = (DayChangeMove) o;
-            return new EqualsBuilder()
-                    .append(match, other.match)
-                    .append(toDay, other.toDay)
-                    .isEquals();
-        } else {
-            return false;
-        }
-    }
-
-    public int hashCode() {
-        return new HashCodeBuilder()
-                .append(match)
-                .append(toDay)
-                .toHashCode();
-    }
-
-    public String toString() {
-        return match + " => " + toDay;
-    }
-
-}

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/SimpleTravelingTournamentMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/SimpleTravelingTournamentMoveFactory.java	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/SimpleTravelingTournamentMoveFactory.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -9,6 +9,7 @@
 import org.drools.solver.examples.travelingtournament.domain.Day;
 import org.drools.solver.examples.travelingtournament.domain.Match;
 import org.drools.solver.examples.travelingtournament.domain.TravelingTournament;
+import org.drools.solver.examples.travelingtournament.solver.simple.move.DayChangeMove;
 
 /**
  * @author Geoffrey De Smet

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/SimpleTravelingTournamentScoreCalculator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/SimpleTravelingTournamentScoreCalculator.java	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/SimpleTravelingTournamentScoreCalculator.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -1,35 +0,0 @@
-package org.drools.solver.examples.travelingtournament.solver.simple;
-
-import java.util.Iterator;
-
-import org.drools.WorkingMemory;
-import org.drools.base.ClassObjectFilter;
-import org.drools.solver.core.solution.Solution;
-import org.drools.solver.examples.travelingtournament.solver.domain.Hop;
-
-/**
- * @author Geoffrey De Smet
- */
-public class SimpleTravelingTournamentScoreCalculator { // DELETEME
-
-    public double calculateStepScore(Solution solution, WorkingMemory workingMemory) {
-        double score = 0;
-        // Hard constraints
-//        score -= statefulSession.getQueryResults("multipleMatchesPerTeamPerDay").size();
-        score -= workingMemory.getQueryResults("multipleMatchesPerTeamPerDay1").size();
-        score -= workingMemory.getQueryResults("multipleMatchesPerTeamPerDay2").size();
-        score -= workingMemory.getQueryResults("multipleMatchesPerTeamPerDay3").size();
-        score -= workingMemory.getQueryResults("multipleMatchesPerTeamPerDay4").size();
-        score -= workingMemory.getQueryResults("fourConsecutiveHomeMatches").size();
-        score -= workingMemory.getQueryResults("fourConsecutiveAwayMatches").size();
-        score -= workingMemory.getQueryResults("matchRepeater").size();
-        score *= 1000000.0;
-        // Soft constraints
-        for (Iterator<Hop> it = workingMemory.iterateObjects(new ClassObjectFilter(Hop.class)); it.hasNext();) {
-            Hop hop = it.next();
-            score -= hop.getDistance();
-        }
-        return score;
-    }
-    
-}

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/move/DayChangeMove.java (from rev 17904, labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/DayChangeMove.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/move/DayChangeMove.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/simple/move/DayChangeMove.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -0,0 +1,75 @@
+package org.drools.solver.examples.travelingtournament.solver.simple.move;
+
+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.travelingtournament.domain.Day;
+import org.drools.solver.examples.travelingtournament.domain.Match;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class DayChangeMove implements Move, TabuPropertyEnabled {
+
+    private Match match;
+    private Day toDay;
+
+    public DayChangeMove(Match match, Day toDay) {
+        this.match = match;
+        this.toDay = toDay;
+    }
+
+    public boolean isMoveDoable(WorkingMemory workingMemory) {
+        Day fromDay = match.getDay();
+        if (fromDay == null) {
+            return (toDay != null);
+        }
+        return !fromDay.equals(toDay);
+    }
+
+    public Move createUndoMove(WorkingMemory workingMemory) {
+        return new DayChangeMove(match, match.getDay());
+    }
+
+    public void doMove(WorkingMemory workingMemory) {
+        FactHandle matchHandle = workingMemory.getFactHandle(match);
+        match.setDay(toDay);
+        workingMemory.update(matchHandle, match);
+    }
+
+    public List<? extends Object> getTabuPropertyList() {
+        return Collections.singletonList(match);
+    }
+
+    public boolean equals(Object o) {        
+        if (this == o) {
+            return true;
+        } else if (o instanceof DayChangeMove) {
+            DayChangeMove other = (DayChangeMove) o;
+            return new EqualsBuilder()
+                    .append(match, other.match)
+                    .append(toDay, other.toDay)
+                    .isEquals();
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+                .append(match)
+                .append(toDay)
+                .toHashCode();
+    }
+
+    public String toString() {
+        return match + " => " + toDay;
+    }
+
+}

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/MatchSwapMove.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/MatchSwapMove.java	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/MatchSwapMove.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -1,75 +0,0 @@
-package org.drools.solver.examples.travelingtournament.solver.smart;
-
-import java.util.Arrays;
-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.travelingtournament.domain.Day;
-import org.drools.solver.examples.travelingtournament.domain.Match;
-
-/**
- * @author Geoffrey De Smet
- */
-public class MatchSwapMove implements Move, TabuPropertyEnabled {
-
-    private Match firstMatch;
-    private Match secondMatch;
-
-    public MatchSwapMove(Match firstMatch, Match secondMatch) {
-        this.firstMatch = firstMatch;
-        this.secondMatch = secondMatch;
-    }
-
-    public boolean isMoveDoable(WorkingMemory workingMemory) {
-        return true;
-    }
-
-    public Move createUndoMove(WorkingMemory workingMemory) {
-        return this;
-    }
-
-    public void doMove(WorkingMemory workingMemory) {
-        FactHandle firstMatchHandle = workingMemory.getFactHandle(firstMatch);
-        FactHandle secondMatchHandle = workingMemory.getFactHandle(secondMatch);
-        Day oldFirstMatchDay = firstMatch.getDay();
-        firstMatch.setDay(secondMatch.getDay());
-        secondMatch.setDay(oldFirstMatchDay);
-        workingMemory.update(firstMatchHandle, firstMatch);
-        workingMemory.update(secondMatchHandle, secondMatch);
-    }
-
-    public List<? extends Object> getTabuPropertyList() {
-        return Arrays.asList(firstMatch, secondMatch);
-    }
-
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        } else if (o instanceof MatchSwapMove) {
-            MatchSwapMove other = (MatchSwapMove) o;
-            return new EqualsBuilder()
-                    .append(firstMatch, other.firstMatch)
-                    .append(secondMatch, other.secondMatch)
-                    .isEquals();
-        } else {
-            return false;
-        }
-    }
-
-    public int hashCode() {
-        return new HashCodeBuilder()
-                .append(firstMatch)
-                .append(secondMatch)
-                .toHashCode();
-    }
-
-    public String toString() {
-        return firstMatch + " <=> " + secondMatch;
-    }
-
-}

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/MultipleMatchListRotateMove.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/MultipleMatchListRotateMove.java	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/MultipleMatchListRotateMove.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -1,98 +0,0 @@
-package org.drools.solver.examples.travelingtournament.solver.smart;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-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.travelingtournament.domain.Day;
-import org.drools.solver.examples.travelingtournament.domain.Match;
-
-/**
- * @author Geoffrey De Smet
- */
-public class MultipleMatchListRotateMove implements Move, TabuPropertyEnabled {
-
-    private List<Match> firstMatchList;
-    private List<Match> secondMatchList;
-
-    public MultipleMatchListRotateMove(List<Match> firstMatchList, List<Match> secondMatchList) {
-        this.firstMatchList = firstMatchList;
-        this.secondMatchList = secondMatchList;
-    }
-
-    public boolean isMoveDoable(WorkingMemory workingMemory) {
-        return true;
-    }
-
-    public Move createUndoMove(WorkingMemory workingMemory) {
-        List<Match> inverseFirstMatchList = new ArrayList<Match>(firstMatchList);
-        Collections.reverse(inverseFirstMatchList);
-        List<Match> inverseSecondMatchList = new ArrayList<Match>(secondMatchList);
-        Collections.reverse(inverseSecondMatchList);
-        return new MultipleMatchListRotateMove(inverseFirstMatchList, inverseSecondMatchList);
-    }
-
-    public void doMove(WorkingMemory workingMemory) {
-        rotateList(firstMatchList, workingMemory);
-        if (!secondMatchList.isEmpty()) { // TODO create SingleMatchListRotateMove
-            rotateList(secondMatchList, workingMemory);
-        }
-    }
-
-    private void rotateList(List<Match> matchList, WorkingMemory workingMemory) {
-        Iterator<Match> it = matchList.iterator();
-        Match firstMatch = it.next();
-        Match secondMatch = null;
-        Day startDay = firstMatch.getDay();
-        while (it.hasNext()) {
-            secondMatch = it.next();
-            FactHandle firstMatchHandle = workingMemory.getFactHandle(firstMatch);
-            firstMatch.setDay(secondMatch.getDay());
-            workingMemory.update(firstMatchHandle, firstMatch);
-            firstMatch = secondMatch;
-        }
-        FactHandle secondMatchHandle = workingMemory.getFactHandle(firstMatch);
-        secondMatch.setDay(startDay);
-        workingMemory.update(secondMatchHandle, secondMatch);
-    }
-
-    public List<? extends Object> getTabuPropertyList() {
-        List<Match> tabuPropertyList = new ArrayList<Match>(firstMatchList.size() + secondMatchList.size());
-        tabuPropertyList.addAll(firstMatchList);
-        tabuPropertyList.addAll(secondMatchList);
-        return tabuPropertyList;
-    }
-
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        } else if (o instanceof MultipleMatchListRotateMove) {
-            MultipleMatchListRotateMove other = (MultipleMatchListRotateMove) o;
-            return new EqualsBuilder()
-                    .append(firstMatchList, other.firstMatchList)
-                    .append(secondMatchList, other.secondMatchList)
-                    .isEquals();
-        } else {
-            return false;
-        }
-    }
-
-    public int hashCode() {
-        return new HashCodeBuilder()
-                .append(firstMatchList)
-                .append(secondMatchList)
-                .toHashCode();
-    }
-
-    public String toString() {
-        return firstMatchList + " & " + secondMatchList;
-    }
-
-}

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/SmartTravelingTournamentMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/SmartTravelingTournamentMoveFactory.java	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/SmartTravelingTournamentMoveFactory.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -15,6 +15,8 @@
 import org.drools.solver.examples.travelingtournament.domain.Match;
 import org.drools.solver.examples.travelingtournament.domain.Team;
 import org.drools.solver.examples.travelingtournament.domain.TravelingTournament;
+import org.drools.solver.examples.travelingtournament.solver.smart.move.MatchSwapMove;
+import org.drools.solver.examples.travelingtournament.solver.smart.move.MultipleMatchListRotateMove;
 
 /**
  * @author Geoffrey De Smet

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/SmartTravelingTournamentScoreCalculator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/SmartTravelingTournamentScoreCalculator.java	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/SmartTravelingTournamentScoreCalculator.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -1,56 +0,0 @@
-package org.drools.solver.examples.travelingtournament.solver.smart;
-
-import java.util.Iterator;
-
-import org.drools.WorkingMemory;
-import org.drools.base.ClassObjectFilter;
-import org.drools.solver.core.solution.Solution;
-import org.drools.solver.examples.travelingtournament.solver.domain.Hop;
-
-/**
- * @author Geoffrey De Smet
- */
-public class SmartTravelingTournamentScoreCalculator { // DELETEME
-
-//    private int hardConstraintsWeight      = 50000;
-    private int hardConstraintsWeight    = 1000000;
-    private int maxHardConstraintsWeight = 1000000;
-    private int minHardConstraintsWeight    = 300;
-
-    public double calculateStepScore(Solution solution, WorkingMemory workingMemory) {
-        int hardConstraints = calculateHardConstraintsScore(workingMemory);
-//        // adjust it for decision calculation
-//        if (hardConstraints == 0) {
-//            hardConstraintsWeight /= 1.2;
-//            hardConstraintsWeight = Math.max(hardConstraintsWeight, minHardConstraintsWeight);
-//        } else {
-//            hardConstraintsWeight *= 1.2;
-//            hardConstraintsWeight = Math.min(hardConstraintsWeight, maxHardConstraintsWeight);
-//        }
-        return (hardConstraints * maxHardConstraintsWeight)
-                + calculateSoftConstraintsScore(workingMemory);
-    }
-
-    public double calculateDecisionScore(Solution solution, WorkingMemory workingMemory) {
-        return (calculateHardConstraintsScore(workingMemory) * hardConstraintsWeight)
-                + calculateSoftConstraintsScore(workingMemory);
-    }
-
-    private double calculateSoftConstraintsScore(WorkingMemory workingMemory) {
-        int score = 0;
-        for (Iterator<Hop> it = workingMemory.iterateObjects(new ClassObjectFilter(Hop.class)); it.hasNext();) {
-            Hop hop = it.next();
-            score -= hop.getDistance();
-        }
-        return score;
-    }
-
-    private int calculateHardConstraintsScore(WorkingMemory workingMemory) {
-        int score = 0;
-        score -= workingMemory.getQueryResults("fourConsecutiveHomeMatches").size();
-        score -= workingMemory.getQueryResults("fourConsecutiveAwayMatches").size();
-        score -= workingMemory.getQueryResults("matchRepeater").size();
-        return score;
-    }
-
-}

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/move/MatchSwapMove.java (from rev 17904, labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/MatchSwapMove.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/move/MatchSwapMove.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/move/MatchSwapMove.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -0,0 +1,75 @@
+package org.drools.solver.examples.travelingtournament.solver.smart.move;
+
+import java.util.Arrays;
+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.travelingtournament.domain.Day;
+import org.drools.solver.examples.travelingtournament.domain.Match;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class MatchSwapMove implements Move, TabuPropertyEnabled {
+
+    private Match firstMatch;
+    private Match secondMatch;
+
+    public MatchSwapMove(Match firstMatch, Match secondMatch) {
+        this.firstMatch = firstMatch;
+        this.secondMatch = secondMatch;
+    }
+
+    public boolean isMoveDoable(WorkingMemory workingMemory) {
+        return true;
+    }
+
+    public Move createUndoMove(WorkingMemory workingMemory) {
+        return this;
+    }
+
+    public void doMove(WorkingMemory workingMemory) {
+        FactHandle firstMatchHandle = workingMemory.getFactHandle(firstMatch);
+        FactHandle secondMatchHandle = workingMemory.getFactHandle(secondMatch);
+        Day oldFirstMatchDay = firstMatch.getDay();
+        firstMatch.setDay(secondMatch.getDay());
+        secondMatch.setDay(oldFirstMatchDay);
+        workingMemory.update(firstMatchHandle, firstMatch);
+        workingMemory.update(secondMatchHandle, secondMatch);
+    }
+
+    public List<? extends Object> getTabuPropertyList() {
+        return Arrays.asList(firstMatch, secondMatch);
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        } else if (o instanceof MatchSwapMove) {
+            MatchSwapMove other = (MatchSwapMove) o;
+            return new EqualsBuilder()
+                    .append(firstMatch, other.firstMatch)
+                    .append(secondMatch, other.secondMatch)
+                    .isEquals();
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+                .append(firstMatch)
+                .append(secondMatch)
+                .toHashCode();
+    }
+
+    public String toString() {
+        return firstMatch + " <=> " + secondMatch;
+    }
+
+}

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/move/MultipleMatchListRotateMove.java (from rev 17904, labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/MultipleMatchListRotateMove.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/move/MultipleMatchListRotateMove.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/solver/smart/move/MultipleMatchListRotateMove.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -0,0 +1,98 @@
+package org.drools.solver.examples.travelingtournament.solver.smart.move;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+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.travelingtournament.domain.Day;
+import org.drools.solver.examples.travelingtournament.domain.Match;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class MultipleMatchListRotateMove implements Move, TabuPropertyEnabled {
+
+    private List<Match> firstMatchList;
+    private List<Match> secondMatchList;
+
+    public MultipleMatchListRotateMove(List<Match> firstMatchList, List<Match> secondMatchList) {
+        this.firstMatchList = firstMatchList;
+        this.secondMatchList = secondMatchList;
+    }
+
+    public boolean isMoveDoable(WorkingMemory workingMemory) {
+        return true;
+    }
+
+    public Move createUndoMove(WorkingMemory workingMemory) {
+        List<Match> inverseFirstMatchList = new ArrayList<Match>(firstMatchList);
+        Collections.reverse(inverseFirstMatchList);
+        List<Match> inverseSecondMatchList = new ArrayList<Match>(secondMatchList);
+        Collections.reverse(inverseSecondMatchList);
+        return new MultipleMatchListRotateMove(inverseFirstMatchList, inverseSecondMatchList);
+    }
+
+    public void doMove(WorkingMemory workingMemory) {
+        rotateList(firstMatchList, workingMemory);
+        if (!secondMatchList.isEmpty()) { // TODO create SingleMatchListRotateMove
+            rotateList(secondMatchList, workingMemory);
+        }
+    }
+
+    private void rotateList(List<Match> matchList, WorkingMemory workingMemory) {
+        Iterator<Match> it = matchList.iterator();
+        Match firstMatch = it.next();
+        Match secondMatch = null;
+        Day startDay = firstMatch.getDay();
+        while (it.hasNext()) {
+            secondMatch = it.next();
+            FactHandle firstMatchHandle = workingMemory.getFactHandle(firstMatch);
+            firstMatch.setDay(secondMatch.getDay());
+            workingMemory.update(firstMatchHandle, firstMatch);
+            firstMatch = secondMatch;
+        }
+        FactHandle secondMatchHandle = workingMemory.getFactHandle(firstMatch);
+        secondMatch.setDay(startDay);
+        workingMemory.update(secondMatchHandle, secondMatch);
+    }
+
+    public List<? extends Object> getTabuPropertyList() {
+        List<Match> tabuPropertyList = new ArrayList<Match>(firstMatchList.size() + secondMatchList.size());
+        tabuPropertyList.addAll(firstMatchList);
+        tabuPropertyList.addAll(secondMatchList);
+        return tabuPropertyList;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        } else if (o instanceof MultipleMatchListRotateMove) {
+            MultipleMatchListRotateMove other = (MultipleMatchListRotateMove) o;
+            return new EqualsBuilder()
+                    .append(firstMatchList, other.firstMatchList)
+                    .append(secondMatchList, other.secondMatchList)
+                    .isEquals();
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+                .append(firstMatchList)
+                .append(secondMatchList)
+                .toHashCode();
+    }
+
+    public String toString() {
+        return firstMatchList + " & " + secondMatchList;
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/swingui/TravelingTournamentPanel.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/swingui/TravelingTournamentPanel.java	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/swingui/TravelingTournamentPanel.java	2008-01-20 10:48:36 UTC (rev 17981)
@@ -20,7 +20,7 @@
 import org.drools.solver.examples.travelingtournament.domain.Day;
 import org.drools.solver.examples.travelingtournament.domain.Match;
 import org.drools.solver.examples.travelingtournament.domain.TravelingTournament;
-import org.drools.solver.examples.travelingtournament.solver.simple.DayChangeMove;
+import org.drools.solver.examples.travelingtournament.solver.simple.move.DayChangeMove;
 
 /**
  * @author Geoffrey De Smet

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationShortSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationShortSolverBenchmarkConfig.xml	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationShortSolverBenchmarkConfig.xml	2008-01-20 10:48:36 UTC (rev 17981)
@@ -11,7 +11,7 @@
         <scoreCalculator>
             <scoreCalculatorType>HARD_AND_SOFT_CONSTRAINTS</scoreCalculatorType>
         </scoreCalculator>
-        <startingSolutionInitializerClass>org.drools.solver.examples.itc2007.examination.solver.ExaminationStartingSolutionInitializer</startingSolutionInitializerClass>
+        <startingSolutionInitializerClass>org.drools.solver.examples.itc2007.examination.solver.solution.initializer.ExaminationStartingSolutionInitializer</startingSolutionInitializerClass>
         <finish>
             <maximumStepCount>500</maximumStepCount>
         </finish>

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 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationSolverBenchmarkConfig.xml	2008-01-20 10:48:36 UTC (rev 17981)
@@ -19,7 +19,7 @@
         <scoreCalculator>
             <scoreCalculatorType>HARD_AND_SOFT_CONSTRAINTS</scoreCalculatorType>
         </scoreCalculator>
-        <startingSolutionInitializerClass>org.drools.solver.examples.itc2007.examination.solver.ExaminationStartingSolutionInitializer</startingSolutionInitializerClass>
+        <startingSolutionInitializerClass>org.drools.solver.examples.itc2007.examination.solver.solution.initializer.ExaminationStartingSolutionInitializer</startingSolutionInitializerClass>
         <finish>
             <!--
                 Official benchmark maximumSecondsSpend allowed on:

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml	2008-01-20 06:20:43 UTC (rev 17980)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml	2008-01-20 10:48:36 UTC (rev 17981)
@@ -4,7 +4,7 @@
     <scoreCalculator>
         <scoreCalculatorType>HARD_AND_SOFT_CONSTRAINTS</scoreCalculatorType>
     </scoreCalculator>
-    <startingSolutionInitializerClass>org.drools.solver.examples.itc2007.examination.solver.ExaminationStartingSolutionInitializer</startingSolutionInitializerClass>
+    <startingSolutionInitializerClass>org.drools.solver.examples.itc2007.examination.solver.solution.initializer.ExaminationStartingSolutionInitializer</startingSolutionInitializerClass>
     <finish>
         <!--
             Official benchmark maximumSecondsSpend allowed on:




More information about the jboss-svn-commits mailing list