[jboss-svn-commits] JBL Code SVN: r33823 - in labs/jbossrules/trunk: drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/decider/acceptor and 3 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sun Jul 11 08:21:44 EDT 2010
Author: ge0ffrey
Date: 2010-07-11 08:21:44 -0400 (Sun, 11 Jul 2010)
New Revision: 33823
Added:
labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/LegacySimulatedAnnealingAcceptor.java
labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/SimulatedAnnealingAcceptor.java
Removed:
labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/SimulatedAnnealingAcceptor.java
labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/TimeGradientBasedSimulatedAnnealingAcceptor.java
Modified:
labs/jbossrules/trunk/drools-docs/drools-docs-planner/src/main/docbook/en-US/Chapter-Local_search/Chapter-Local_search.xml
labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/decider/acceptor/AcceptorConfig.java
labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringMediumSolverBenchmarkConfig.xml
labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml
Log:
SimulatedAnnealing: simpler configuration
Modified: labs/jbossrules/trunk/drools-docs/drools-docs-planner/src/main/docbook/en-US/Chapter-Local_search/Chapter-Local_search.xml
===================================================================
--- labs/jbossrules/trunk/drools-docs/drools-docs-planner/src/main/docbook/en-US/Chapter-Local_search/Chapter-Local_search.xml 2010-07-10 23:08:34 UTC (rev 33822)
+++ labs/jbossrules/trunk/drools-docs/drools-docs-planner/src/main/docbook/en-US/Chapter-Local_search/Chapter-Local_search.xml 2010-07-11 12:21:44 UTC (rev 33823)
@@ -137,7 +137,7 @@
}</programlisting>
- <para>An instance of <literal>YChangeMove</literal> moves a queen from it's current y to a different y.</para>
+ <para>An instance of <literal>YChangeMove</literal> moves a queen from its current y to a different y.</para>
<para>Drools Planner calls the <literal>doMove(WorkingMemory)</literal> method to do a move. The
<literal>Move</literal> implementation must notify the working memory of any changes it does on the solution
@@ -168,7 +168,7 @@
</listitem>
</itemizedlist>
- <para>In the n queens example, a move which moves the queen from it's current row to the same row isn't
+ <para>In the n queens example, a move which moves the queen from its current row to the same row isn't
doable:</para>
<programlisting> public boolean isMoveDoable(WorkingMemory workingMemory) {
@@ -379,7 +379,7 @@
</listitem>
<listitem>
- <para>It can start walking in it's own footsteps, picking the same next step at every step.</para>
+ <para>It can start walking in its own footsteps, picking the same next step at every step.</para>
</listitem>
</itemizedlist>
@@ -563,38 +563,40 @@
<section>
<title>Simulated annealing acceptor</title>
- <para>Simulated annealing does not always pick the move with the highest score, neither does it evaluate all
- moves. At least at first. It gives unimproving moves also a chance, depending on it's score and the temperature.
- The <emphasis>temperature</emphasis> is relative to how long it has been solving. In the end, it gradually turns
- into a simple local search, only accepting improving moves.</para>
+ <para>Simulated annealing does not always pick the move with the highest score, neither does it evaluate many
+ moves per step. At least at first. Instead, it gives unimproving moves also a chance to be picked, depending on
+ its score and the time gradient of the <literal>Termination</literal>. In the end, it gradually turns into a
+ simple local search, only accepting improving moves.</para>
- <para>Unlike the tabu search acceptor, tweaking a simulated annealing is difficult and a wrong setting can make
- the entire solver useless. However, in many cases, simulated annealing surpasses tabu search.</para>
+ <para>In many use cases, simulated annealing surpasses tabu search. By changing a few lines of configuration,
+ you can easily switch from tabu search to simulated annealing and back.</para>
- <para>Set your <literal>simulatedAnnealingStartingTemperature</literal> to the maximum score delta a single move
- can cause.</para>
+ <para>Start with a <literal>simulatedAnnealingStartingTemperature</literal> set to the maximum score delta a
+ single move can cause. Use the <literal>Benchmarker</literal> to tweak the value.</para>
<programlisting> <acceptor>
<simulatedAnnealingStartingTemperature>10.0</simulatedAnnealingStartingTemperature>
- <simulatedAnnealingTemperatureSurvival>0.997</simulatedAnnealingTemperatureSurvival>
</acceptor>
<forager>
<minimalAcceptedSelection>4</minimalAcceptedSelection>
</forager></programlisting>
<para>A simulated annealing acceptor should be combined with a low subset selection. The classic algorithm uses
- a <literal>minimalAcceptedSelection</literal> of <literal>1</literal>, but usually <literal>4</literal>
- performs better.</para>
+ a <literal>minimalAcceptedSelection</literal> of <literal>1</literal>, but usually <literal>4</literal> performs
+ better.</para>
- <para>You can even combine it with a tabu acceptor at the same time:</para>
+ <para>You can even combine it with a tabu acceptor at the same time. Use a lower tabu size than in a pure tabu
+ search configuration.</para>
<programlisting> <acceptor>
<simulatedAnnealingStartingTemperature>10.0</simulatedAnnealingStartingTemperature>
- <simulatedAnnealingTemperatureSurvival>0.997</simulatedAnnealingTemperatureSurvival>
<completePropertyTabuSize>5</completePropertyTabuSize>
- </acceptor></programlisting>
+ </acceptor>
+ <forager>
+ <minimalAcceptedSelection>4</minimalAcceptedSelection>
+ </forager></programlisting>
- <para>This differs from phasing, another interesting technique, where first simulated annealing is used, followed
+ <para>This differs from phasing, another powerfull technique, where first simulated annealing is used, followed
by tabu search.</para>
</section>
</section>
@@ -627,9 +629,9 @@
</listitem>
</itemizedlist>
- <para>Unlike the n queens problem, real world problems require the use of subset selection. We recommend to
- start from an <literal>minimalAcceptedSelection</literal> that takes a step in less then 2 seconds and use the
- <literal>Benchmarker</literal> to tune it. Turn on INFO logging to see the step times.</para>
+ <para>Unlike the n queens problem, real world problems require the use of subset selection. Start from an
+ <literal>minimalAcceptedSelection</literal> that takes a step in less then 2 seconds. Turn on INFO logging to
+ see the step times. Use the <literal>Benchmarker</literal> to tweak the value.</para>
</section>
<section>
@@ -659,8 +661,8 @@
<listitem>
<para><literal>FIRST_LAST_STEP_SCORE_IMPROVING</literal>: Pick the first accepted move that improves the
- last step score. If none improve the last step score, it behaves exactly like the pickEarlyType NEVER.
- </para>
+ last step score. If none improve the last step score, it behaves exactly like the pickEarlyType
+ NEVER.</para>
<programlisting> <forager>
<pickEarlyType>FIRST_LAST_STEP_SCORE_IMPROVING</pickEarlyType>
@@ -701,9 +703,13 @@
optimal solution. For real-life problems this doesn't turn out to be much of a problem, because finding the optimal
solution would take billions of years, so you 'll want to terminate sooner anyway.</para>
- <para>You can configure when a local search solver needs to stop by configuring a Termination. You can implement
- your own <literal>Termination</literal>, although the build-in Terminations should suffice for most needs.</para>
+ <para>You can configure when a local search solver needs to stop by configuring a <literal>Termination</literal>. A
+ <literal>Termination</literal> can calculate a time gradient, which is a ratio between the time already spend
+ solving and the expected entire solving time.</para>
+ <para>You can implement your own <literal>Termination</literal>, although the build-in Terminations should suffice
+ for most needs.</para>
+
<section>
<title>TimeMillisSpendTermination</title>
Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/decider/acceptor/AcceptorConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/decider/acceptor/AcceptorConfig.java 2010-07-10 23:08:34 UTC (rev 33822)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/config/localsearch/decider/acceptor/AcceptorConfig.java 2010-07-11 12:21:44 UTC (rev 33823)
@@ -9,8 +9,8 @@
import org.drools.planner.core.localsearch.decider.acceptor.Acceptor;
import org.drools.planner.core.localsearch.decider.acceptor.CompositeAcceptor;
import org.drools.planner.core.localsearch.decider.acceptor.greatdeluge.GreatDelugeAcceptor;
+import org.drools.planner.core.localsearch.decider.acceptor.simulatedannealing.LegacySimulatedAnnealingAcceptor;
import org.drools.planner.core.localsearch.decider.acceptor.simulatedannealing.SimulatedAnnealingAcceptor;
-import org.drools.planner.core.localsearch.decider.acceptor.simulatedannealing.TimeGradientBasedSimulatedAnnealingAcceptor;
import org.drools.planner.core.localsearch.decider.acceptor.tabu.MoveTabuAcceptor;
import org.drools.planner.core.localsearch.decider.acceptor.tabu.PropertyTabuAcceptor;
import org.drools.planner.core.localsearch.decider.acceptor.tabu.SolutionTabuAcceptor;
@@ -227,9 +227,6 @@
if (simulatedAnnealingStartingTemperature != null) {
simulatedAnnealingAcceptor.setStartingTemperature(simulatedAnnealingStartingTemperature);
}
- if (simulatedAnnealingTemperatureSurvival != null) {
- simulatedAnnealingAcceptor.setTemperatureSurvival(simulatedAnnealingTemperatureSurvival);
- }
acceptorList.add(simulatedAnnealingAcceptor);
}
if ((acceptorTypeList != null && acceptorTypeList.contains(AcceptorType.GREAT_DELUGE))
@@ -240,6 +237,10 @@
greatDelugeWaterRisingRate, 0.0000001);
acceptorList.add(new GreatDelugeAcceptor(waterLevelUpperBoundRate, waterRisingRate));
}
+ if ((acceptorTypeList != null && acceptorTypeList.contains(AcceptorType.LATE_ACCEPTANCE))) {
+ // TODO implement LATE_ACCEPTANCE
+ throw new UnsupportedOperationException("LATE_ACCEPTANCE not yet supported.");
+ }
if (acceptorList.size() == 1) {
return acceptorList.get(0);
} else if (acceptorList.size() > 1) {
@@ -314,6 +315,7 @@
PROPERTY_TABU,
SOLUTION_TABU,
SIMULATED_ANNEALING,
+ LATE_ACCEPTANCE,
GREAT_DELUGE,
}
Copied: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/LegacySimulatedAnnealingAcceptor.java (from rev 33650, labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/SimulatedAnnealingAcceptor.java)
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/LegacySimulatedAnnealingAcceptor.java (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/LegacySimulatedAnnealingAcceptor.java 2010-07-11 12:21:44 UTC (rev 33823)
@@ -0,0 +1,77 @@
+package org.drools.planner.core.localsearch.decider.acceptor.simulatedannealing;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Random;
+
+import org.drools.planner.core.localsearch.StepScope;
+import org.drools.planner.core.localsearch.decider.MoveScope;
+import org.drools.planner.core.localsearch.decider.acceptor.AbstractAcceptor;
+import org.drools.planner.core.localsearch.LocalSearchSolverScope;
+import org.drools.planner.core.score.Score;
+
+/**
+ * TODO this will be removed once the time gradient based {@link SimulatedAnnealingAcceptor} is always better.
+ * @author Geoffrey De Smet
+ */
+public class LegacySimulatedAnnealingAcceptor extends AbstractAcceptor {
+
+ protected double startingTemperature = -1.0;
+ protected double temperatureSurvival = 0.997;
+
+ protected double temperature;
+
+ public void setStartingTemperature(double startingTemperature) {
+ this.startingTemperature = startingTemperature;
+ }
+
+ public void setTemperatureSurvival(double temperatureSurvival) {
+ this.temperatureSurvival = temperatureSurvival;
+ }
+
+ // ************************************************************************
+ // Worker methods
+ // ************************************************************************
+
+ @Override
+ public void solvingStarted(LocalSearchSolverScope localSearchSolverScope) {
+ if (startingTemperature <= 0.0) {
+ throw new IllegalArgumentException("The startingTemperature (" + startingTemperature
+ + ") cannot be negative or zero.");
+ }
+ if (temperatureSurvival <= 0.0) {
+ throw new IllegalArgumentException("The temperatureSurvival (" + temperatureSurvival
+ + ") cannot be negative or zero.");
+ }
+ temperature = startingTemperature;
+ }
+
+ public double calculateAcceptChance(MoveScope moveScope) {
+ LocalSearchSolverScope localSearchSolverScope = moveScope.getStepScope().getLocalSearchSolverScope();
+ Score lastStepScore = localSearchSolverScope.getLastCompletedStepScope().getScore();
+ Score moveScore = moveScope.getScore();
+ if (moveScore.compareTo(lastStepScore) > 0) {
+ return 1.0;
+ }
+ Score scoreDifference = lastStepScore.subtract(moveScore);
+ // TODO don't abuse translateScoreToGraphValue
+ Double diff = localSearchSolverScope.getScoreDefinition().translateScoreToGraphValue(scoreDifference);
+ if (diff == null) {
+ // more hard constraints broken, ignore it for now
+ return 0.0;
+ }
+ double acceptChance = Math.exp(-diff / temperature);
+ if (moveScope.getWorkingRandom().nextDouble() < acceptChance) {
+ return 1.0;
+ } else {
+ return 0.0;
+ }
+ }
+
+ @Override
+ public void stepTaken(StepScope stepScope) {
+ super.stepTaken(stepScope);
+ temperature *= temperatureSurvival;
+ }
+
+}
Deleted: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/SimulatedAnnealingAcceptor.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/SimulatedAnnealingAcceptor.java 2010-07-10 23:08:34 UTC (rev 33822)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/SimulatedAnnealingAcceptor.java 2010-07-11 12:21:44 UTC (rev 33823)
@@ -1,76 +0,0 @@
-package org.drools.planner.core.localsearch.decider.acceptor.simulatedannealing;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.Random;
-
-import org.drools.planner.core.localsearch.StepScope;
-import org.drools.planner.core.localsearch.decider.MoveScope;
-import org.drools.planner.core.localsearch.decider.acceptor.AbstractAcceptor;
-import org.drools.planner.core.localsearch.LocalSearchSolverScope;
-import org.drools.planner.core.score.Score;
-
-/**
- * @author Geoffrey De Smet
- */
-public class SimulatedAnnealingAcceptor extends AbstractAcceptor {
-
- protected double startingTemperature = -1.0;
- protected double temperatureSurvival = 0.997;
-
- protected double temperature;
-
- public void setStartingTemperature(double startingTemperature) {
- this.startingTemperature = startingTemperature;
- }
-
- public void setTemperatureSurvival(double temperatureSurvival) {
- this.temperatureSurvival = temperatureSurvival;
- }
-
- // ************************************************************************
- // Worker methods
- // ************************************************************************
-
- @Override
- public void solvingStarted(LocalSearchSolverScope localSearchSolverScope) {
- if (startingTemperature <= 0.0) {
- throw new IllegalArgumentException("The startingTemperature (" + startingTemperature
- + ") cannot be negative or zero.");
- }
- if (temperatureSurvival <= 0.0) {
- throw new IllegalArgumentException("The temperatureSurvival (" + temperatureSurvival
- + ") cannot be negative or zero.");
- }
- temperature = startingTemperature;
- }
-
- public double calculateAcceptChance(MoveScope moveScope) {
- LocalSearchSolverScope localSearchSolverScope = moveScope.getStepScope().getLocalSearchSolverScope();
- Score lastStepScore = localSearchSolverScope.getLastCompletedStepScope().getScore();
- Score moveScore = moveScope.getScore();
- if (moveScore.compareTo(lastStepScore) > 0) {
- return 1.0;
- }
- Score scoreDifference = lastStepScore.subtract(moveScore);
- // TODO don't abuse translateScoreToGraphValue
- Double diff = localSearchSolverScope.getScoreDefinition().translateScoreToGraphValue(scoreDifference);
- if (diff == null) {
- // more hard constraints broken, ignore it for now
- return 0.0;
- }
- double acceptChance = Math.exp(-diff / temperature);
- if (moveScope.getWorkingRandom().nextDouble() < acceptChance) {
- return 1.0;
- } else {
- return 0.0;
- }
- }
-
- @Override
- public void stepTaken(StepScope stepScope) {
- super.stepTaken(stepScope);
- temperature *= temperatureSurvival;
- }
-
-}
Copied: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/SimulatedAnnealingAcceptor.java (from rev 33806, labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/TimeGradientBasedSimulatedAnnealingAcceptor.java)
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/SimulatedAnnealingAcceptor.java (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/SimulatedAnnealingAcceptor.java 2010-07-11 12:21:44 UTC (rev 33823)
@@ -0,0 +1,74 @@
+package org.drools.planner.core.localsearch.decider.acceptor.simulatedannealing;
+
+import org.drools.planner.core.localsearch.LocalSearchSolverScope;
+import org.drools.planner.core.localsearch.StepScope;
+import org.drools.planner.core.localsearch.decider.MoveScope;
+import org.drools.planner.core.localsearch.decider.acceptor.AbstractAcceptor;
+import org.drools.planner.core.score.Score;
+
+/**
+ * The time gradient implementation of simulated annealing.
+ * @author Geoffrey De Smet
+ */
+public class SimulatedAnnealingAcceptor extends AbstractAcceptor {
+
+ protected double startingTemperature = 1.0;
+
+ protected double temperature;
+ protected double temperatureMinimum = Double.MIN_NORMAL;
+
+ public void setStartingTemperature(double startingTemperature) {
+ this.startingTemperature = startingTemperature;
+ }
+
+ // ************************************************************************
+ // Worker methods
+ // ************************************************************************
+
+ @Override
+ public void solvingStarted(LocalSearchSolverScope localSearchSolverScope) {
+ if (startingTemperature < 0.0) {
+ throw new IllegalArgumentException("The startingTemperature (" + startingTemperature
+ + ") cannot be negative.");
+ }
+ if (startingTemperature < temperatureMinimum) {
+ throw new IllegalArgumentException("The startingTemperature (" + startingTemperature
+ + ") cannot be less than the temperatureMinimum (" + temperatureMinimum + ").");
+ }
+ temperature = startingTemperature;
+ }
+
+ public double calculateAcceptChance(MoveScope moveScope) {
+ LocalSearchSolverScope localSearchSolverScope = moveScope.getStepScope().getLocalSearchSolverScope();
+ Score lastStepScore = localSearchSolverScope.getLastCompletedStepScope().getScore();
+ Score moveScore = moveScope.getScore();
+ if (moveScore.compareTo(lastStepScore) > 0) {
+ return 1.0;
+ }
+ Score scoreDifference = lastStepScore.subtract(moveScore);
+ // TODO don't abuse translateScoreToGraphValue
+ Double diff = localSearchSolverScope.getScoreDefinition().translateScoreToGraphValue(scoreDifference);
+ if (diff == null) {
+ // more hard constraints broken, ignore it for now
+ return 0.0;
+ }
+ double acceptChance = Math.exp(-diff / temperature);
+ if (moveScope.getWorkingRandom().nextDouble() < acceptChance) {
+ return 1.0;
+ } else {
+ return 0.0;
+ }
+ }
+
+ @Override
+ public void stepTaken(StepScope stepScope) {
+ super.stepTaken(stepScope);
+ double timeGradient = stepScope.getTimeGradient();
+ temperature = startingTemperature * (1.0 - timeGradient);
+ if (temperature < temperatureMinimum) {
+ temperature = temperatureMinimum;
+ }
+ // TODO implement reheating
+ }
+
+}
Deleted: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/TimeGradientBasedSimulatedAnnealingAcceptor.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/TimeGradientBasedSimulatedAnnealingAcceptor.java 2010-07-10 23:08:34 UTC (rev 33822)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/decider/acceptor/simulatedannealing/TimeGradientBasedSimulatedAnnealingAcceptor.java 2010-07-11 12:21:44 UTC (rev 33823)
@@ -1,68 +0,0 @@
-package org.drools.planner.core.localsearch.decider.acceptor.simulatedannealing;
-
-import org.drools.planner.core.localsearch.LocalSearchSolverScope;
-import org.drools.planner.core.localsearch.StepScope;
-import org.drools.planner.core.localsearch.decider.MoveScope;
-import org.drools.planner.core.localsearch.decider.acceptor.AbstractAcceptor;
-import org.drools.planner.core.score.Score;
-
-/**
- * @author Geoffrey De Smet
- */
-public class TimeGradientBasedSimulatedAnnealingAcceptor extends AbstractAcceptor {
-
- protected double startingTemperature = 1.0;
-
- protected double temperature;
- protected double temperatureMinimum = Double.MIN_NORMAL;
-
- public void setStartingTemperature(double startingTemperature) {
- this.startingTemperature = startingTemperature;
- }
-
- // ************************************************************************
- // Worker methods
- // ************************************************************************
-
- @Override
- public void solvingStarted(LocalSearchSolverScope localSearchSolverScope) {
- if (startingTemperature < 0.0) {
- throw new IllegalArgumentException("The startingTemperature (" + startingTemperature
- + ") cannot be negative.");
- }
- temperature = startingTemperature;
- }
-
- public double calculateAcceptChance(MoveScope moveScope) {
- LocalSearchSolverScope localSearchSolverScope = moveScope.getStepScope().getLocalSearchSolverScope();
- Score lastStepScore = localSearchSolverScope.getLastCompletedStepScope().getScore();
- Score moveScore = moveScope.getScore();
- if (moveScore.compareTo(lastStepScore) > 0) {
- return 1.0;
- }
- Score scoreDifference = lastStepScore.subtract(moveScore);
- // TODO don't abuse translateScoreToGraphValue
- Double diff = localSearchSolverScope.getScoreDefinition().translateScoreToGraphValue(scoreDifference);
- if (diff == null) {
- // more hard constraints broken, ignore it for now
- return 0.0;
- }
- double acceptChance = Math.exp(-diff / temperature);
- if (moveScope.getWorkingRandom().nextDouble() < acceptChance) {
- return 1.0;
- } else {
- return 0.0;
- }
- }
-
- @Override
- public void stepTaken(StepScope stepScope) {
- super.stepTaken(stepScope);
- double timeGradient = stepScope.getTimeGradient();
- temperature = startingTemperature * (1.0 - timeGradient);
- if (temperature < temperatureMinimum) {
- temperature = temperatureMinimum;
- }
- }
-
-}
Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringMediumSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringMediumSolverBenchmarkConfig.xml 2010-07-10 23:08:34 UTC (rev 33822)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/benchmark/nurseRosteringMediumSolverBenchmarkConfig.xml 2010-07-11 12:21:44 UTC (rev 33823)
@@ -10,9 +10,9 @@
<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium03.xml</inheritedUnsolvedSolutionFile>
<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium04.xml</inheritedUnsolvedSolutionFile>
<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium05.xml</inheritedUnsolvedSolutionFile>
- <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_hint01.xml</inheritedUnsolvedSolutionFile>-->
- <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_hint02.xml</inheritedUnsolvedSolutionFile>-->
- <!--<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_hint03.xml</inheritedUnsolvedSolutionFile>-->
+ <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_hint01.xml</inheritedUnsolvedSolutionFile>
+ <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_hint02.xml</inheritedUnsolvedSolutionFile>
+ <inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_hint03.xml</inheritedUnsolvedSolutionFile>
<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_late01.xml</inheritedUnsolvedSolutionFile>
<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_late02.xml</inheritedUnsolvedSolutionFile>
<inheritedUnsolvedSolutionFile>data/nurserostering/unsolved/medium_late03.xml</inheritedUnsolvedSolutionFile>
@@ -35,31 +35,30 @@
</termination>
</inheritedLocalSearchSolver>
- <!--<solverBenchmark>-->
- <!--<name>selection800PillarPart</name>-->
- <!--<localSearchSolver>-->
- <!--<selector>-->
- <!--<selector>-->
- <!--<moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.EmployeeChangeMoveFactory</moveFactoryClass>-->
- <!--</selector>-->
- <!--<selector>-->
- <!--<moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSwitchMoveFactory</moveFactoryClass>-->
- <!--</selector>-->
- <!--<selector>-->
- <!--<moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentPillarPartSwitchMoveFactory</moveFactoryClass>-->
- <!--</selector>-->
- <!--</selector>-->
- <!--<acceptor>-->
- <!--<completeSolutionTabuSize>1000</completeSolutionTabuSize>-->
- <!--<completePropertyTabuSize>11</completePropertyTabuSize>-->
- <!--</acceptor>-->
- <!--<forager>-->
- <!--<pickEarlyType>NEVER</pickEarlyType>-->
- <!--<minimalAcceptedSelection>800</minimalAcceptedSelection>-->
- <!--</forager>-->
- <!--</localSearchSolver>-->
- <!--</solverBenchmark>-->
<solverBenchmark>
+ <name>tabuSearch</name>
+ <localSearchSolver>
+ <selector>
+ <selector>
+ <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.EmployeeChangeMoveFactory</moveFactoryClass>
+ </selector>
+ <selector>
+ <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentSwitchMoveFactory</moveFactoryClass>
+ </selector>
+ <selector>
+ <moveFactoryClass>org.drools.planner.examples.nurserostering.solver.move.factory.AssignmentPillarPartSwitchMoveFactory</moveFactoryClass>
+ </selector>
+ </selector>
+ <acceptor>
+ <completeSolutionTabuSize>1000</completeSolutionTabuSize>
+ <completePropertyTabuSize>11</completePropertyTabuSize>
+ </acceptor>
+ <forager>
+ <minimalAcceptedSelection>800</minimalAcceptedSelection>
+ </forager>
+ </localSearchSolver>
+ </solverBenchmark>
+ <solverBenchmark>
<name>simulatedAnnealing</name>
<localSearchSolver>
<selector>
@@ -74,11 +73,11 @@
</selector>
</selector>
<acceptor>
- <simulatedAnnealingStartingTemperature>10.0</simulatedAnnealingStartingTemperature>
- <simulatedAnnealingTemperatureSurvival>0.997</simulatedAnnealingTemperatureSurvival>
- <completePropertyTabuSize>5</completePropertyTabuSize>
+ <simulatedAnnealingStartingTemperature>10.0</simulatedAnnealingStartingTemperature>
+ <completePropertyTabuSize>5</completePropertyTabuSize>
</acceptor>
<forager>
+ <!--<pickEarlyType>FIRST_BEST_SCORE_IMPROVING</pickEarlyType>-->
<minimalAcceptedSelection>4</minimalAcceptedSelection>
</forager>
</localSearchSolver>
Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml 2010-07-10 23:08:34 UTC (rev 33822)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/resources/org/drools/planner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml 2010-07-11 12:21:44 UTC (rev 33823)
@@ -37,7 +37,6 @@
<completePropertyTabuSize>7</completePropertyTabuSize>
</acceptor>
<forager>
- <pickEarlyType>NEVER</pickEarlyType>
<minimalAcceptedSelection>800</minimalAcceptedSelection>
</forager>
</localSearchSolver>
More information about the jboss-svn-commits
mailing list