[jboss-svn-commits] JBL Code SVN: r19730 - in labs/jbossrules/trunk/drools-solver: drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sat Apr 26 10:20:04 EDT 2008
Author: ge0ffrey
Date: 2008-04-26 10:20:04 -0400 (Sat, 26 Apr 2008)
New Revision: 19730
Added:
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForager.java
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/PickEarlyByScore.java
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForagerTest.java
Removed:
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedListBasedForager.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/main/java/org/drools/solver/core/localsearch/decider/forager/MaxScoreOfAllForager.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
Modified:
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/forager/ForagerConfig.java
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/Forager.java
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml
Log:
first best (or last step) score improving forager refactor
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/forager/ForagerConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/forager/ForagerConfig.java 2008-04-26 07:36:00 UTC (rev 19729)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/forager/ForagerConfig.java 2008-04-26 14:20:04 UTC (rev 19730)
@@ -1,9 +1,9 @@
package org.drools.solver.config.localsearch.decider.forager;
import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.drools.solver.core.localsearch.decider.forager.FirstRandomlyAcceptedForager;
+import org.drools.solver.core.localsearch.decider.forager.AcceptedForager;
import org.drools.solver.core.localsearch.decider.forager.Forager;
-import org.drools.solver.core.localsearch.decider.forager.MaxScoreOfAllForager;
+import org.drools.solver.core.localsearch.decider.forager.PickEarlyByScore;
/**
* @author Geoffrey De Smet
@@ -59,14 +59,18 @@
} else if (foragerType != null) {
switch (foragerType) {
case MAX_SCORE_OF_ALL:
- return new MaxScoreOfAllForager();
+ return new AcceptedForager(PickEarlyByScore.NONE, false);
+ case FIRST_BEST_SCORE_IMPROVING:
+ return new AcceptedForager(PickEarlyByScore.FIRST_BEST_SCORE_IMPROVING, false);
+ case FIRST_LAST_STEP_SCORE_IMPROVING:
+ return new AcceptedForager(PickEarlyByScore.FIRST_LAST_STEP_SCORE_IMPROVING, false);
case FIRST_RANDOMLY_ACCEPTED:
- return new FirstRandomlyAcceptedForager();
+ return new AcceptedForager(PickEarlyByScore.NONE, true);
default:
throw new IllegalStateException("foragerType (" + foragerType + ") not implemented");
}
} else {
- return new MaxScoreOfAllForager();
+ return new AcceptedForager(PickEarlyByScore.NONE, false);
}
}
@@ -80,6 +84,8 @@
public static enum ForagerType {
MAX_SCORE_OF_ALL,
+ FIRST_BEST_SCORE_IMPROVING,
+ FIRST_LAST_STEP_SCORE_IMPROVING,
FIRST_RANDOMLY_ACCEPTED
}
Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForager.java (from rev 19626, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedListBasedForager.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForager.java (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForager.java 2008-04-26 14:20:04 UTC (rev 19730)
@@ -0,0 +1,166 @@
+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.localsearch.StepScope;
+import org.drools.solver.core.localsearch.decider.MoveScope;
+import org.drools.solver.core.move.Move;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class AcceptedForager extends AbstractForager {
+
+ // final to allow better hotspot optimization. TODO prove that it indeed makes a difference
+ protected final PickEarlyByScore pickEarlyByScore;
+ protected final boolean pickEarlyRandomly;
+ protected final AcceptedMoveScopeComparator acceptionComparator;
+
+ protected List<MoveScope> acceptedList;
+ protected boolean listSorted;
+ protected double maxScore;
+ protected double acceptChanceMaxScoreTotal;
+
+ protected MoveScope earlyPickedMoveScope = null;
+
+ public AcceptedForager() {
+ this(PickEarlyByScore.NONE, false);
+ }
+
+ public AcceptedForager(PickEarlyByScore pickEarlyByScore, boolean pickEarlyRandomly) {
+ this(pickEarlyByScore, pickEarlyRandomly, new AcceptedMoveScopeComparator());
+ }
+
+ public AcceptedForager(PickEarlyByScore pickEarlyByScore, boolean pickEarlyRandomly,
+ AcceptedMoveScopeComparator acceptionComparator) {
+ this.pickEarlyByScore = pickEarlyByScore;
+ this.pickEarlyRandomly = pickEarlyRandomly;
+ this.acceptionComparator = acceptionComparator;
+ }
+
+ // ************************************************************************
+ // Worker methods
+ // ************************************************************************
+
+ @Override
+ public void beforeDeciding(StepScope stepScope) {
+ acceptedList = new ArrayList<MoveScope>(); // TODO use size of moveList in decider
+ listSorted = false;
+ maxScore = Double.NEGATIVE_INFINITY;
+ acceptChanceMaxScoreTotal = 0.0;
+ earlyPickedMoveScope = null;
+ }
+
+ @Override
+ public void addMove(MoveScope moveScope) {
+ if (moveScope.getAcceptChance() > 0.0) {
+ checkPickEarly(moveScope);
+ addMoveScopeToAcceptedList(moveScope);
+ }
+ }
+
+ protected void checkPickEarly(MoveScope moveScope) {
+ switch (pickEarlyByScore) {
+ case NONE:
+ break;
+ case FIRST_BEST_SCORE_IMPROVING:
+ if (moveScope.getScore() > moveScope.getStepScope().getLocalSearchSolverScope().getBestScore()) {
+ earlyPickedMoveScope = moveScope;
+ }
+ break;
+ case FIRST_LAST_STEP_SCORE_IMPROVING:
+ if (moveScope.getScore() > moveScope.getStepScope().getLocalSearchSolverScope()
+ .getLastCompletedStepScope().getScore()) {
+ earlyPickedMoveScope = moveScope;
+ }
+ break;
+ default:
+ throw new IllegalStateException("pickEarlyByScore (" + pickEarlyByScore + ") not implemented");
+ }
+ if (pickEarlyRandomly) {
+ double randomChance = moveScope.getWorkingRandom().nextDouble();
+ if (randomChance <= moveScope.getAcceptChance()) {
+ earlyPickedMoveScope = moveScope;
+ }
+ }
+ }
+
+ protected void addMoveScopeToAcceptedList(MoveScope moveScope) {
+ acceptedList.add(moveScope);
+ listSorted = false;
+ if (moveScope.getScore() > maxScore) {
+ acceptChanceMaxScoreTotal = moveScope.getAcceptChance();
+ maxScore = moveScope.getScore();
+ } else if (moveScope.getScore() == maxScore) {
+ acceptChanceMaxScoreTotal += moveScope.getAcceptChance();
+ }
+ }
+
+ @Override
+ public boolean isQuitEarly() {
+ return earlyPickedMoveScope != null;
+ }
+
+ @Override
+ public MoveScope pickMove(StepScope stepScope) {
+ if (earlyPickedMoveScope != null) {
+ return earlyPickedMoveScope;
+ } else {
+ return pickMaxScoreMoveScopeFromAcceptedList(stepScope);
+ }
+ }
+
+ protected MoveScope pickMaxScoreMoveScopeFromAcceptedList(StepScope stepScope) {
+ if (acceptedList.isEmpty()) {
+ return null;
+ }
+ sortAcceptedList();
+ MoveScope pickedMoveScope = null;
+ double randomChance = stepScope.getWorkingRandom().nextDouble();
+ double acceptMark = acceptChanceMaxScoreTotal * randomChance;
+ for (ListIterator<MoveScope> it = acceptedList.listIterator(acceptedList.size()); it.hasPrevious();) {
+ MoveScope moveScope = it.previous();
+ acceptMark -= moveScope.getAcceptChance();
+ // TODO That underflow warn is nonsence. randomChance can be 0.0 and the last acceptMark can end up 0.0
+ // TODO so < is nonsence (do a testcase though)
+ if (acceptMark < 0.0) {
+ pickedMoveScope = moveScope;
+ break;
+ }
+ }
+ if (pickedMoveScope == null) {
+ // TODO This isn't really underflow when an forager accepts only moves with acceptChance 0.0
+ logger.warn("Underflow occured with acceptChanceMaxScoreTotal ({}) " +
+ "and randomChance ({}).", acceptChanceMaxScoreTotal, randomChance);
+ // Deal with it anyway (no fail-fast here)
+ pickedMoveScope = acceptedList.get(acceptedList.size() - 1);
+ }
+ return pickedMoveScope;
+ }
+
+ public int getAcceptedMovesSize() {
+ return acceptedList.size();
+ }
+
+ public List<Move> getTopList(int topSize) {
+ sortAcceptedList();
+ int size = acceptedList.size();
+ List<Move> topList = new ArrayList<Move>(Math.min(topSize, size));
+ List<MoveScope> subAcceptedList = acceptedList.subList(Math.max(0, size - topSize), size);
+ for (MoveScope moveScope : subAcceptedList) {
+ topList.add(moveScope.getMove());
+ }
+ return topList;
+ }
+
+ protected void sortAcceptedList() {
+ if (!listSorted) {
+ Collections.sort(acceptedList, acceptionComparator);
+ listSorted = true;
+ }
+ }
+
+}
Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedListBasedForager.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedListBasedForager.java 2008-04-26 07:36:00 UTC (rev 19729)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedListBasedForager.java 2008-04-26 14:20:04 UTC (rev 19730)
@@ -1,102 +0,0 @@
-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.localsearch.StepScope;
-import org.drools.solver.core.localsearch.decider.MoveScope;
-import org.drools.solver.core.move.Move;
-
-/**
- * @author Geoffrey De Smet
- */
-public abstract class AcceptedListBasedForager extends AbstractForager {
-
- protected AcceptedMoveScopeComparator acceptionComparator = new AcceptedMoveScopeComparator();
- protected List<MoveScope> acceptedList;
- protected boolean listSorted;
- protected double maxScore;
- protected double acceptChanceMaxScoreTotal;
-
- public void setAcceptionComparator(AcceptedMoveScopeComparator acceptionComparator) {
- this.acceptionComparator = acceptionComparator;
- }
-
- @Override
- public void beforeDeciding(StepScope stepScope) {
- acceptedList = new ArrayList<MoveScope>(); // TODO use size of moveList in decider
- listSorted = false;
- maxScore = Double.NEGATIVE_INFINITY;
- acceptChanceMaxScoreTotal = 0.0;
- }
-
- protected void addMoveScopeToAcceptedList(MoveScope moveScope) {
- acceptedList.add(moveScope);
- listSorted = false;
- if (moveScope.getScore() > maxScore) {
- acceptChanceMaxScoreTotal = moveScope.getAcceptChance();
- maxScore = moveScope.getScore();
- } else if (moveScope.getScore() == maxScore) {
- acceptChanceMaxScoreTotal += moveScope.getAcceptChance();
- }
- }
-
- @Override
- public boolean isQuitEarly() {
- return false;
- }
-
- protected MoveScope pickMaxScoreMoveScopeFromAcceptedList(StepScope stepScope) {
- if (acceptedList.isEmpty())
- {
- return null;
- }
- sortAcceptedList();
- MoveScope pickedMoveScope = null;
- double randomChance = stepScope.getWorkingRandom().nextDouble();
- double acceptMark = acceptChanceMaxScoreTotal * randomChance;
- for (ListIterator<MoveScope> it = acceptedList.listIterator(acceptedList.size()); it.hasPrevious();) {
- MoveScope moveScope = it.previous();
- acceptMark -= moveScope.getAcceptChance();
- // TODO That underflow warn is nonsence. randomChance can be 0.0 and the last acceptMark can end up 0.0
- // TODO so < is nonsence
- if (acceptMark < 0.0) {
- pickedMoveScope = moveScope;
- break;
- }
- }
- if (pickedMoveScope == null) {
- // TODO This isn't really underflow when an forager accepts only moves with acceptChance 0.0
- logger.warn("Underflow occured with acceptChanceMaxScoreTotal ({}) " +
- "and randomChance ({}).", acceptChanceMaxScoreTotal, randomChance);
- // Deal with it anyway (no fail-fast here)
- pickedMoveScope = acceptedList.get(acceptedList.size() - 1);
- }
- return pickedMoveScope;
- }
-
- public int getAcceptedMovesSize() {
- return acceptedList.size();
- }
-
- public List<Move> getTopList(int topSize) {
- sortAcceptedList();
- int size = acceptedList.size();
- List<Move> topList = new ArrayList<Move>(Math.min(topSize, size));
- List<MoveScope> subAcceptedList = acceptedList.subList(Math.max(0, size - topSize), size);
- for (MoveScope moveScope : subAcceptedList) {
- topList.add(moveScope.getMove());
- }
- return topList;
- }
-
- protected void sortAcceptedList() {
- if (!listSorted) {
- Collections.sort(acceptedList, acceptionComparator);
- listSorted = true;
- }
- }
-
-}
Deleted: 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/main/java/org/drools/solver/core/localsearch/decider/forager/FirstRandomlyAcceptedForager.java 2008-04-26 07:36:00 UTC (rev 19729)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/FirstRandomlyAcceptedForager.java 2008-04-26 14:20:04 UTC (rev 19730)
@@ -1,48 +0,0 @@
-package org.drools.solver.core.localsearch.decider.forager;
-
-import org.drools.solver.core.localsearch.StepScope;
-import org.drools.solver.core.localsearch.decider.MoveScope;
-
-/**
- * @author Geoffrey De Smet
- */
-public class FirstRandomlyAcceptedForager extends AcceptedListBasedForager {
-
- protected MoveScope earlyPickedMoveScope = null;
-
- // ************************************************************************
- // Worker methods
- // ************************************************************************
-
- @Override
- public void beforeDeciding(StepScope stepScope) {
- super.beforeDeciding(stepScope);
- earlyPickedMoveScope = null;
- }
-
- @Override
- public void addMove(MoveScope moveScope) {
- if (moveScope.getAcceptChance() > 0.0) {
- double randomChance = moveScope.getWorkingRandom().nextDouble();
- if (randomChance <= moveScope.getAcceptChance()) {
- earlyPickedMoveScope = moveScope;
- }
- addMoveScopeToAcceptedList(moveScope);
- }
- }
-
- @Override
- public boolean isQuitEarly() {
- return earlyPickedMoveScope != null;
- }
-
- @Override
- public MoveScope pickMove(StepScope stepScope) {
- if (earlyPickedMoveScope != null) {
- return earlyPickedMoveScope;
- } else {
- return pickMaxScoreMoveScopeFromAcceptedList(stepScope);
- }
- }
-
-}
\ 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/Forager.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/Forager.java 2008-04-26 07:36:00 UTC (rev 19729)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/Forager.java 2008-04-26 14:20:04 UTC (rev 19730)
@@ -9,6 +9,7 @@
import org.drools.solver.core.move.Move;
/**
+ * Do not implement directly, but instead extend {@link AbstractForager}.
* @author Geoffrey De Smet
*/
public interface Forager extends LocalSearchSolverAware, LocalSearchSolverLifecycleListener {
Deleted: 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 2008-04-26 07:36:00 UTC (rev 19729)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/MaxScoreOfAllForager.java 2008-04-26 14:20:04 UTC (rev 19730)
@@ -1,27 +0,0 @@
-package org.drools.solver.core.localsearch.decider.forager;
-
-import org.drools.solver.core.localsearch.StepScope;
-import org.drools.solver.core.localsearch.decider.MoveScope;
-
-/**
- * @author Geoffrey De Smet
- */
-public class MaxScoreOfAllForager extends AcceptedListBasedForager {
-
- // ************************************************************************
- // Worker methods
- // ************************************************************************
-
- @Override
- public void addMove(MoveScope moveScope) {
- if (moveScope.getAcceptChance() > 0.0) {
- addMoveScopeToAcceptedList(moveScope);
- }
- }
-
- @Override
- public MoveScope pickMove(StepScope stepScope) {
- return pickMaxScoreMoveScopeFromAcceptedList(stepScope);
- }
-
-}
Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/PickEarlyByScore.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/PickEarlyByScore.java (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/PickEarlyByScore.java 2008-04-26 14:20:04 UTC (rev 19730)
@@ -0,0 +1,11 @@
+package org.drools.solver.core.localsearch.decider.forager;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public enum PickEarlyByScore {
+ NONE,
+ FIRST_BEST_SCORE_IMPROVING,
+ FIRST_LAST_STEP_SCORE_IMPROVING;
+
+}
Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForagerTest.java (from rev 19626, 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/AcceptedForagerTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForagerTest.java 2008-04-26 14:20:04 UTC (rev 19730)
@@ -0,0 +1,166 @@
+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.LocalSearchSolverScope;
+import org.drools.solver.core.localsearch.StepScope;
+import org.drools.solver.core.localsearch.decider.MoveScope;
+import org.drools.solver.core.move.DummyMove;
+import org.drools.solver.core.move.Move;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class AcceptedForagerTest extends TestCase {
+
+ public void testPickMoveMaxScoreOfAll() {
+ // Setup
+ Forager forager = new AcceptedForager(PickEarlyByScore.NONE, false);
+ LocalSearchSolverScope localSearchSolverScope = createLocalSearchSolverScope();
+ forager.solvingStarted(localSearchSolverScope);
+ StepScope stepScope = new StepScope(localSearchSolverScope);
+ forager.beforeDeciding(stepScope);
+ // Pre conditions
+ MoveScope a = createMoveScope(stepScope, -20.0, 30.0);
+ MoveScope b = createMoveScope(stepScope, -1.0, 9.0);
+ MoveScope c = createMoveScope(stepScope, -20.0, 20.0);
+ MoveScope d = createMoveScope(stepScope, -300.0, 50000.0);
+ MoveScope e = createMoveScope(stepScope, -1.0, 1.0);
+ // Do stuff
+ forager.addMove(a);
+ assertFalse(forager.isQuitEarly());
+ forager.addMove(b);
+ assertFalse(forager.isQuitEarly());
+ forager.addMove(c);
+ assertFalse(forager.isQuitEarly());
+ forager.addMove(d);
+ assertFalse(forager.isQuitEarly());
+ forager.addMove(e);
+ assertFalse(forager.isQuitEarly());
+ MoveScope pickedScope = forager.pickMove(stepScope);
+ // Post conditions
+ assertSame(b, pickedScope);
+ List<Move> topList = forager.getTopList(3);
+ assertTrue(topList.contains(a.getMove())); // Because a's acceptChance is higher than c's
+ assertTrue(topList.contains(b.getMove()));
+ assertFalse(topList.contains(c.getMove()));
+ assertFalse(topList.contains(d.getMove()));
+ assertTrue(topList.contains(e.getMove()));
+ forager.solvingEnded(localSearchSolverScope);
+ }
+
+ public void testPickMoveFirstBestScoreImproving() {
+ // Setup
+ Forager forager = new AcceptedForager(PickEarlyByScore.FIRST_BEST_SCORE_IMPROVING, false);
+ LocalSearchSolverScope localSearchSolverScope = createLocalSearchSolverScope();
+ forager.solvingStarted(localSearchSolverScope);
+ StepScope stepScope = new StepScope(localSearchSolverScope);
+ forager.beforeDeciding(stepScope);
+ // Pre conditions
+ MoveScope a = createMoveScope(stepScope, -1.0, 0.0);
+ MoveScope b = createMoveScope(stepScope, -20.0, 1.0);
+ MoveScope c = createMoveScope(stepScope, -300.0, 1.0);
+ MoveScope d = createMoveScope(stepScope, -1.0, 0.3);
+ // Do stuff
+ forager.addMove(a);
+ assertFalse(forager.isQuitEarly());
+ forager.addMove(b);
+ assertFalse(forager.isQuitEarly());
+ forager.addMove(c);
+ assertFalse(forager.isQuitEarly());
+ forager.addMove(d);
+ assertTrue(forager.isQuitEarly());
+ // Post conditions
+ MoveScope pickedScope = forager.pickMove(stepScope);
+ assertSame(d, pickedScope);
+ List<Move> topList = forager.getTopList(2);
+ assertTrue(topList.contains(b.getMove()));
+ assertTrue(topList.contains(d.getMove()));
+ forager.solvingEnded(localSearchSolverScope);
+ }
+
+ public void testPickMoveFirstLastStepScoreImproving() {
+ // Setup
+ Forager forager = new AcceptedForager(PickEarlyByScore.FIRST_LAST_STEP_SCORE_IMPROVING, false);
+ LocalSearchSolverScope localSearchSolverScope = createLocalSearchSolverScope();
+ forager.solvingStarted(localSearchSolverScope);
+ StepScope stepScope = new StepScope(localSearchSolverScope);
+ forager.beforeDeciding(stepScope);
+ // Pre conditions
+ MoveScope a = createMoveScope(stepScope, -1.0, 0.0);
+ MoveScope b = createMoveScope(stepScope, -300.0, 1.0);
+ MoveScope c = createMoveScope(stepScope, -4000.0, 1.0);
+ MoveScope d = createMoveScope(stepScope, -20.0, 0.3);
+ // Do stuff
+ forager.addMove(a);
+ assertFalse(forager.isQuitEarly());
+ forager.addMove(b);
+ assertFalse(forager.isQuitEarly());
+ forager.addMove(c);
+ assertFalse(forager.isQuitEarly());
+ forager.addMove(d);
+ assertTrue(forager.isQuitEarly());
+ // Post conditions
+ MoveScope pickedScope = forager.pickMove(stepScope);
+ assertSame(d, pickedScope);
+ List<Move> topList = forager.getTopList(2);
+ assertTrue(topList.contains(b.getMove()));
+ assertTrue(topList.contains(d.getMove()));
+ forager.solvingEnded(localSearchSolverScope);
+ }
+
+ public void testPickMoveRandomly() {
+ // Setup
+ Forager forager = new AcceptedForager(PickEarlyByScore.NONE, true);
+ LocalSearchSolverScope localSearchSolverScope = createLocalSearchSolverScope();
+ forager.solvingStarted(localSearchSolverScope);
+ StepScope stepScope = new StepScope(localSearchSolverScope);
+ forager.beforeDeciding(stepScope);
+ // Pre conditions
+ MoveScope a = createMoveScope(stepScope, -20.0, 0.0);
+ MoveScope b = createMoveScope(stepScope, -1.0, 0.1);
+ MoveScope c = createMoveScope(stepScope, -1.0, 0.0);
+ MoveScope d = createMoveScope(stepScope, -20.0, 0.3);
+ // Do stuff
+ forager.addMove(a);
+ assertFalse(forager.isQuitEarly());
+ forager.addMove(b);
+ assertFalse(forager.isQuitEarly());
+ forager.addMove(c);
+ assertFalse(forager.isQuitEarly());
+ forager.addMove(d);
+ assertTrue(forager.isQuitEarly());
+ // Post conditions
+ MoveScope pickedScope = forager.pickMove(stepScope);
+ assertSame(d, pickedScope);
+ List<Move> topList = forager.getTopList(2);
+ assertTrue(topList.contains(b.getMove()));
+ assertTrue(topList.contains(d.getMove()));
+ forager.solvingEnded(localSearchSolverScope);
+ }
+
+ private LocalSearchSolverScope createLocalSearchSolverScope() {
+ LocalSearchSolverScope localSearchSolverScope = new LocalSearchSolverScope();
+ localSearchSolverScope.setWorkingRandom(new Random() {
+ public double nextDouble() {
+ return 0.2;
+ }
+ });
+ localSearchSolverScope.setBestScore(-10.0);
+ StepScope lastStepScope = new StepScope(localSearchSolverScope);
+ lastStepScope.setScore(-100.0);
+ localSearchSolverScope.setLastCompletedStepScope(lastStepScope);
+ return localSearchSolverScope;
+ }
+
+ public MoveScope createMoveScope(StepScope stepScope, double score, double acceptChance) {
+ MoveScope moveScope = new MoveScope(stepScope);
+ moveScope.setMove(new DummyMove());
+ moveScope.setScore(score);
+ moveScope.setAcceptChance(acceptChance);
+ return moveScope;
+ }
+
+}
\ 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/FirstRandomlyAcceptedForagerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/FirstRandomlyAcceptedForagerTest.java 2008-04-26 07:36:00 UTC (rev 19729)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/FirstRandomlyAcceptedForagerTest.java 2008-04-26 14:20:04 UTC (rev 19730)
@@ -1,59 +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.solver.core.localsearch.LocalSearchSolverScope;
-import org.drools.solver.core.localsearch.StepScope;
-import org.drools.solver.core.localsearch.decider.MoveScope;
-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();
- LocalSearchSolverScope localSearchSolverScope = new LocalSearchSolverScope();
- localSearchSolverScope.setWorkingRandom(new Random() {
- public double nextDouble() {
- return 0.99;
- }
- });
- forager.solvingStarted(localSearchSolverScope);
- StepScope stepScope = new StepScope(localSearchSolverScope);
- forager.beforeDeciding(stepScope);
- Move a = new DummyMove();
- Move b = new DummyMove();
- Move c = new DummyMove();
- Move d = new DummyMove();
- forager.addMove(createMoveScope(stepScope, a, -100.0, 0.0));
- assertFalse(forager.isQuitEarly());
- forager.addMove(createMoveScope(stepScope, b, -10.0, 0.8));
- assertFalse(forager.isQuitEarly());
- forager.addMove(createMoveScope(stepScope, c, -10.0, 0.0));
- assertFalse(forager.isQuitEarly());
- forager.addMove(createMoveScope(stepScope, d, -100.0, 1.0));
- assertTrue(forager.isQuitEarly());
- MoveScope pickedScope = forager.pickMove(stepScope);
- Move picked = pickedScope.getMove();
- assertTrue(picked == d);
- List<Move> topList = forager.getTopList(2);
- assertTrue(topList.contains(b));
- assertTrue(topList.contains(d));
- forager.solvingEnded(localSearchSolverScope);
- }
-
- public MoveScope createMoveScope(StepScope stepScope, Move move, double score, double acceptChance) {
- // TODO duplicate code from MaxScoreOfAllForagerTest
- MoveScope moveScope = new MoveScope(stepScope);
- moveScope.setMove(move);
- moveScope.setScore(score);
- moveScope.setAcceptChance(acceptChance);
- return moveScope;
- }
-
-}
\ 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/MaxScoreOfAllForagerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/MaxScoreOfAllForagerTest.java 2008-04-26 07:36:00 UTC (rev 19729)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/MaxScoreOfAllForagerTest.java 2008-04-26 14:20:04 UTC (rev 19730)
@@ -1,55 +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.solver.core.localsearch.LocalSearchSolverScope;
-import org.drools.solver.core.localsearch.StepScope;
-import org.drools.solver.core.localsearch.decider.MoveScope;
-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();
- LocalSearchSolverScope localSearchSolverScope = new LocalSearchSolverScope();
- localSearchSolverScope.setWorkingRandom(new Random());
- forager.solvingStarted(localSearchSolverScope);
- StepScope stepScope = new StepScope(localSearchSolverScope);
- forager.beforeDeciding(stepScope);
- Move a = new DummyMove();
- Move b = new DummyMove();
- Move c = new DummyMove();
- Move d = new DummyMove();
- Move e = new DummyMove();
- forager.addMove(createMoveScope(stepScope, a, -100.0, 10000.0));
- forager.addMove(createMoveScope(stepScope, b, -90.0, 2000.0));
- forager.addMove(createMoveScope(stepScope, c, -100.0, 300.0));
- forager.addMove(createMoveScope(stepScope, d, -190.0, 40.0));
- forager.addMove(createMoveScope(stepScope, e, -90.0, 5.0));
- MoveScope pickedScope = forager.pickMove(stepScope);
- Move picked = pickedScope.getMove();
- 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(localSearchSolverScope);
- }
-
- public MoveScope createMoveScope(StepScope stepScope, Move move, double score, double acceptChance) {
- MoveScope moveScope = new MoveScope(stepScope);
- moveScope.setMove(move);
- moveScope.setScore(score);
- moveScope.setAcceptChance(acceptChance);
- return moveScope;
- }
-
-}
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-04-26 07:36:00 UTC (rev 19729)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml 2008-04-26 14:20:04 UTC (rev 19730)
@@ -39,7 +39,7 @@
<completePropertyTabuSize>10</completePropertyTabuSize>
</accepter>
<forager>
- <foragerType>MAX_SCORE_OF_ALL</foragerType>
+ <foragerType>FIRST_BEST_SCORE_IMPROVING</foragerType>
</forager>
<!--<selector>-->
<!--<moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.move.factory.PeriodChangeExaminationMoveFactory</moveFactoryClass>-->
More information about the jboss-svn-commits
mailing list