[jboss-svn-commits] JBL Code SVN: r19735 - in labs/jbossrules/trunk/drools-solver/drools-solver-core/src: main/java/org/drools/solver/core/localsearch/decider/accepter/greatdeluge and 4 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Apr 27 11:49:55 EDT 2008


Author: ge0ffrey
Date: 2008-04-27 11:49:55 -0400 (Sun, 27 Apr 2008)
New Revision: 19735

Added:
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/greatdeluge/GreatDelugeAccepter.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/accepter/greatdeluge/
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/accepter/greatdeluge/GreatDelugeAccepterTest.java
Modified:
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/accepter/AccepterConfig.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/tabu/AbstractTabuAccepter.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForager.java
Log:
first great deluge implementation

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/accepter/AccepterConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/accepter/AccepterConfig.java	2008-04-27 11:05:32 UTC (rev 19734)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/accepter/AccepterConfig.java	2008-04-27 15:49:55 UTC (rev 19735)
@@ -5,8 +5,10 @@
 
 import com.thoughtworks.xstream.annotations.XStreamAlias;
 import com.thoughtworks.xstream.annotations.XStreamImplicit;
+import org.apache.commons.lang.ObjectUtils;
 import org.drools.solver.core.localsearch.decider.accepter.Accepter;
 import org.drools.solver.core.localsearch.decider.accepter.CompositeAccepter;
+import org.drools.solver.core.localsearch.decider.accepter.greatdeluge.GreatDelugeAccepter;
 import org.drools.solver.core.localsearch.decider.accepter.simulatedannealing.SimulatedAnnealingAccepter;
 import org.drools.solver.core.localsearch.decider.accepter.tabu.MoveTabuAccepter;
 import org.drools.solver.core.localsearch.decider.accepter.tabu.PropertyTabuAccepter;
@@ -33,6 +35,9 @@
     protected Integer completeSolutionTabuSize = null;
     protected Integer partialSolutionTabuSize = null;
 
+    protected Double greatDelugeWaterLevelUpperBoundRate = null;
+    protected Double greatDelugeWaterRisingRate = null;
+
     public Accepter getAccepter() {
         return accepter;
     }
@@ -121,6 +126,14 @@
         this.partialSolutionTabuSize = partialSolutionTabuSize;
     }
 
+    public void setGreatDelugeWaterLevelUpperBoundRate(Double greatDelugeWaterLevelUpperBoundRate) {
+        this.greatDelugeWaterLevelUpperBoundRate = greatDelugeWaterLevelUpperBoundRate;
+    }
+
+    public void setGreatDelugeWaterRisingRate(Double greatDelugeWaterRisingRate) {
+        this.greatDelugeWaterRisingRate = greatDelugeWaterRisingRate;
+    }
+
     // ************************************************************************
     // Builder methods
     // ************************************************************************
@@ -143,7 +156,7 @@
         }
 
         if ((accepterTypeList != null && accepterTypeList.contains(AccepterType.MOVE_TABU))
-                ||  completeMoveTabuSize != null || partialMoveTabuSize != null) {
+                || completeMoveTabuSize != null || partialMoveTabuSize != null) {
             MoveTabuAccepter moveTabuAccepter = new MoveTabuAccepter();
             moveTabuAccepter.setUseUndoMoveAsTabuMove(false);
             if (completeMoveTabuSize != null) {
@@ -155,7 +168,7 @@
             accepterList.add(moveTabuAccepter);
         }
         if ((accepterTypeList != null && accepterTypeList.contains(AccepterType.UNDO_MOVE_TABU))
-                ||  completeUndoMoveTabuSize != null || partialUndoMoveTabuSize != null) {
+                || completeUndoMoveTabuSize != null || partialUndoMoveTabuSize != null) {
             MoveTabuAccepter undoMoveTabuAccepter = new MoveTabuAccepter();
             undoMoveTabuAccepter.setUseUndoMoveAsTabuMove(true);
             if (completeUndoMoveTabuSize != null) {
@@ -167,7 +180,7 @@
             accepterList.add(undoMoveTabuAccepter);
         }
         if ((accepterTypeList != null && accepterTypeList.contains(AccepterType.PROPERTY_TABU))
-                ||  completePropertyTabuSize != null || partialPropertyTabuSize != null) {
+                || completePropertyTabuSize != null || partialPropertyTabuSize != null) {
             PropertyTabuAccepter propertyTabuAccepter = new PropertyTabuAccepter();
             if (completePropertyTabuSize != null) {
                 propertyTabuAccepter.setCompleteTabuSize(completePropertyTabuSize);
@@ -178,7 +191,7 @@
             accepterList.add(propertyTabuAccepter);
         }
         if ((accepterTypeList != null && accepterTypeList.contains(AccepterType.SOLUTION_TABU))
-                ||  completeSolutionTabuSize != null || partialSolutionTabuSize != null) {
+                || completeSolutionTabuSize != null || partialSolutionTabuSize != null) {
             SolutionTabuAccepter solutionTabuAccepter = new SolutionTabuAccepter();
             if (completeSolutionTabuSize != null) {
                 solutionTabuAccepter.setCompleteTabuSize(completeSolutionTabuSize);
@@ -192,10 +205,14 @@
             SimulatedAnnealingAccepter simulatedAnnealingAccepter = new SimulatedAnnealingAccepter();
             accepterList.add(simulatedAnnealingAccepter);
         }
-        if ((accepterTypeList != null && accepterTypeList.contains(AccepterType.GREAT_DELUGE))) {
-            throw new UnsupportedOperationException();
+        if ((accepterTypeList != null && accepterTypeList.contains(AccepterType.GREAT_DELUGE))
+                || greatDelugeWaterLevelUpperBoundRate != null || greatDelugeWaterRisingRate != null) {
+            double waterLevelUpperBoundRate = (Double) ObjectUtils.defaultIfNull(
+                    greatDelugeWaterLevelUpperBoundRate, 1.20);
+            double waterRisingRate = (Double) ObjectUtils.defaultIfNull(
+                    greatDelugeWaterRisingRate, 0.0000001);
+            accepterList.add(new GreatDelugeAccepter(waterLevelUpperBoundRate, waterRisingRate));
         }
-        
         if (accepterList.size() == 1) {
             return accepterList.get(0);
         } else if (accepterList.size() > 1) {
@@ -233,7 +250,7 @@
             completeMoveTabuSize = inheritedConfig.getCompleteMoveTabuSize();
         }
         if (partialMoveTabuSize == null) {
-            partialMoveTabuSize = inheritedConfig.getPartialMoveTabuSize();;
+            partialMoveTabuSize = inheritedConfig.getPartialMoveTabuSize();
         }
         if (completeUndoMoveTabuSize == null) {
             completeUndoMoveTabuSize = inheritedConfig.getCompleteUndoMoveTabuSize();

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/greatdeluge/GreatDelugeAccepter.java (from rev 19626, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/simulatedannealing/SimulatedAnnealingAccepter.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/greatdeluge/GreatDelugeAccepter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/greatdeluge/GreatDelugeAccepter.java	2008-04-27 15:49:55 UTC (rev 19735)
@@ -0,0 +1,71 @@
+package org.drools.solver.core.localsearch.decider.accepter.greatdeluge;
+
+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.localsearch.decider.accepter.AbstractAccepter;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class GreatDelugeAccepter extends AbstractAccepter {
+
+    protected final double waterLevelUpperBoundRate;
+    protected final double waterRisingRate;
+    // TODO lowerboundRate when waterLevel rises on every MoveScope (not just every step) to reset waterlevel to upperbound
+//    protected final double waterLevelLowerBoundRate;
+    protected final double perfectScore;
+
+    protected double waterLevelScore = Double.NaN;
+
+    public GreatDelugeAccepter(double waterLevelUpperBoundRate, double waterRisingRate) {
+        this(waterLevelUpperBoundRate, waterRisingRate, 0.0);
+    }
+
+    public GreatDelugeAccepter(double waterLevelUpperBoundRate, double waterRisingRate, double perfectScore) {
+        this.waterLevelUpperBoundRate = waterLevelUpperBoundRate;
+        this.waterRisingRate = waterRisingRate;
+        this.perfectScore = perfectScore;
+    }
+
+    // ************************************************************************
+    // Worker methods
+    // ************************************************************************
+
+    @Override
+    public void solvingStarted(LocalSearchSolverScope localSearchSolverScope) {
+        if (waterLevelUpperBoundRate < 1.0) {
+            throw new IllegalArgumentException("The greatDelugeWaterLevelUpperBoundRate (" + waterLevelUpperBoundRate
+                    + ") should be 1.0 or higher.");
+        }
+        if (waterRisingRate <= 0.0 || waterRisingRate >= 1.0) {
+            throw new IllegalArgumentException("The greatDelugeWaterRisingRate (" + waterRisingRate
+                    + ") should be between 0.0 and 1.0 (preferably very close to 0.0).");
+        }
+        waterLevelScore = localSearchSolverScope.getBestScore() * waterLevelUpperBoundRate;
+        if (waterLevelScore >= perfectScore) {
+            throw new IllegalArgumentException("The waterLevelScore (" + waterLevelScore
+                    + ") should be higher than the perfectScore(" + perfectScore + ").");
+        }
+    }
+
+    @Override
+    public double calculateAcceptChance(MoveScope moveScope) {
+        if (moveScope.getScore() >= waterLevelScore) {
+            return 1.0;
+        }
+        return 0.0;
+    }
+
+    @Override
+    public void stepTaken(StepScope stepScope) {
+        if (stepScope.getStepIndex() == stepScope.getLocalSearchSolverScope().getBestSolutionStepIndex()) {
+            // New best score
+            waterLevelScore = stepScope.getLocalSearchSolverScope().getBestScore() * waterLevelUpperBoundRate;
+        } else {
+            waterLevelScore += (perfectScore - waterLevelScore) * waterRisingRate;
+            // TODO maybe if waterlevel is higher than bestScore, than ...
+        }
+    }
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/tabu/AbstractTabuAccepter.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/tabu/AbstractTabuAccepter.java	2008-04-27 11:05:32 UTC (rev 19734)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/tabu/AbstractTabuAccepter.java	2008-04-27 15:49:55 UTC (rev 19735)
@@ -47,12 +47,12 @@
     @Override
     public void solvingStarted(LocalSearchSolverScope localSearchSolverScope) {
         if (completeTabuSize < 0) {
-            throw new IllegalArgumentException("Property completeTabuSize (" + completeTabuSize
-                    + ") is negative.");
+            throw new IllegalArgumentException("The completeTabuSize (" + completeTabuSize
+                    + ") cannot be negative.");
         }
         if (partialTabuSize < 0) {
-            throw new IllegalArgumentException("Property partialTabuSize (" + partialTabuSize
-                    + ") is negative.");
+            throw new IllegalArgumentException("The partialTabuSize (" + partialTabuSize
+                    + ") cannot be negative.");
         }
         if (completeTabuSize + partialTabuSize == 0) {
             throw new IllegalArgumentException("The sum of completeTabuSize and partialTabuSize should be at least 1.");

Modified: 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/AcceptedForager.java	2008-04-27 11:05:32 UTC (rev 19734)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForager.java	2008-04-27 15:49:55 UTC (rev 19735)
@@ -81,9 +81,13 @@
                 throw new IllegalStateException("pickEarlyByScore (" + pickEarlyByScore + ") not implemented");
         }
         if (pickEarlyRandomly) {
-            double randomChance = moveScope.getWorkingRandom().nextDouble();
-            if (randomChance <= moveScope.getAcceptChance()) {
+            if (moveScope.getAcceptChance() >= 1.0) {
                 earlyPickedMoveScope = moveScope;
+            } else {
+                double randomChance = moveScope.getWorkingRandom().nextDouble();
+                if (randomChance <= moveScope.getAcceptChance()) {
+                    earlyPickedMoveScope = moveScope;
+                }
             }
         }
     }

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/accepter/greatdeluge/GreatDelugeAccepterTest.java (from rev 19730, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForagerTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/accepter/greatdeluge/GreatDelugeAccepterTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/accepter/greatdeluge/GreatDelugeAccepterTest.java	2008-04-27 15:49:55 UTC (rev 19735)
@@ -0,0 +1,66 @@
+package org.drools.solver.core.localsearch.decider.accepter.greatdeluge;
+
+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.localsearch.decider.accepter.Accepter;
+import org.drools.solver.core.move.DummyMove;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class GreatDelugeAccepterTest extends TestCase {
+
+    public void testCalculateAcceptChance() {
+        // Setup
+        Accepter accepter = new GreatDelugeAccepter(1.20, 0.01);
+        LocalSearchSolverScope localSearchSolverScope = createLocalSearchSolverScope();
+        accepter.solvingStarted(localSearchSolverScope);
+        StepScope stepScope = new StepScope(localSearchSolverScope);
+        accepter.beforeDeciding(stepScope);
+        // Pre conditions
+        MoveScope a1 = createMoveScope(stepScope, -2000.0);
+        MoveScope a2 = createMoveScope(stepScope, -1300.0);
+        MoveScope a3 = createMoveScope(stepScope, -1200.0);
+        MoveScope b1 = createMoveScope(stepScope, -1200.0);
+        MoveScope b2 = createMoveScope(stepScope, -900.0);
+        MoveScope c1 = createMoveScope(stepScope, -1100.0);
+        // Do stuff
+        assertEquals(0.0, accepter.calculateAcceptChance(a1));
+        assertEquals(0.0, accepter.calculateAcceptChance(a2));
+        assertEquals(1.0, accepter.calculateAcceptChance(a3));
+        accepter.stepTaken(stepScope);
+        assertEquals(0.0, accepter.calculateAcceptChance(b1));
+        assertEquals(1.0, accepter.calculateAcceptChance(b2));
+        accepter.stepTaken(stepScope);
+        assertEquals(1.0, accepter.calculateAcceptChance(c1));
+        accepter.stepTaken(stepScope);
+        // Post conditions
+        accepter.solvingEnded(localSearchSolverScope);
+    }
+
+    private LocalSearchSolverScope createLocalSearchSolverScope() {
+        LocalSearchSolverScope localSearchSolverScope = new LocalSearchSolverScope();
+        localSearchSolverScope.setWorkingRandom(new Random() {
+            public double nextDouble() {
+                return 0.2;
+            }
+        });
+        localSearchSolverScope.setBestScore(-1000.0);
+        StepScope lastStepScope = new StepScope(localSearchSolverScope);
+        lastStepScope.setScore(-1000.0);
+        localSearchSolverScope.setLastCompletedStepScope(lastStepScope);
+        return localSearchSolverScope;
+    }
+
+    public MoveScope createMoveScope(StepScope stepScope, double score) {
+        MoveScope moveScope = new MoveScope(stepScope);
+        moveScope.setMove(new DummyMove());
+        moveScope.setScore(score);
+        return moveScope;
+    }
+
+}
\ No newline at end of file




More information about the jboss-svn-commits mailing list