[jboss-svn-commits] JBL Code SVN: r16298 - in labs/jbossrules/trunk/drools-solver: drools-solver-core/src/test/java/org/drools/solver/core and 4 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sat Nov 3 12:28:36 EDT 2007
Author: ge0ffrey
Date: 2007-11-03 12:28:36 -0400 (Sat, 03 Nov 2007)
New Revision: 16298
Added:
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptionListBasedForager.java
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/FirstRandomlyAcceptedForager.java
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/FirstRandomlyAcceptedForagerTest.java
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/MaxScoreOfAllForagerTest.java
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/move/
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/move/DummyMove.java
Removed:
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/ForagerTest.java
Modified:
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/MaxScoreOfAllForager.java
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationMoveFactory.java
Log:
FirstRandomlyAcceptedForager
Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptionListBasedForager.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptionListBasedForager.java (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptionListBasedForager.java 2007-11-03 16:28:36 UTC (rev 16298)
@@ -0,0 +1,87 @@
+package org.drools.solver.core.localsearch.decider.forager;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.ListIterator;
+
+import org.drools.solver.core.move.Move;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public abstract class AcceptionListBasedForager extends AbstractForager {
+
+ protected AcceptionComparator acceptionComparator = new AcceptionComparator();
+ protected List<Acception> acceptionList;
+ protected boolean listSorted;
+ protected double maxScore;
+ protected double acceptChanceMaxScoreTotal;
+
+ public void setAcceptionComparator(AcceptionComparator acceptionComparator) {
+ this.acceptionComparator = acceptionComparator;
+ }
+
+ @Override
+ public void beforeDeciding() {
+ acceptionList = new ArrayList<Acception>();
+ listSorted = false;
+ maxScore = Double.NEGATIVE_INFINITY;
+ acceptChanceMaxScoreTotal = 0.0;
+ }
+
+ protected void addMoveToAcceptionList(Move move, double score, double acceptChance) {
+ acceptionList.add(new Acception(move, score, acceptChance));
+ listSorted = false;
+ if (score > maxScore) {
+ acceptChanceMaxScoreTotal = acceptChance;
+ maxScore = score;
+ } else if (score == maxScore) {
+ acceptChanceMaxScoreTotal += acceptChance;
+ }
+ }
+
+ protected Move pickMaxScoreMove() {
+ if (acceptionList.isEmpty())
+ {
+ return null;
+ }
+ sortAcceptionList();
+ Move pickedMove = null;
+ double random = localSearchSolver.getRandom().nextDouble();
+ double acceptMark = acceptChanceMaxScoreTotal * random;
+ for (ListIterator<Acception> it = acceptionList.listIterator(acceptionList.size()); it.hasPrevious();) {
+ Acception acception = it.previous();
+ acceptMark -= acception.getAcceptChance();
+ if (acceptMark < 0.0) {
+ pickedMove = acception.getMove();
+ break;
+ }
+ }
+ if (pickedMove == null) {
+ logger.warn("Underflow occured with acceptChanceMaxScoreTotal ({}) " +
+ "and random ({}).", acceptChanceMaxScoreTotal, random);
+ // Deal with it anyway (no fail-fast here)
+ pickedMove = acceptionList.get(acceptionList.size() - 1).getMove();
+ }
+ return pickedMove;
+ }
+
+ public List<Move> getTopList(int topSize) {
+ sortAcceptionList();
+ int size = acceptionList.size();
+ List<Move> topList = new ArrayList<Move>(Math.min(topSize, size));
+ List<Acception> subAcceptionList = acceptionList.subList(Math.max(0, size - topSize), size);
+ for (Acception acception : subAcceptionList) {
+ topList.add(acception.getMove());
+ }
+ return topList;
+ }
+
+ protected void sortAcceptionList() {
+ if (!listSorted) {
+ Collections.sort(acceptionList, acceptionComparator);
+ listSorted = true;
+ }
+ }
+}
Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/FirstRandomlyAcceptedForager.java (from rev 15967, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/MaxScoreOfAllForager.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/FirstRandomlyAcceptedForager.java (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/FirstRandomlyAcceptedForager.java 2007-11-03 16:28:36 UTC (rev 16298)
@@ -0,0 +1,43 @@
+package org.drools.solver.core.localsearch.decider.forager;
+
+import org.drools.solver.core.move.Move;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class FirstRandomlyAcceptedForager extends AcceptionListBasedForager {
+
+ protected Move earlyPickedMove = null;
+
+ // ************************************************************************
+ // Worker methods
+ // ************************************************************************
+
+ @Override
+ public void beforeDeciding() {
+ super.beforeDeciding();
+ earlyPickedMove = null;
+ }
+
+ public void addMove(Move move, double score, double acceptChance) {
+ if (acceptChance > 0.0) {
+ if (localSearchSolver.getRandom().nextDouble() <= acceptChance) {
+ earlyPickedMove = move;
+ }
+ addMoveToAcceptionList(move, score, acceptChance);
+ }
+ }
+
+ public boolean isQuitEarly() {
+ return earlyPickedMove != null;
+ }
+
+ public Move pickMove() {
+ if (earlyPickedMove != null) {
+ return earlyPickedMove;
+ } else {
+ return pickMaxScoreMove();
+ }
+ }
+
+}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/MaxScoreOfAllForager.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/MaxScoreOfAllForager.java 2007-11-03 12:32:56 UTC (rev 16297)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/MaxScoreOfAllForager.java 2007-11-03 16:28:36 UTC (rev 16298)
@@ -1,50 +1,19 @@
package org.drools.solver.core.localsearch.decider.forager;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.ListIterator;
-
import org.drools.solver.core.move.Move;
/**
* @author Geoffrey De Smet
*/
-public class MaxScoreOfAllForager extends AbstractForager {
+public class MaxScoreOfAllForager extends AcceptionListBasedForager {
- protected AcceptionComparator acceptionComparator = new AcceptionComparator();
-
- protected List<Acception> acceptionList;
- protected boolean listSorted;
- protected double maxScore;
- protected double acceptChanceMaxScoreTotal;
-
- public void setAcceptionComparator(AcceptionComparator acceptionComparator) {
- this.acceptionComparator = acceptionComparator;
- }
-
// ************************************************************************
// Worker methods
// ************************************************************************
- @Override
- public void beforeDeciding() {
- acceptionList = new ArrayList<Acception>();
- listSorted = false;
- maxScore = Double.NEGATIVE_INFINITY;
- acceptChanceMaxScoreTotal = 0.0;
- }
-
public void addMove(Move move, double score, double acceptChance) {
if (acceptChance > 0.0) {
- acceptionList.add(new Acception(move, score, acceptChance));
- listSorted = false;
- if (score > maxScore) {
- acceptChanceMaxScoreTotal = acceptChance;
- maxScore = score;
- } else if (score == maxScore) {
- acceptChanceMaxScoreTotal += acceptChance;
- }
+ addMoveToAcceptionList(move, score, acceptChance);
}
}
@@ -53,47 +22,7 @@
}
public Move pickMove() {
- if (acceptionList.isEmpty())
- {
- return null;
- }
- sortAcceptionList();
- Move pickedMove = null;
- double random = localSearchSolver.getRandom().nextDouble();
- double acceptMark = acceptChanceMaxScoreTotal * random;
- for (ListIterator<Acception> it = acceptionList.listIterator(acceptionList.size()); it.hasPrevious();) {
- Acception acception = it.previous();
- acceptMark -= acception.getAcceptChance();
- if (acceptMark < 0.0) {
- pickedMove = acception.getMove();
- break;
- }
- }
- if (pickedMove == null) {
- logger.warn("Underflow occured with acceptChanceMaxScoreTotal ({}) " +
- "and random ({}).", acceptChanceMaxScoreTotal, random);
- // Deal with it anyway (no fail-fast here)
- pickedMove = acceptionList.get(acceptionList.size() - 1).getMove();
- }
- return pickedMove;
+ return pickMaxScoreMove();
}
- public List<Move> getTopList(int topSize) {
- sortAcceptionList();
- int size = acceptionList.size();
- List<Move> topList = new ArrayList<Move>(Math.min(topSize, size));
- List<Acception> subAcceptionList = acceptionList.subList(Math.max(0, size - topSize), size);
- for (Acception acception : subAcceptionList) {
- topList.add(acception.getMove());
- }
- return topList;
- }
-
- protected void sortAcceptionList() {
- if (!listSorted) {
- Collections.sort(acceptionList, acceptionComparator);
- listSorted = true;
- }
- }
-
}
Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/FirstRandomlyAcceptedForagerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/FirstRandomlyAcceptedForagerTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/FirstRandomlyAcceptedForagerTest.java 2007-11-03 16:28:36 UTC (rev 16298)
@@ -0,0 +1,49 @@
+package org.drools.solver.core.localsearch.decider.forager;
+
+import java.util.List;
+import java.util.Random;
+
+import junit.framework.TestCase;
+import org.drools.solver.core.localsearch.DefaultLocalSearchSolver;
+import org.drools.solver.core.move.DummyMove;
+import org.drools.solver.core.move.Move;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class FirstRandomlyAcceptedForagerTest extends TestCase {
+
+ public void testPicking() {
+ Forager forager = new FirstRandomlyAcceptedForager();
+ forager.setLocalSearchSolver(new DefaultLocalSearchSolver() {
+ public Random getRandom() {
+ return new Random() {
+ public double nextDouble() {
+ return 0.99;
+ }
+ };
+ }
+ });
+ forager.solvingStarted();
+ forager.beforeDeciding();
+ Move a = new DummyMove();
+ Move b = new DummyMove();
+ Move c = new DummyMove();
+ Move d = new DummyMove();
+ forager.addMove(a, -100.0, 0.0);
+ assertFalse(forager.isQuitEarly());
+ forager.addMove(b, -10.0, 0.8);
+ assertFalse(forager.isQuitEarly());
+ forager.addMove(c, -10.0, 0.0);
+ assertFalse(forager.isQuitEarly());
+ forager.addMove(d, -100.0, 1.0);
+ assertTrue(forager.isQuitEarly());
+ Move picked = forager.pickMove();
+ assertTrue(picked == d);
+ List<Move> topList = forager.getTopList(2);
+ assertTrue(topList.contains(b));
+ assertTrue(topList.contains(d));
+ forager.solvingEnded();
+ }
+
+}
\ No newline at end of file
Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/ForagerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/ForagerTest.java 2007-11-03 12:32:56 UTC (rev 16297)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/ForagerTest.java 2007-11-03 16:28:36 UTC (rev 16298)
@@ -1,61 +0,0 @@
-package org.drools.solver.core.localsearch.decider.forager;
-
-import java.util.List;
-import java.util.Random;
-
-import junit.framework.TestCase;
-import org.drools.WorkingMemory;
-import org.drools.solver.core.localsearch.DefaultLocalSearchSolver;
-import org.drools.solver.core.move.Move;
-
-/**
- * @author Geoffrey De Smet
- */
-public class ForagerTest extends TestCase {
-
- public void testPicking() {
- Forager forager = new MaxScoreOfAllForager();
- forager.setLocalSearchSolver(new DefaultLocalSearchSolver() {
- public Random getRandom() {
- return new Random();
- }
- });
- forager.solvingStarted();
- forager.beforeDeciding();
- Move a = new DummyMove();
- Move b = new DummyMove();
- Move c = new DummyMove();
- Move d = new DummyMove();
- Move e = new DummyMove();
- forager.addMove(a, -100.0, 10000.0);
- forager.addMove(b, -90.0, 2000.0);
- forager.addMove(c, -100.0, 300.0);
- forager.addMove(d, -190.0, 40.0);
- forager.addMove(e, -90.0, 5.0);
- Move picked = forager.pickMove();
- assertTrue(picked == b || picked == e);
- List<Move> topList = forager.getTopList(3);
- assertTrue(topList.contains(a));
- assertTrue(topList.contains(b));
- assertFalse(topList.contains(c));
- assertFalse(topList.contains(d));
- assertTrue(topList.contains(e));
- forager.solvingEnded();
- }
-
- public static class DummyMove implements Move {
-
- public boolean isMoveDoable(WorkingMemory workingMemory) {
- return false; // TODO generated
- }
-
- public Move createUndoMove(WorkingMemory workingMemory) {
- return null; // TODO generated
- }
-
- public void doMove(WorkingMemory workingMemory) {
- // TODO generated
- }
- }
-
-}
Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/MaxScoreOfAllForagerTest.java (from rev 15967, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/ForagerTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/MaxScoreOfAllForagerTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/MaxScoreOfAllForagerTest.java 2007-11-03 16:28:36 UTC (rev 16298)
@@ -0,0 +1,46 @@
+package org.drools.solver.core.localsearch.decider.forager;
+
+import java.util.List;
+import java.util.Random;
+
+import junit.framework.TestCase;
+import org.drools.solver.core.localsearch.DefaultLocalSearchSolver;
+import org.drools.solver.core.move.DummyMove;
+import org.drools.solver.core.move.Move;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class MaxScoreOfAllForagerTest extends TestCase {
+
+ public void testPicking() {
+ Forager forager = new MaxScoreOfAllForager();
+ forager.setLocalSearchSolver(new DefaultLocalSearchSolver() {
+ public Random getRandom() {
+ return new Random();
+ }
+ });
+ forager.solvingStarted();
+ forager.beforeDeciding();
+ Move a = new DummyMove();
+ Move b = new DummyMove();
+ Move c = new DummyMove();
+ Move d = new DummyMove();
+ Move e = new DummyMove();
+ forager.addMove(a, -100.0, 10000.0);
+ forager.addMove(b, -90.0, 2000.0);
+ forager.addMove(c, -100.0, 300.0);
+ forager.addMove(d, -190.0, 40.0);
+ forager.addMove(e, -90.0, 5.0);
+ Move picked = forager.pickMove();
+ assertTrue(picked == b || picked == e);
+ List<Move> topList = forager.getTopList(3);
+ assertTrue(topList.contains(a));
+ assertTrue(topList.contains(b));
+ assertFalse(topList.contains(c));
+ assertFalse(topList.contains(d));
+ assertTrue(topList.contains(e));
+ forager.solvingEnded();
+ }
+
+}
Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/move/DummyMove.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/move/DummyMove.java (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/move/DummyMove.java 2007-11-03 16:28:36 UTC (rev 16298)
@@ -0,0 +1,22 @@
+package org.drools.solver.core.move;
+
+import org.drools.WorkingMemory;
+
+/**
+ * @author Geoffrey De Smet
+*/
+public class DummyMove implements Move {
+
+ public boolean isMoveDoable(WorkingMemory workingMemory) {
+ return true;
+ }
+
+ public Move createUndoMove(WorkingMemory workingMemory) {
+ return new DummyMove();
+ }
+
+ public void doMove(WorkingMemory workingMemory) {
+ // do nothing
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java 2007-11-03 12:32:56 UTC (rev 16297)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java 2007-11-03 16:28:36 UTC (rev 16298)
@@ -263,7 +263,7 @@
int propertySize) throws IOException {
String[] lineTokens;
lineTokens = bufferedReader.readLine().split(SPLIT_REGEX);
- if (!lineTokens[0].equals(property) || lineTokens.length != propertySize){
+ if (!lineTokens[0].equals(property) || lineTokens.length != propertySize) {
throw new IllegalArgumentException("Read line (" + Arrays.toString(lineTokens)
+ ") is expected to contain " + propertySize + " tokens and start with " + property + ".");
}
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 2007-11-03 12:32:56 UTC (rev 16297)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationMoveFactory.java 2007-11-03 16:28:36 UTC (rev 16298)
@@ -6,7 +6,10 @@
import org.drools.solver.core.localsearch.decider.selector.CachedMoveListMoveFactory;
import org.drools.solver.core.move.Move;
import org.drools.solver.core.solution.Solution;
+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
@@ -16,8 +19,14 @@
public List<Move> createMoveList(Solution solution) {
Examination examination = (Examination) solution;
List<Move> moveList = new ArrayList<Move>();
- // TODO FIXME
-
+ for (Exam exam : examination.getExamList()) {
+ for (Period period : examination.getPeriodList()) {
+ moveList.add(new PeriodChangeMove(exam, period));
+ }
+ for (Room room : examination.getRoomList()) {
+ moveList.add(new RoomChangeMove(exam, room));
+ }
+ }
return moveList;
}
More information about the jboss-svn-commits
mailing list