[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