[jboss-svn-commits] JBL Code SVN: r17878 - in labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main: resources/org/drools/solver/examples/itc2007/examination/benchmark and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Jan 15 14:58:45 EST 2008


Author: ge0ffrey
Date: 2008-01-15 14:58:45 -0500 (Tue, 15 Jan 2008)
New Revision: 17878

Added:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/JumpingNeighbourExaminationMoveFactory.java
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/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:
JumpingNeighbourExaminationMoveFactory

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/JumpingNeighbourExaminationMoveFactory.java (from rev 17839, 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/JumpingNeighbourExaminationMoveFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/JumpingNeighbourExaminationMoveFactory.java	2008-01-15 19:58:45 UTC (rev 17878)
@@ -0,0 +1,71 @@
+package org.drools.solver.examples.itc2007.examination.solver;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.drools.solver.core.localsearch.decider.selector.AbstractMoveFactory;
+import org.drools.solver.core.move.Move;
+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.Room;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class JumpingNeighbourExaminationMoveFactory extends AbstractMoveFactory {
+
+    private int periodJump = 1;
+    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();
+        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));
+                }
+            }
+            for (Room room : roomList) {
+                long distance = calculateShortestDistance(
+                        room.getId(), exam.getRoom().getId(), roomList.size());
+                if (distance == roomJump) {
+                    moveList.add(new RoomChangeMove(exam, room));
+                }
+            }
+        }
+        periodJump++;
+        if (periodJump >= (periodList.size() / 2)) {
+            periodJump = 1;
+        }
+        roomJump++;
+        if (roomJump >= (roomList.size() / 2)) {
+            roomJump = 1;
+        }
+        return moveList.iterator();
+        // TODO re-enable this stuff as it's a lot faster
+//        int maximumMoveSize = 100;
+//        // TODO not fair for first and last moves in move list
+//        int randomStart = localSearchSolver.getRandom().nextInt(moveList.size() - maximumMoveSize);
+//        return moveList.subList(randomStart, randomStart + maximumMoveSize).iterator();
+    }
+
+    public int calculateShortestDistance(int a, int b, int size) {
+        int innerDistance = Math.abs(a - b);
+        int outerDistance = size - innerDistance;
+        return Math.min(innerDistance, outerDistance);
+    }
+
+    public long calculateShortestDistance(long a, long b, long size) {
+        long innerDistance = Math.abs(a - b);
+        long outerDistance = size - innerDistance;
+        return Math.min(innerDistance, outerDistance);
+    }
+
+}
\ No newline at end of file

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-15 19:30:43 UTC (rev 17877)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/NeighbourExaminationMoveFactory.java	2008-01-15 19:58:45 UTC (rev 17878)
@@ -23,30 +23,19 @@
         List<Move> moveList = new ArrayList<Move>();
         Examination examination = (Examination) localSearchSolver.getCurrentSolution();
         List<Period> periodList = examination.getPeriodList();
-        // periodList should not be empty
-        int firstPeriodIndex = periodList.get(0).getPeriodIndex();
-        int lastPeriodIndex = periodList.get(Math.max(periodList.size() - PERIOD_JUMP, 0)).getPeriodIndex();
         List<Room> roomList = examination.getRoomList();
-        long firstRoomId = roomList.get(0).getId();
-        long lastRoomId = roomList.get(Math.max(roomList.size() - PERIOD_JUMP, 0)).getId();
         for (Exam exam : examination.getExamList()) {
             for (Period period : periodList) {
-                if ((Math.abs(period.getPeriodIndex() - exam.getPeriod().getPeriodIndex()) <= PERIOD_JUMP)
-                        || (period.getPeriodIndex() == firstPeriodIndex
-                            && exam.getPeriod().getPeriodIndex() == lastPeriodIndex)
-                        || (period.getPeriodIndex() == lastPeriodIndex
-                            && exam.getPeriod().getPeriodIndex() == firstPeriodIndex)
-                        ) {
+                int distance = calculateShortestDistance(
+                        period.getPeriodIndex(), exam.getPeriod().getPeriodIndex(), periodList.size());
+                if (distance <= PERIOD_JUMP) {
                     moveList.add(new PeriodChangeMove(exam, period));
                 }
             }
             for (Room room : roomList) {
-                if ((Math.abs(room.getId() - exam.getRoom().getId()) <= ROOM_JUMP)
-                        || (room.getId() == firstRoomId
-                            && exam.getRoom().getId() == lastRoomId)
-                        || (room.getId() == lastRoomId
-                            && exam.getRoom().getId() == firstRoomId)
-                        ) {
+                long distance = calculateShortestDistance(
+                        room.getId(), exam.getRoom().getId(), roomList.size());
+                if (distance <= ROOM_JUMP) {
                     moveList.add(new RoomChangeMove(exam, room));
                 }
             }
@@ -59,4 +48,16 @@
 //        return moveList.subList(randomStart, randomStart + maximumMoveSize).iterator();
     }
 
+    public int calculateShortestDistance(int a, int b, int size) {
+        int innerDistance = Math.abs(a - b);
+        int outerDistance = size - innerDistance;
+        return Math.min(innerDistance, outerDistance);
+    }
+
+    public long calculateShortestDistance(long a, long b, long size) {
+        long innerDistance = Math.abs(a - b);
+        long outerDistance = size - innerDistance;
+        return Math.min(innerDistance, outerDistance);
+    }
+
 }
\ No newline at end of file

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-15 19:30:43 UTC (rev 17877)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationSolverBenchmarkConfig.xml	2008-01-15 19:58:45 UTC (rev 17878)
@@ -57,4 +57,17 @@
             </forager>
         </localSearchSolver>
     </solverBenchmark>
+    <solverBenchmark>
+        <localSearchSolver>
+            <selector>
+                <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.JumpingNeighbourExaminationMoveFactory</moveFactoryClass>
+            </selector>
+            <accepter>
+                <completeSolutionTabuSize>1500</completeSolutionTabuSize>
+            </accepter>
+            <forager>
+                <foragerType>MAX_SCORE_OF_ALL</foragerType>
+            </forager>
+        </localSearchSolver>
+    </solverBenchmark>
 </solverBenchmarkSuite>

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-15 19:30:43 UTC (rev 17877)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml	2008-01-15 19:58:45 UTC (rev 17878)
@@ -16,7 +16,8 @@
         <!--<maximumStepCount>100</maximumStepCount>-->
     </finish>
     <selector>
-        <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.NeighbourExaminationMoveFactory</moveFactoryClass>
+        <!--<moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.NeighbourExaminationMoveFactory</moveFactoryClass>-->
+        <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.JumpingNeighbourExaminationMoveFactory</moveFactoryClass>
     </selector>
     <accepter>
         <completeSolutionTabuSize>1500</completeSolutionTabuSize>




More information about the jboss-svn-commits mailing list