[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>    &lt;acceptor&gt;
       &lt;simulatedAnnealingStartingTemperature&gt;10.0&lt;/simulatedAnnealingStartingTemperature&gt;
-      &lt;simulatedAnnealingTemperatureSurvival&gt;0.997&lt;/simulatedAnnealingTemperatureSurvival&gt;
     &lt;/acceptor&gt;
     &lt;forager&gt;
         &lt;minimalAcceptedSelection&gt;4&lt;/minimalAcceptedSelection&gt;
     &lt;/forager&gt;</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>    &lt;acceptor&gt;
       &lt;simulatedAnnealingStartingTemperature&gt;10.0&lt;/simulatedAnnealingStartingTemperature&gt;
-      &lt;simulatedAnnealingTemperatureSurvival&gt;0.997&lt;/simulatedAnnealingTemperatureSurvival&gt;
       &lt;completePropertyTabuSize&gt;5&lt;/completePropertyTabuSize&gt;
-    &lt;/acceptor&gt;</programlisting>
+    &lt;/acceptor&gt;
+    &lt;forager&gt;
+        &lt;minimalAcceptedSelection&gt;4&lt;/minimalAcceptedSelection&gt;
+    &lt;/forager&gt;</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>    &lt;forager&gt;
         &lt;pickEarlyType&gt;FIRST_LAST_STEP_SCORE_IMPROVING&lt;/pickEarlyType&gt;
@@ -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