[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