[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