[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