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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun May 24 09:47:50 EDT 2009


Author: ge0ffrey
Date: 2009-05-24 09:47:49 -0400 (Sun, 24 May 2009)
New Revision: 26709

Added:
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/deciderscorecomparator/
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/deciderscorecomparator/DeciderScoreComparatorFactoryConfig.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/DeciderAware.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/AbstractDeciderScoreComparatorFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/DeciderScoreComparatorFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/HardPenaltyDeciderScoreComparator.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/NaturalDeciderScoreComparator.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/NaturalDeciderScoreComparatorFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/ShiftingHardPenaltyDeciderScoreComparatorFactory.java
Removed:
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/AbstractScoreComparator.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/HardAndSoftScoreComparator.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/ScoreComparator.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/SimpleScoreComparator.java
Modified:
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/LocalSearchSolverConfig.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/forager/ForagerConfig.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/StepScope.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/Decider.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/DefaultDecider.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/AbstractAccepter.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/Accepter.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
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedMoveScopeComparator.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/Forager.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/AbstractSelector.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/CompositeSelector.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/MoveFactorySelector.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/Selector.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/TopListSelector.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/factory/AbstractMoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/factory/MoveFactory.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/ScoreDefinition.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationSolverBenchmarkConfig.xml
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml
Log:
decider score comparator + shifting hard penalty

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/LocalSearchSolverConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/LocalSearchSolverConfig.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/LocalSearchSolverConfig.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -16,6 +16,7 @@
 import org.drools.solver.config.localsearch.decider.accepter.AccepterConfig;
 import org.drools.solver.config.localsearch.decider.forager.ForagerConfig;
 import org.drools.solver.config.localsearch.decider.selector.SelectorConfig;
+import org.drools.solver.config.localsearch.decider.deciderscorecomparator.DeciderScoreComparatorFactoryConfig;
 import org.drools.solver.config.localsearch.finish.FinishConfig;
 import org.drools.solver.config.score.definition.ScoreDefinitionConfig;
 import org.drools.solver.core.localsearch.DefaultLocalSearchSolver;
@@ -45,6 +46,9 @@
     @XStreamAlias("finish")
     private FinishConfig finishConfig = new FinishConfig(); // TODO this new is pointless due to xstream
 
+    @XStreamAlias("deciderScoreComparatorFactory")
+    private DeciderScoreComparatorFactoryConfig deciderScoreComparatorFactoryConfig
+            = new DeciderScoreComparatorFactoryConfig();
     @XStreamAlias("selector")
     private SelectorConfig selectorConfig = new SelectorConfig();
     @XStreamAlias("accepter")
@@ -100,6 +104,15 @@
         this.finishConfig = finishConfig;
     }
 
+    public DeciderScoreComparatorFactoryConfig getDeciderScoreComparatorFactoryConfig() {
+        return deciderScoreComparatorFactoryConfig;
+    }
+
+    public void setDeciderScoreComparatorFactoryConfig(
+            DeciderScoreComparatorFactoryConfig deciderScoreComparatorFactoryConfig) {
+        this.deciderScoreComparatorFactoryConfig = deciderScoreComparatorFactoryConfig;
+    }
+
     public SelectorConfig getSelectorConfig() {
         return selectorConfig;
     }
@@ -196,6 +209,7 @@
 
     private Decider buildDecider() {
         DefaultDecider decider = new DefaultDecider();
+        decider.setDeciderScoreComparator(deciderScoreComparatorFactoryConfig.buildDeciderScoreComparatorFactory());
         decider.setSelector(selectorConfig.buildSelector());
         decider.setAccepter(accepterConfig.buildAccepter());
         decider.setForager(foragerConfig.buildForager());
@@ -232,6 +246,11 @@
         } else if (inheritedConfig.getFinishConfig() != null) {
             finishConfig.inherit(inheritedConfig.getFinishConfig());
         }
+        if (deciderScoreComparatorFactoryConfig == null) {
+            deciderScoreComparatorFactoryConfig = inheritedConfig.getDeciderScoreComparatorFactoryConfig();
+        } else if (inheritedConfig.getDeciderScoreComparatorFactoryConfig() != null) {
+            deciderScoreComparatorFactoryConfig.inherit(inheritedConfig.getDeciderScoreComparatorFactoryConfig());
+        }
         if (selectorConfig == null) {
             selectorConfig = inheritedConfig.getSelectorConfig();
         } else if (inheritedConfig.getSelectorConfig() != null) {

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/deciderscorecomparator/DeciderScoreComparatorFactoryConfig.java (from rev 26379, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/forager/ForagerConfig.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/deciderscorecomparator/DeciderScoreComparatorFactoryConfig.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/deciderscorecomparator/DeciderScoreComparatorFactoryConfig.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -0,0 +1,178 @@
+package org.drools.solver.config.localsearch.decider.deciderscorecomparator;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import org.drools.solver.core.localsearch.decider.deciderscorecomparator.DeciderScoreComparatorFactory;
+import org.drools.solver.core.localsearch.decider.deciderscorecomparator.NaturalDeciderScoreComparatorFactory;
+import org.drools.solver.core.localsearch.decider.deciderscorecomparator.ShiftingHardPenaltyDeciderScoreComparatorFactory;
+
+/**
+ * @author Geoffrey De Smet
+ */
+ at XStreamAlias("deciderScoreComparatorFactory")
+public class DeciderScoreComparatorFactoryConfig {
+
+    private Class<DeciderScoreComparatorFactory> deciderScoreComparatorClass = null;
+    private DeciderScoreComparatorFactoryType deciderScoreComparatorFactoryType = null;
+
+    private Integer hardScoreActivationThreshold = null;
+    private Integer successiveNoHardChangeMinimum = null;
+    private Integer successiveNoHardChangeMaximum = null;
+    private Double successiveNoHardChangeRepetitionMultiplicand = null;
+    private Double hardWeightDegradationRatio = null;
+    private Integer startingHardWeight = null; // TODO determine dynamically
+
+    public Class<DeciderScoreComparatorFactory> getDeciderScoreComparatorClass() {
+        return deciderScoreComparatorClass;
+    }
+
+    public void setDeciderScoreComparatorClass(Class<DeciderScoreComparatorFactory> deciderScoreComparatorClass) {
+        this.deciderScoreComparatorClass = deciderScoreComparatorClass;
+    }
+
+    public DeciderScoreComparatorFactoryType getForagerType() {
+        return deciderScoreComparatorFactoryType;
+    }
+
+    public void setForagerType(DeciderScoreComparatorFactoryType deciderScoreComparatorFactoryType) {
+        this.deciderScoreComparatorFactoryType = deciderScoreComparatorFactoryType;
+    }
+
+    public DeciderScoreComparatorFactoryType getDeciderScoreComparatorFactoryType() {
+        return deciderScoreComparatorFactoryType;
+    }
+
+    public void setDeciderScoreComparatorFactoryType(DeciderScoreComparatorFactoryType deciderScoreComparatorFactoryType) {
+        this.deciderScoreComparatorFactoryType = deciderScoreComparatorFactoryType;
+    }
+
+    public Integer getHardScoreActivationThreshold() {
+        return hardScoreActivationThreshold;
+    }
+
+    public void setHardScoreActivationThreshold(Integer hardScoreActivationThreshold) {
+        this.hardScoreActivationThreshold = hardScoreActivationThreshold;
+    }
+
+    public Integer getSuccessiveNoHardChangeMinimum() {
+        return successiveNoHardChangeMinimum;
+    }
+
+    public void setSuccessiveNoHardChangeMinimum(Integer successiveNoHardChangeMinimum) {
+        this.successiveNoHardChangeMinimum = successiveNoHardChangeMinimum;
+    }
+
+    public Integer getSuccessiveNoHardChangeMaximum() {
+        return successiveNoHardChangeMaximum;
+    }
+
+    public void setSuccessiveNoHardChangeMaximum(Integer successiveNoHardChangeMaximum) {
+        this.successiveNoHardChangeMaximum = successiveNoHardChangeMaximum;
+    }
+
+    public Double getSuccessiveNoHardChangeRepetitionMultiplicand() {
+        return successiveNoHardChangeRepetitionMultiplicand;
+    }
+
+    public void setSuccessiveNoHardChangeRepetitionMultiplicand(Double successiveNoHardChangeRepetitionMultiplicand) {
+        this.successiveNoHardChangeRepetitionMultiplicand = successiveNoHardChangeRepetitionMultiplicand;
+    }
+
+    public Double getHardWeightDegradationRatio() {
+        return hardWeightDegradationRatio;
+    }
+
+    public void setHardWeightDegradationRatio(Double hardWeightDegradationRatio) {
+        this.hardWeightDegradationRatio = hardWeightDegradationRatio;
+    }
+
+    public Integer getStartingHardWeight() {
+        return startingHardWeight;
+    }
+
+    public void setStartingHardWeight(Integer startingHardWeight) {
+        this.startingHardWeight = startingHardWeight;
+    }
+
+    // ************************************************************************
+    // Builder methods
+    // ************************************************************************
+
+    public DeciderScoreComparatorFactory buildDeciderScoreComparatorFactory() {
+        if (deciderScoreComparatorClass != null) {
+            try {
+                return deciderScoreComparatorClass.newInstance();
+            } catch (InstantiationException e) {
+                throw new IllegalArgumentException("deciderScoreComparatorClass ("
+                        + deciderScoreComparatorClass.getName()  + ") does not have a public no-arg constructor", e);
+            } catch (IllegalAccessException e) {
+                throw new IllegalArgumentException("deciderScoreComparatorClass ("
+                        + deciderScoreComparatorClass.getName() + ") does not have a public no-arg constructor", e);
+            }
+        } else if (deciderScoreComparatorFactoryType != null) {
+            switch (deciderScoreComparatorFactoryType) {
+                case NATURAL:
+                    return new NaturalDeciderScoreComparatorFactory();
+                case SHIFTING_HARD_PENALTY:
+                    ShiftingHardPenaltyDeciderScoreComparatorFactory deciderScoreComparator
+                            = new ShiftingHardPenaltyDeciderScoreComparatorFactory();
+                    if (hardScoreActivationThreshold != null) {
+                        deciderScoreComparator.setHardScoreActivationThreshold(hardScoreActivationThreshold);
+                    }
+                    if (successiveNoHardChangeMinimum != null) {
+                        deciderScoreComparator.setSuccessiveNoHardChangeMinimum(successiveNoHardChangeMinimum);
+                    }
+                    if (successiveNoHardChangeMaximum != null) {
+                        deciderScoreComparator.setSuccessiveNoHardChangeMaximum(successiveNoHardChangeMaximum);
+                    }
+                    if (successiveNoHardChangeRepetitionMultiplicand != null) {
+                        deciderScoreComparator.setSuccessiveNoHardChangeRepetitionMultiplicand(
+                                successiveNoHardChangeRepetitionMultiplicand);
+                    }
+                    if (hardWeightDegradationRatio != null) {
+                        deciderScoreComparator.setHardWeightDegradationRatio(hardWeightDegradationRatio);
+                    }
+                    if (startingHardWeight != null) {
+                        deciderScoreComparator.setStartingHardWeight(startingHardWeight);
+                    }
+                    return deciderScoreComparator;
+                default:
+                    throw new IllegalStateException("deciderScoreComparatorFactoryType ("
+                            + deciderScoreComparatorFactoryType + ") not implemented");
+            }
+        } else {
+            return new NaturalDeciderScoreComparatorFactory();
+        }
+    }
+
+    public void inherit(DeciderScoreComparatorFactoryConfig inheritedConfig) {
+        if (deciderScoreComparatorClass == null && deciderScoreComparatorFactoryType == null) {
+            deciderScoreComparatorClass = inheritedConfig.getDeciderScoreComparatorClass();
+            deciderScoreComparatorFactoryType = inheritedConfig.getForagerType();
+        }
+        if (hardScoreActivationThreshold == null) {
+            hardScoreActivationThreshold = inheritedConfig.getHardScoreActivationThreshold();
+        }
+        if (successiveNoHardChangeMinimum == null) {
+            successiveNoHardChangeMinimum = inheritedConfig.getSuccessiveNoHardChangeMinimum();
+        }
+        if (successiveNoHardChangeMaximum == null) {
+            successiveNoHardChangeMaximum = inheritedConfig.getSuccessiveNoHardChangeMaximum();
+        }
+        if (successiveNoHardChangeRepetitionMultiplicand == null) {
+            successiveNoHardChangeRepetitionMultiplicand = inheritedConfig
+                    .getSuccessiveNoHardChangeRepetitionMultiplicand();
+        }
+        if (hardWeightDegradationRatio == null) {
+            hardWeightDegradationRatio = inheritedConfig.getHardWeightDegradationRatio();
+        }
+        if (startingHardWeight == null) {
+            startingHardWeight = inheritedConfig.getStartingHardWeight();
+        }
+    }
+
+    public static enum DeciderScoreComparatorFactoryType {
+        NATURAL,
+        SHIFTING_HARD_PENALTY
+    }
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/forager/ForagerConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/forager/ForagerConfig.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/decider/forager/ForagerConfig.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -11,7 +11,7 @@
 @XStreamAlias("forager")
 public class ForagerConfig {
 
-    private Forager forager = null;
+    private Forager forager = null; // TODO remove this and document extending ForagerConfig
     private Class<Forager> foragerClass = null;
     private ForagerType foragerType = null;
 

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/StepScope.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/StepScope.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/StepScope.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -1,6 +1,7 @@
 package org.drools.solver.core.localsearch;
 
 import java.util.Random;
+import java.util.Comparator;
 
 import org.drools.WorkingMemory;
 import org.drools.solver.core.move.Move;
@@ -16,6 +17,7 @@
 
     private int stepIndex = -1;
     private double timeGradient = Double.NaN;
+    private Comparator<Score> deciderScoreComparator;
     private Move step = null;
     private Move undoStep = null;
     private Score score = null;
@@ -45,6 +47,14 @@
         this.timeGradient = timeGradient;
     }
 
+    public Comparator<Score> getDeciderScoreComparator() {
+        return deciderScoreComparator;
+    }
+
+    public void setDeciderScoreComparator(Comparator<Score> deciderScoreComparator) {
+        this.deciderScoreComparator = deciderScoreComparator;
+    }
+
     public Move getStep() {
         return step;
     }

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/Decider.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/Decider.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/Decider.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -4,6 +4,7 @@
 import org.drools.solver.core.localsearch.LocalSearchSolverLifecycleListener;
 import org.drools.solver.core.localsearch.StepScope;
 import org.drools.solver.core.localsearch.decider.forager.Forager;
+import org.drools.solver.core.localsearch.decider.deciderscorecomparator.DeciderScoreComparatorFactory;
 
 /**
  * A decider decides the next step.
@@ -12,8 +13,20 @@
  */
 public interface Decider extends LocalSearchSolverAware, LocalSearchSolverLifecycleListener {
 
+    /**
+     * Decides the next step
+     * @param stepScope never null
+     */
     void decideNextStep(StepScope stepScope);
 
+    /**
+     * @return never null
+     */
+    DeciderScoreComparatorFactory getDeciderScoreComparator();
+
+    /**
+     * @return never null
+     */
     Forager getForager();
 
 }

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/DeciderAware.java (from rev 26379, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/LocalSearchSolverAware.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/DeciderAware.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/DeciderAware.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -0,0 +1,12 @@
+package org.drools.solver.core.localsearch.decider;
+
+import org.drools.solver.core.localsearch.LocalSearchSolver;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public interface DeciderAware {
+
+    void setDecider(Decider decider);
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/DefaultDecider.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/DefaultDecider.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/DefaultDecider.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -9,6 +9,7 @@
 import org.drools.solver.core.localsearch.decider.accepter.Accepter;
 import org.drools.solver.core.localsearch.decider.forager.Forager;
 import org.drools.solver.core.localsearch.decider.selector.Selector;
+import org.drools.solver.core.localsearch.decider.deciderscorecomparator.DeciderScoreComparatorFactory;
 import org.drools.solver.core.move.Move;
 import org.drools.solver.core.score.Score;
 import org.slf4j.Logger;
@@ -24,6 +25,7 @@
 
     protected LocalSearchSolver localSearchSolver;
 
+    protected DeciderScoreComparatorFactory deciderScoreComparatorFactory;
     protected Selector selector;
     protected Accepter accepter;
     protected Forager forager;
@@ -32,11 +34,19 @@
 
     public void setLocalSearchSolver(LocalSearchSolver localSearchSolver) {
         this.localSearchSolver = localSearchSolver;
-        selector.setLocalSearchSolver(localSearchSolver);
     }
 
+    public DeciderScoreComparatorFactory getDeciderScoreComparator() {
+        return deciderScoreComparatorFactory;
+    }
+
+    public void setDeciderScoreComparator(DeciderScoreComparatorFactory deciderScoreComparator) {
+        this.deciderScoreComparatorFactory = deciderScoreComparator;
+    }
+
     public void setSelector(Selector selector) {
         this.selector = selector;
+        selector.setDecider(this);
     }
 
     public void setAccepter(Accepter accepter) {
@@ -60,18 +70,21 @@
     // ************************************************************************
 
     public void solvingStarted(LocalSearchSolverScope localSearchSolverScope) {
+        deciderScoreComparatorFactory.solvingStarted(localSearchSolverScope);
         selector.solvingStarted(localSearchSolverScope);
         accepter.solvingStarted(localSearchSolverScope);
         forager.solvingStarted(localSearchSolverScope);
     }
 
     public void beforeDeciding(StepScope stepScope) {
+        deciderScoreComparatorFactory.beforeDeciding(stepScope);
         selector.beforeDeciding(stepScope);
         accepter.beforeDeciding(stepScope);
         forager.beforeDeciding(stepScope);
     }
 
     public void decideNextStep(StepScope stepScope) {
+        stepScope.setDeciderScoreComparator(deciderScoreComparatorFactory.createDeciderScoreComparator());
         WorkingMemory workingMemory = stepScope.getWorkingMemory();
         List<Move> moveList = selector.selectMoveList(stepScope);
         for (Move move : moveList) {
@@ -125,18 +138,21 @@
     }
 
     public void stepDecided(StepScope stepScope) {
+        deciderScoreComparatorFactory.stepDecided(stepScope);
         selector.stepDecided(stepScope);
         accepter.stepDecided(stepScope);
         forager.stepDecided(stepScope);
     }
 
     public void stepTaken(StepScope stepScope) {
+        deciderScoreComparatorFactory.stepTaken(stepScope);
         selector.stepTaken(stepScope);
         accepter.stepTaken(stepScope);
         forager.stepTaken(stepScope);
     }
 
     public void solvingEnded(LocalSearchSolverScope localSearchSolverScope) {
+        deciderScoreComparatorFactory.solvingEnded(localSearchSolverScope);
         selector.solvingEnded(localSearchSolverScope);
         accepter.solvingEnded(localSearchSolverScope);
         forager.solvingEnded(localSearchSolverScope);

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/AbstractAccepter.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/AbstractAccepter.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/AbstractAccepter.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -2,6 +2,7 @@
 
 import org.drools.solver.core.localsearch.LocalSearchSolverScope;
 import org.drools.solver.core.localsearch.StepScope;
+import org.drools.solver.core.localsearch.decider.Decider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/Accepter.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/Accepter.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/Accepter.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -2,6 +2,7 @@
 
 import org.drools.solver.core.localsearch.LocalSearchSolverLifecycleListener;
 import org.drools.solver.core.localsearch.decider.MoveScope;
+import org.drools.solver.core.localsearch.decider.DeciderAware;
 
 /**
  * An Accepter accepts or rejects a selected move for the Decider.

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	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/tabu/AbstractTabuAccepter.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -77,10 +77,13 @@
             // The move isn't tabu at all
             return 1.0;
         }
-        if (aspirationEnabled
-                && moveScope.getScore().compareTo(moveScope.getStepScope().getLocalSearchSolverScope().getBestScore()) > 0) {
-            logger.debug("    Proposed move ({}) is tabu, but aspiration undoes its tabu.", moveScope.getMove());
-            return 1.0;
+        if (aspirationEnabled) {
+            // Doesn't use the deciderScoreComparator because shifting penalties don't apply
+            if (moveScope.getScore().compareTo(
+                    moveScope.getStepScope().getLocalSearchSolverScope().getBestScore()) > 0) {
+                logger.debug("    Proposed move ({}) is tabu, but aspiration undoes its tabu.", moveScope.getMove());
+                return 1.0;
+            }
         }
         int tabuStepCount = moveScope.getStepScope().getStepIndex() - maximumTabuStepIndex - 1;
         if (tabuStepCount < completeTabuSize) {

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/AbstractDeciderScoreComparatorFactory.java (from rev 26379, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/AbstractAccepter.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/AbstractDeciderScoreComparatorFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/AbstractDeciderScoreComparatorFactory.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -0,0 +1,42 @@
+package org.drools.solver.core.localsearch.decider.deciderscorecomparator;
+
+import org.drools.solver.core.localsearch.LocalSearchSolverScope;
+import org.drools.solver.core.localsearch.StepScope;
+import org.drools.solver.core.score.Score;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Abstract superclass for {@link DeciderScoreComparatorFactory}.
+ * @see DeciderScoreComparatorFactory
+ * @author Geoffrey De Smet
+ */
+public abstract class AbstractDeciderScoreComparatorFactory implements DeciderScoreComparatorFactory {
+
+    protected final transient Logger logger = LoggerFactory.getLogger(getClass());
+
+    // ************************************************************************
+    // Worker methods
+    // ************************************************************************
+
+    public void solvingStarted(LocalSearchSolverScope localSearchSolverScope) {
+        // Hook which can be optionally overwritten by subclasses.
+    }
+
+    public void beforeDeciding(StepScope stepScope) {
+        // Hook which can be optionally overwritten by subclasses.
+    }
+
+    public void stepDecided(StepScope stepScope) {
+        // Hook which can be optionally overwritten by subclasses.
+    }
+
+    public void stepTaken(StepScope stepScope) {
+        // Hook which can be optionally overwritten by subclasses.
+    }
+
+    public void solvingEnded(LocalSearchSolverScope localSearchSolverScope) {
+        // Hook which can be optionally overwritten by subclasses.
+    }
+
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/DeciderScoreComparatorFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/DeciderScoreComparatorFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/DeciderScoreComparatorFactory.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -0,0 +1,22 @@
+package org.drools.solver.core.localsearch.decider.deciderscorecomparator;
+
+import java.util.Comparator;
+
+import org.drools.solver.core.score.Score;
+import org.drools.solver.core.localsearch.LocalSearchSolverLifecycleListener;
+
+/**
+ * A DeciderScoreComparatorFactory creates a new DeciderScoreComparator each step,
+ * which compares 2 scores to decide the next step.
+ * That Score Comparator can consider shifting penalty, aging penalty, ...
+ * in which case it differs from the natural ordering of scores.
+ * @author Geoffrey De Smet
+ */
+public interface DeciderScoreComparatorFactory extends LocalSearchSolverLifecycleListener {
+
+    /**
+     * @return never null
+     */
+    Comparator<Score> createDeciderScoreComparator();
+
+}

Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/HardPenaltyDeciderScoreComparator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/HardPenaltyDeciderScoreComparator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/HardPenaltyDeciderScoreComparator.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -0,0 +1,28 @@
+package org.drools.solver.core.localsearch.decider.deciderscorecomparator;
+
+import java.util.Comparator;
+
+import org.drools.solver.core.score.Score;
+import org.drools.solver.core.score.HardAndSoftScore;
+
+/**
+ * Compares 2 HardAndSoftScore based on the calculation the hard multiplied by a weight to the soft.
+* @author Geoffrey De Smet
+*/
+public class HardPenaltyDeciderScoreComparator implements Comparator<Score> {
+
+    private int hardWeight;
+
+    public HardPenaltyDeciderScoreComparator(int hardWeight) {
+        this.hardWeight = hardWeight;
+    }
+
+    public int compare(Score s1, Score s2) {
+        HardAndSoftScore score1 = (HardAndSoftScore) s1;
+        HardAndSoftScore score2 = (HardAndSoftScore) s2;
+        int score1Side = score1.getHardScore() * hardWeight + score1.getSoftScore();
+        int score2Side = score2.getHardScore() * hardWeight + score2.getSoftScore();
+        return score1Side < score2Side ? -1 : (score1Side == score2Side ? 0 : 1);
+    }
+
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/NaturalDeciderScoreComparator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/NaturalDeciderScoreComparator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/NaturalDeciderScoreComparator.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -0,0 +1,17 @@
+package org.drools.solver.core.localsearch.decider.deciderscorecomparator;
+
+import java.util.Comparator;
+
+import org.drools.solver.core.score.Score;
+
+/**
+ * Compares by the natural order of scores.
+ * @author Geoffrey De Smet
+ */
+public class NaturalDeciderScoreComparator implements Comparator<Score> {
+
+    public int compare(Score score1, Score score2) {
+        return score1.compareTo(score2);
+    }
+
+}

Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/NaturalDeciderScoreComparatorFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/NaturalDeciderScoreComparatorFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/NaturalDeciderScoreComparatorFactory.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -0,0 +1,21 @@
+package org.drools.solver.core.localsearch.decider.deciderscorecomparator;
+
+import java.util.Comparator;
+
+import org.drools.solver.core.score.Score;
+
+/**
+ * Implementation of {@link DeciderScoreComparatorFactory}.
+ * Compares by the natural order of scores.
+ * @see DeciderScoreComparatorFactory
+ * @author Geoffrey De Smet
+ */
+public class NaturalDeciderScoreComparatorFactory extends AbstractDeciderScoreComparatorFactory {
+
+    private Comparator<Score> naturalDeciderScoreComparator = new NaturalDeciderScoreComparator();
+
+    public Comparator<Score> createDeciderScoreComparator() {
+        return naturalDeciderScoreComparator;
+    }
+
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/ShiftingHardPenaltyDeciderScoreComparatorFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/ShiftingHardPenaltyDeciderScoreComparatorFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/deciderscorecomparator/ShiftingHardPenaltyDeciderScoreComparatorFactory.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -0,0 +1,113 @@
+package org.drools.solver.core.localsearch.decider.deciderscorecomparator;
+
+import java.util.Comparator;
+
+import org.drools.solver.core.localsearch.StepScope;
+import org.drools.solver.core.localsearch.LocalSearchSolverScope;
+import org.drools.solver.core.score.HardAndSoftScore;
+import org.drools.solver.core.score.Score;
+
+/**
+ * Implementation of {@link HardAndSoftScore}.
+ * Compares by
+ * @see DeciderScoreComparatorFactory
+ * @author Geoffrey De Smet
+ */
+public class ShiftingHardPenaltyDeciderScoreComparatorFactory extends AbstractDeciderScoreComparatorFactory {
+
+    private int hardScoreActivationThreshold = 0;
+    private int successiveNoHardChangeMinimum = 2;
+    private int successiveNoHardChangeMaximum = 20;
+    private double successiveNoHardChangeRepetitionMultiplicand = 20.0;
+    private double hardWeightDegradationRatio = 0.2;
+
+    private int startingHardWeight = 1000; // TODO determine dynamically
+
+    private int successiveNoHardScoreChange;
+    private boolean shiftingPenaltyActive;
+    private int hardWeight;
+
+    private Comparator<Score> naturalDeciderScoreComparator = new NaturalDeciderScoreComparator();
+
+    public void setHardScoreActivationThreshold(int hardScoreActivationThreshold) {
+        this.hardScoreActivationThreshold = hardScoreActivationThreshold;
+    }
+
+    public void setSuccessiveNoHardChangeMinimum(int successiveNoHardChangeMinimum) {
+        this.successiveNoHardChangeMinimum = successiveNoHardChangeMinimum;
+    }
+
+    public void setSuccessiveNoHardChangeMaximum(int successiveNoHardChangeMaximum) {
+        this.successiveNoHardChangeMaximum = successiveNoHardChangeMaximum;
+    }
+
+    public void setSuccessiveNoHardChangeRepetitionMultiplicand(double successiveNoHardChangeRepetitionMultiplicand) {
+        this.successiveNoHardChangeRepetitionMultiplicand = successiveNoHardChangeRepetitionMultiplicand;
+    }
+
+    public void setHardWeightDegradationRatio(double hardWeightDegradationRatio) {
+        this.hardWeightDegradationRatio = hardWeightDegradationRatio;
+    }
+
+    public void setStartingHardWeight(int startingHardWeight) {
+        this.startingHardWeight = startingHardWeight;
+    }
+
+    // ************************************************************************
+    // Worker methods
+    // ************************************************************************
+
+    @Override
+    public void solvingStarted(LocalSearchSolverScope localSearchSolverScope) {
+        successiveNoHardScoreChange = 0;
+        shiftingPenaltyActive = false;
+    }
+
+    @Override
+    public void stepTaken(StepScope stepScope) {
+        if (stepScope.getStepIndex() == stepScope.getLocalSearchSolverScope().getBestSolutionStepIndex()) {
+            successiveNoHardScoreChange = 0;
+            shiftingPenaltyActive = false;
+        } else {
+            HardAndSoftScore lastStepScore = (HardAndSoftScore) stepScope.getLocalSearchSolverScope()
+                    .getLastCompletedStepScope().getScore();
+            HardAndSoftScore stepScore = (HardAndSoftScore) stepScope.getScore();
+            if (stepScore.getHardScore() >= hardScoreActivationThreshold
+                    && lastStepScore.getHardScore() == stepScore.getHardScore()) {
+                successiveNoHardScoreChange++;
+            } else {
+                successiveNoHardScoreChange--;
+                if (successiveNoHardScoreChange < 0) {
+                    successiveNoHardScoreChange = 0;
+                }
+            }
+            int min = successiveNoHardChangeMinimum;
+            int max = successiveNoHardChangeMaximum;
+            while (true) {
+                if (successiveNoHardScoreChange < min) {
+                    shiftingPenaltyActive = false;
+                    break;
+                } else if (successiveNoHardScoreChange <= max) {
+                    shiftingPenaltyActive = true;
+                    if (successiveNoHardScoreChange == min) {
+                        hardWeight = startingHardWeight;
+                    } else {
+                        hardWeight *= hardWeightDegradationRatio;
+                    }
+                    break;
+                }
+                min *= successiveNoHardChangeRepetitionMultiplicand;
+                max *= successiveNoHardChangeRepetitionMultiplicand;
+            }
+        }
+    }
+
+    public Comparator<Score> createDeciderScoreComparator() {
+        if (shiftingPenaltyActive) {
+            return new HardPenaltyDeciderScoreComparator(hardWeight);
+        } else {
+            return naturalDeciderScoreComparator;
+        }
+    }
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForager.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForager.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForager.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -21,7 +21,7 @@
     // final to allow better hotspot optimization. TODO prove that it indeed makes a difference
     protected final PickEarlyByScore pickEarlyByScore;
     protected final boolean pickEarlyRandomly;
-    protected final AcceptedMoveScopeComparator acceptionComparator;
+    protected final AcceptedMoveScopeComparator acceptedMoveScopeComparator;
 
     protected List<MoveScope> acceptedList;
     protected boolean listSorted;
@@ -39,10 +39,10 @@
     }
 
     public AcceptedForager(PickEarlyByScore pickEarlyByScore, boolean pickEarlyRandomly,
-            AcceptedMoveScopeComparator acceptionComparator) {
+            AcceptedMoveScopeComparator acceptedMoveScopeComparator) {
         this.pickEarlyByScore = pickEarlyByScore;
         this.pickEarlyRandomly = pickEarlyRandomly;
-        this.acceptionComparator = acceptionComparator;
+        this.acceptedMoveScopeComparator = acceptedMoveScopeComparator;
     }
 
     // ************************************************************************
@@ -51,6 +51,7 @@
 
     @Override
     public void beforeDeciding(StepScope stepScope) {
+        acceptedMoveScopeComparator.setDeciderScoreComparator(stepScope.getDeciderScoreComparator());
         acceptedList = new ArrayList<MoveScope>(); // TODO use size of moveList in decider
         listSorted = false;
         maxScore = stepScope.getLocalSearchSolverScope().getScoreDefinition().getPerfectMinimumScore();
@@ -70,13 +71,15 @@
             case NONE:
                 break;
             case FIRST_BEST_SCORE_IMPROVING:
-                if (moveScope.getScore().compareTo(moveScope.getStepScope().getLocalSearchSolverScope().getBestScore()) > 0) {
+                if (moveScope.getStepScope().getDeciderScoreComparator().compare(moveScope.getScore(),
+                        moveScope.getStepScope().getLocalSearchSolverScope().getBestScore()) > 0) {
                     earlyPickedMoveScope = moveScope;
                 }
                 break;
             case FIRST_LAST_STEP_SCORE_IMPROVING:
-                if (moveScope.getScore().compareTo(moveScope.getStepScope().getLocalSearchSolverScope()
-                        .getLastCompletedStepScope().getScore()) > 0) {
+                if (moveScope.getStepScope().getDeciderScoreComparator().compare(moveScope.getScore(),
+                        moveScope.getStepScope().getLocalSearchSolverScope().getLastCompletedStepScope().getScore())
+                        > 0) {
                     earlyPickedMoveScope = moveScope;
                 }
                 break;
@@ -98,7 +101,7 @@
     protected void addMoveScopeToAcceptedList(MoveScope moveScope) {
         acceptedList.add(moveScope);
         listSorted = false;
-        if (moveScope.getScore().compareTo(maxScore) > 0) {
+        if (moveScope.getStepScope().getDeciderScoreComparator().compare(moveScope.getScore(), maxScore) > 0) {
             acceptChanceMaxScoreTotal = moveScope.getAcceptChance();
             maxScore = moveScope.getScore();
         } else if (moveScope.getScore().equals(maxScore)) {
@@ -163,7 +166,7 @@
 
     protected void sortAcceptedList() {
         if (!listSorted) {
-            Collections.sort(acceptedList, acceptionComparator);
+            Collections.sort(acceptedList, acceptedMoveScopeComparator);
             listSorted = true;
         }
     }

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedMoveScopeComparator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedMoveScopeComparator.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedMoveScopeComparator.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -4,15 +4,27 @@
 
 import org.apache.commons.lang.builder.CompareToBuilder;
 import org.drools.solver.core.localsearch.decider.MoveScope;
+import org.drools.solver.core.localsearch.decider.deciderscorecomparator.DeciderScoreComparatorFactory;
+import org.drools.solver.core.score.Score;
 
 /**
  * @author Geoffrey De Smet
  */
 public class AcceptedMoveScopeComparator implements Comparator<MoveScope> {
 
+    private Comparator<? extends Score> deciderScoreComparator;
+
+    public void setDeciderScoreComparator(Comparator<? extends Score> deciderScoreComparator) {
+        this.deciderScoreComparator = deciderScoreComparator;
+    }
+    
+    // ************************************************************************
+    // Worker methods
+    // ************************************************************************
+
     public int compare(MoveScope a, MoveScope b) {
         CompareToBuilder compareToBuilder = new CompareToBuilder();
-        compareToBuilder.append(a.getScore(), b.getScore());
+        compareToBuilder.append(a.getScore(), b.getScore(), deciderScoreComparator);
         compareToBuilder.append(a.getAcceptChance(), b.getAcceptChance());
         // moves are not compared
         return compareToBuilder.toComparison();

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/Forager.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/Forager.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/Forager.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -5,6 +5,7 @@
 import org.drools.solver.core.localsearch.LocalSearchSolverLifecycleListener;
 import org.drools.solver.core.localsearch.StepScope;
 import org.drools.solver.core.localsearch.decider.MoveScope;
+import org.drools.solver.core.localsearch.decider.DeciderAware;
 import org.drools.solver.core.move.Move;
 
 /**

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/AbstractSelector.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/AbstractSelector.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/AbstractSelector.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -3,6 +3,7 @@
 import org.drools.solver.core.localsearch.LocalSearchSolver;
 import org.drools.solver.core.localsearch.LocalSearchSolverScope;
 import org.drools.solver.core.localsearch.StepScope;
+import org.drools.solver.core.localsearch.decider.Decider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -15,10 +16,10 @@
 
     protected final transient Logger logger = LoggerFactory.getLogger(getClass());
 
-    protected LocalSearchSolver localSearchSolver;
+    protected Decider decider;
 
-    public void setLocalSearchSolver(LocalSearchSolver localSearchSolver) {
-        this.localSearchSolver = localSearchSolver;
+    public void setDecider(Decider decider) {
+        this.decider = decider;
     }
 
     // ************************************************************************

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/CompositeSelector.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/CompositeSelector.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/CompositeSelector.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -6,6 +6,7 @@
 import org.drools.solver.core.localsearch.LocalSearchSolver;
 import org.drools.solver.core.localsearch.LocalSearchSolverScope;
 import org.drools.solver.core.localsearch.StepScope;
+import org.drools.solver.core.localsearch.decider.Decider;
 import org.drools.solver.core.move.Move;
 
 /**
@@ -21,10 +22,10 @@
     }
 
     @Override
-    public void setLocalSearchSolver(LocalSearchSolver localSearchSolver) {
-        super.setLocalSearchSolver(localSearchSolver);
+    public void setDecider(Decider decider) {
+        super.setDecider(decider);
         for (Selector selector : selectorList) {
-            selector.setLocalSearchSolver(localSearchSolver);
+            selector.setDecider(decider);
         }
     }
 

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/MoveFactorySelector.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/MoveFactorySelector.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/MoveFactorySelector.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -6,6 +6,7 @@
 import org.drools.solver.core.localsearch.LocalSearchSolver;
 import org.drools.solver.core.localsearch.LocalSearchSolverScope;
 import org.drools.solver.core.localsearch.StepScope;
+import org.drools.solver.core.localsearch.decider.Decider;
 import org.drools.solver.core.move.Move;
 import org.drools.solver.core.move.factory.MoveFactory;
 
@@ -35,9 +36,10 @@
         }
     }
 
-    public void setLocalSearchSolver(LocalSearchSolver localSearchSolver) {
-        super.setLocalSearchSolver(localSearchSolver);
-        moveFactory.setLocalSearchSolver(localSearchSolver);
+    @Override
+    public void setDecider(Decider decider) {
+        super.setDecider(decider);
+        moveFactory.setDecider(decider);
     }
 
     // ************************************************************************

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/Selector.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/Selector.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/Selector.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -5,6 +5,7 @@
 import org.drools.solver.core.localsearch.LocalSearchSolverAware;
 import org.drools.solver.core.localsearch.LocalSearchSolverLifecycleListener;
 import org.drools.solver.core.localsearch.StepScope;
+import org.drools.solver.core.localsearch.decider.DeciderAware;
 import org.drools.solver.core.move.Move;
 
 /**
@@ -12,7 +13,7 @@
  * @see AbstractSelector
  * @author Geoffrey De Smet
  */
-public interface Selector extends LocalSearchSolverAware, LocalSearchSolverLifecycleListener {
+public interface Selector extends DeciderAware, LocalSearchSolverLifecycleListener {
 
     List<Move> selectMoveList(StepScope stepScope);
 

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/TopListSelector.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/TopListSelector.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/TopListSelector.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -36,8 +36,7 @@
 
     @Override
     public void stepTaken(StepScope stepScope) {
-        // TODO FIXME: it shouldn't know DefaultLocalSearchSolver that intimitly
-        topList = ((DefaultLocalSearchSolver) localSearchSolver).getDecider().getForager().getTopList(topSize);
+        topList = decider.getForager().getTopList(topSize);
     }
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/factory/AbstractMoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/factory/AbstractMoveFactory.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/factory/AbstractMoveFactory.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -3,6 +3,7 @@
 import org.drools.solver.core.localsearch.LocalSearchSolver;
 import org.drools.solver.core.localsearch.LocalSearchSolverScope;
 import org.drools.solver.core.localsearch.StepScope;
+import org.drools.solver.core.localsearch.decider.Decider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -13,10 +14,10 @@
 
     protected final transient Logger logger = LoggerFactory.getLogger(getClass());
 
-    protected LocalSearchSolver localSearchSolver;
+    protected Decider decider;
 
-    public void setLocalSearchSolver(LocalSearchSolver localSearchSolver) {
-        this.localSearchSolver = localSearchSolver;
+    public void setDecider(Decider decider) {
+        this.decider = decider;
     }
 
     // ************************************************************************

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/factory/MoveFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/factory/MoveFactory.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/move/factory/MoveFactory.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -4,13 +4,14 @@
 
 import org.drools.solver.core.localsearch.LocalSearchSolverAware;
 import org.drools.solver.core.localsearch.LocalSearchSolverLifecycleListener;
+import org.drools.solver.core.localsearch.decider.DeciderAware;
 import org.drools.solver.core.move.Move;
 import org.drools.solver.core.solution.Solution;
 
 /**
  * @author Geoffrey De Smet
  */
-public interface MoveFactory extends LocalSearchSolverAware, LocalSearchSolverLifecycleListener {
+public interface MoveFactory extends DeciderAware, LocalSearchSolverLifecycleListener {
 
     List<Move> createMoveList(Solution solution);
 

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/AbstractScoreComparator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/AbstractScoreComparator.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/AbstractScoreComparator.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -1,38 +0,0 @@
-package org.drools.solver.core.score.comparator;
-
-import java.io.Serializable;
-
-import org.drools.solver.core.score.Score;
-
-/**
- * Abstract superclass for {@link ScoreComparator}.
- * @see ScoreComparator
- * @author Geoffrey De Smet
- */
-public abstract class AbstractScoreComparator<S extends Score> implements ScoreComparator<S>, Serializable {
-
-    // ************************************************************************
-    // Worker methods
-    // ************************************************************************
-
-    public int compare(S score1, S score2) {
-        return score1.compareTo(score2);
-    }
-
-    public int compareWithShiftingPenalty(S score1, S score2) {
-        // Hook which can be optionally overwritten by subclasses.
-        return compare(score1, score2);
-    }
-
-    public double calculateTimeGradient(S startScore, S endScore, S score) {
-        // Hook which can be optionally overwritten by subclasses.
-        if (startScore.compareTo(score) <= 0) {
-            return 0.0;
-        } else if (score.compareTo(endScore) >= 0) {
-            return 1.0;
-        } else {
-            return 0.5;
-        }
-    }
-
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/HardAndSoftScoreComparator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/HardAndSoftScoreComparator.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/HardAndSoftScoreComparator.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -1,85 +0,0 @@
-package org.drools.solver.core.score.comparator;
-
-import java.io.Serializable;
-
-import org.drools.solver.core.score.Score;
-import org.drools.solver.core.score.HardAndSoftScore;
-import org.drools.solver.core.score.DefaultHardAndSoftScore;
-
-/**
- * A HardAndSoftScoreComparator is a ScoreComparator for HardAndSoftScores.
- * @see HardAndSoftScore
- * @author Geoffrey De Smet
- */
-public class HardAndSoftScoreComparator extends AbstractScoreComparator<HardAndSoftScore> {
-    
-    private double hardScoreTimeGradientWeight = 0.5;
-
-    public void setHardScoreTimeGradientWeight(double hardScoreTimeGradientWeight) {
-        this.hardScoreTimeGradientWeight = hardScoreTimeGradientWeight;
-        if (hardScoreTimeGradientWeight < 0.0 || hardScoreTimeGradientWeight > 1.0) {
-            throw new IllegalArgumentException("Property hardScoreTimeGradientWeight (" + hardScoreTimeGradientWeight
-                    + ") must be greater or equal to 0.0jg and smaller or equal to 1.0.");
-        }
-    }
-
-    // ************************************************************************
-    // Worker methods
-    // ************************************************************************
-
-    public int compare(HardAndSoftScore score1, HardAndSoftScore score2) {
-        return score1.compareTo(score2);
-    }
-
-    public boolean better(HardAndSoftScore score1, HardAndSoftScore score2) {
-        return (score1.getHardScore() > score2.getHardScore())
-                || (score1.getHardScore() == score2.getHardScore() && score1.getSoftScore() > score2.getSoftScore());
-    }
-
-    public boolean betterOrEqual(HardAndSoftScore score1, HardAndSoftScore score2) {
-        return (score1.getHardScore() > score2.getHardScore())
-                || (score1.getHardScore() == score2.getHardScore() && score1.getSoftScore() >= score2.getSoftScore());
-    }
-
-    public boolean equal(HardAndSoftScore score1, HardAndSoftScore score2) {
-        return score1.getHardScore() == score2.getHardScore() && score1.getSoftScore() == score2.getSoftScore();
-    }
-
-    public boolean notEqual(HardAndSoftScore score1, HardAndSoftScore score2) {
-        return score1.getHardScore() != score2.getHardScore() || score1.getSoftScore() != score2.getSoftScore();
-    }
-
-    public boolean worse(HardAndSoftScore score1, HardAndSoftScore score2) {
-        return (score1.getHardScore() < score2.getHardScore())
-                || (score1.getHardScore() == score2.getHardScore() && score1.getSoftScore() < score2.getSoftScore());
-    }
-
-    public boolean worseOrEqual(HardAndSoftScore score1, HardAndSoftScore score2) {
-        return (score1.getHardScore() < score2.getHardScore())
-                || (score1.getHardScore() == score2.getHardScore() && score1.getSoftScore() <= score2.getSoftScore());
-    }
-
-    public int compareWithShiftingPenalty(HardAndSoftScore score1, HardAndSoftScore score2) {
-        // TODO implement me
-        return compare(score1, score2);
-    }
-
-    public double calculateTimeGradient(HardAndSoftScore startScore, HardAndSoftScore endScore,
-            HardAndSoftScore score) {
-        double timeGradient = 0.0;
-        int totalHardScore = Math.max(0, endScore.getHardScore() - startScore.getHardScore());
-        if (totalHardScore > 0) {
-            int deltaHardScore = Math.max(0, score.getHardScore() - startScore.getHardScore());
-            double hardTimeGradient = Math.min(1.0, (double) deltaHardScore / (double) totalHardScore);
-            timeGradient += (hardTimeGradient * hardScoreTimeGradientWeight);
-        }
-        int totalSoftScore = Math.max(0, endScore.getSoftScore() - startScore.getSoftScore());
-        if (totalSoftScore > 0) {
-            int deltaSoftScore = Math.max(0, score.getSoftScore() - startScore.getSoftScore());
-            double softTimeGradient = Math.min(1.0, (double) deltaSoftScore / (double) totalSoftScore);
-            timeGradient += (softTimeGradient * (1.0 - hardScoreTimeGradientWeight)); 
-        }
-        return timeGradient;
-    }
-
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/ScoreComparator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/ScoreComparator.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/ScoreComparator.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -1,66 +0,0 @@
-package org.drools.solver.core.score.comparator;
-
-import java.util.Comparator;
-
-import org.drools.solver.core.score.Score;
-import org.drools.solver.core.score.HardAndSoftScore;
-
-/**
- * A ScoreComparator can compare 2 Scores, optionally taking shifting penalties into account.
- * <p/>
- * Most implementations are writting specifically for a certain Score implementation.
- * @see Score
- * @see AbstractScoreComparator
- * @see SimpleScoreComparator
- * @see HardAndSoftScoreComparator
- * @author Geoffrey De Smet
- */
-public interface ScoreComparator<S extends Score> extends Comparator<S> {
-
-    /**
-     * Compares 2 scores. The better score is greater than the other score.
-     * This method follows the conventions of {@link Comparator#compare}.
-     *
-     * @param score1 the first score to be compared, never null.
-     * @param score2 the second score to be compared, never null.
-     * @return a negative integer, zero, or a positive integer as the
-     * 	       first score is worse than, equal to, or better than the
-     *	       second score.
-     * @see #compareWithShiftingPenalty
-     */
-    int compare(S score1, S score2);
-
-    boolean better(S score1, S score2);
-    boolean betterOrEqual(S score1, S score2);
-    boolean equal(S score1, S score2);
-    boolean notEqual(S score1, S score2);
-    boolean worse(S score1, S score2);
-    boolean worseOrEqual(S score1, S score2);
-
-    /**
-     * Compares 2 scores, taking a shifting penalty into consideration if a shifting penalty is applied.
-     * The better score is greater than the other score.
-     * This method follows the conventions of {@link Comparator#compare}.
-     * </p>
-     * A shifting penalty can for example lower (resp. highten) the weight of a constraint
-     * if for a number of steps that constraint is satisfied (resp. not satisfied).
-     *
-     * @param score1 the first score to be compared, never null.
-     * @param score2 the second score to be compared, never null.
-     * @return a negative integer, zero, or a positive integer as the
-     * 	       first score is worse than, equal to, or better than the
-     *	       second score.
-     * @see #compare
-     */
-    int compareWithShiftingPenalty(S score1, S score2);
-
-    /**
-     *
-     * @param startScore never null
-     * @param endScore never null
-     * @param score never null
-     * @return between 0.0 and 1.0
-     */
-    double calculateTimeGradient(S startScore, S endScore, S score);
-
-}

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/SimpleScoreComparator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/SimpleScoreComparator.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/SimpleScoreComparator.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -1,63 +0,0 @@
-package org.drools.solver.core.score.comparator;
-
-import java.io.Serializable;
-
-import org.drools.solver.core.score.Score;
-import org.drools.solver.core.score.SimpleScore;
-import org.drools.solver.core.score.DefaultSimpleScore;
-
-/**
- * A SimpleScoreComparator is a ScoreComparator for SimpleScores.
- * @see SimpleScore
- * @author Geoffrey De Smet
- */
-public class SimpleScoreComparator extends AbstractScoreComparator<SimpleScore> {
-
-    // ************************************************************************
-    // Worker methods
-    // ************************************************************************
-
-    public int compare(SimpleScore score1, SimpleScore score2) {
-        return score1.compareTo(score2);
-    }
-
-    public boolean better(SimpleScore score1, SimpleScore score2) {
-        return score1.getScore() > score2.getScore();
-    }
-
-    public boolean betterOrEqual(SimpleScore score1, SimpleScore score2) {
-        return score1.getScore() >= score2.getScore();
-    }
-
-    public boolean equal(SimpleScore score1, SimpleScore score2) {
-        return score1.getScore() == score2.getScore();
-    }
-
-    public boolean notEqual(SimpleScore score1, SimpleScore score2) {
-        return score1.getScore() != score2.getScore();
-    }
-
-    public boolean worse(SimpleScore score1, SimpleScore score2) {
-        return score1.getScore() < score2.getScore();
-    }
-
-    public boolean worseOrEqual(SimpleScore score1, SimpleScore score2) {
-        return score1.getScore() <= score2.getScore();
-    }
-
-    public int compareWithShiftingPenalty(SimpleScore score1, SimpleScore score2) {
-        // TODO implement me
-        return compare(score1, score2);
-    }
-
-    public double calculateTimeGradient(SimpleScore startScore, SimpleScore endScore, SimpleScore score) {
-        double timeGradient = 0.0;
-        int totalScore = Math.max(0, endScore.getScore() - startScore.getScore());
-        if (totalScore > 0) {
-            int deltaScore = Math.max(0, score.getScore() - startScore.getScore());
-            timeGradient = Math.min(1.0, (double) deltaScore / (double) totalScore);
-        }
-        return timeGradient;
-    }
-
-}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/ScoreDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/ScoreDefinition.java	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/ScoreDefinition.java	2009-05-24 13:47:49 UTC (rev 26709)
@@ -1,7 +1,6 @@
 package org.drools.solver.core.score.definition;
 
 import org.drools.solver.core.score.Score;
-import org.drools.solver.core.score.comparator.ScoreComparator;
 
 /**
  * A ScoreDefinition knows how to compare scores and what the perfect maximum/minimum Score is.
@@ -11,10 +10,6 @@
  */
 public interface ScoreDefinition<S extends Score> {
 
-//    ScoreComparator getScoreComparator();
-//
-//    ScoreComparator getShiftingPenaltyScoreComparator();
-
     /**
      * The perfect maximum score is the score of which there is no better in any problem instance.
      * This doesn't mean that the current problem instance, or any problem instance for that matter,

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationSolverBenchmarkConfig.xml	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationSolverBenchmarkConfig.xml	2009-05-24 13:47:49 UTC (rev 26709)
@@ -16,6 +16,9 @@
 
     <inheritedLocalSearchSolver>
         <scoreDrl>/org/drools/solver/examples/itc2007/examination/solver/examinationScoreRules.drl</scoreDrl>
+        <scoreDefinition>
+            <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>
+        </scoreDefinition>
         <startingSolutionInitializerClass>org.drools.solver.examples.itc2007.examination.solver.solution.initializer.ExaminationStartingSolutionInitializer</startingSolutionInitializerClass>
         <finish>
             <!--
@@ -29,9 +32,9 @@
 
     <solverBenchmark>
         <localSearchSolver>
-            <scoreDefinition>
-                <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>
-            </scoreDefinition>
+            <deciderScoreComparatorFactory>
+                <deciderScoreComparatorFactoryType>NATURAL</deciderScoreComparatorFactoryType>
+            </deciderScoreComparatorFactory>
             <selector>
                 <selector>
                     <topSize>10</topSize>
@@ -58,4 +61,189 @@
             </forager>
         </localSearchSolver>
     </solverBenchmark>
+    <solverBenchmark>
+        <localSearchSolver>
+            <deciderScoreComparatorFactory>
+                <deciderScoreComparatorFactoryType>SHIFTING_HARD_PENALTY</deciderScoreComparatorFactoryType>
+                <hardScoreActivationThreshold>0</hardScoreActivationThreshold>
+                <successiveNoHardChangeMinimum>2</successiveNoHardChangeMinimum>
+                <successiveNoHardChangeMaximum>20</successiveNoHardChangeMaximum>
+                <successiveNoHardChangeRepetitionMultiplicand>20.0</successiveNoHardChangeRepetitionMultiplicand>
+                <hardWeightDegradationRatio>0.2</hardWeightDegradationRatio>
+                <startingHardWeight>1000</startingHardWeight>
+            </deciderScoreComparatorFactory>
+            <selector>
+                <selector>
+                    <topSize>10</topSize>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.002</relativeSelection>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.move.factory.RoomChangeMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.002</relativeSelection>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.move.factory.ExamSwitchMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.002</relativeSelection>
+                </selector>
+            </selector>
+            <accepter>
+                <completeSolutionTabuSize>500</completeSolutionTabuSize>
+                <completePropertyTabuSize>10</completePropertyTabuSize>
+            </accepter>
+            <forager>
+                <foragerType>MAX_SCORE_OF_ALL</foragerType>
+            </forager>
+        </localSearchSolver>
+    </solverBenchmark>
+    <solverBenchmark>
+        <localSearchSolver>
+            <deciderScoreComparatorFactory>
+                <deciderScoreComparatorFactoryType>SHIFTING_HARD_PENALTY</deciderScoreComparatorFactoryType>
+                <hardScoreActivationThreshold>0</hardScoreActivationThreshold>
+                <successiveNoHardChangeMinimum>2</successiveNoHardChangeMinimum>
+                <successiveNoHardChangeMaximum>10</successiveNoHardChangeMaximum>
+                <successiveNoHardChangeRepetitionMultiplicand>10.0</successiveNoHardChangeRepetitionMultiplicand>
+                <hardWeightDegradationRatio>0.2</hardWeightDegradationRatio>
+                <startingHardWeight>1000</startingHardWeight>
+            </deciderScoreComparatorFactory>
+            <selector>
+                <selector>
+                    <topSize>10</topSize>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.002</relativeSelection>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.move.factory.RoomChangeMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.002</relativeSelection>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.move.factory.ExamSwitchMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.002</relativeSelection>
+                </selector>
+            </selector>
+            <accepter>
+                <completeSolutionTabuSize>500</completeSolutionTabuSize>
+                <completePropertyTabuSize>10</completePropertyTabuSize>
+            </accepter>
+            <forager>
+                <foragerType>MAX_SCORE_OF_ALL</foragerType>
+            </forager>
+        </localSearchSolver>
+    </solverBenchmark>
+    <solverBenchmark>
+        <localSearchSolver>
+            <deciderScoreComparatorFactory>
+                <deciderScoreComparatorFactoryType>SHIFTING_HARD_PENALTY</deciderScoreComparatorFactoryType>
+                <hardScoreActivationThreshold>0</hardScoreActivationThreshold>
+                <successiveNoHardChangeMinimum>4</successiveNoHardChangeMinimum>
+                <successiveNoHardChangeMaximum>20</successiveNoHardChangeMaximum>
+                <successiveNoHardChangeRepetitionMultiplicand>10.0</successiveNoHardChangeRepetitionMultiplicand>
+                <hardWeightDegradationRatio>0.2</hardWeightDegradationRatio>
+                <startingHardWeight>1000</startingHardWeight>
+            </deciderScoreComparatorFactory>
+            <selector>
+                <selector>
+                    <topSize>10</topSize>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.002</relativeSelection>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.move.factory.RoomChangeMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.002</relativeSelection>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.move.factory.ExamSwitchMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.002</relativeSelection>
+                </selector>
+            </selector>
+            <accepter>
+                <completeSolutionTabuSize>500</completeSolutionTabuSize>
+                <completePropertyTabuSize>10</completePropertyTabuSize>
+            </accepter>
+            <forager>
+                <foragerType>MAX_SCORE_OF_ALL</foragerType>
+            </forager>
+        </localSearchSolver>
+    </solverBenchmark>
+    <solverBenchmark>
+        <localSearchSolver>
+            <deciderScoreComparatorFactory>
+                <deciderScoreComparatorFactoryType>SHIFTING_HARD_PENALTY</deciderScoreComparatorFactoryType>
+                <hardScoreActivationThreshold>0</hardScoreActivationThreshold>
+                <successiveNoHardChangeMinimum>2</successiveNoHardChangeMinimum>
+                <successiveNoHardChangeMaximum>20</successiveNoHardChangeMaximum>
+                <successiveNoHardChangeRepetitionMultiplicand>20.0</successiveNoHardChangeRepetitionMultiplicand>
+                <hardWeightDegradationRatio>0.2</hardWeightDegradationRatio>
+                <startingHardWeight>500</startingHardWeight>
+            </deciderScoreComparatorFactory>
+            <selector>
+                <selector>
+                    <topSize>10</topSize>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.002</relativeSelection>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.move.factory.RoomChangeMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.002</relativeSelection>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.move.factory.ExamSwitchMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.002</relativeSelection>
+                </selector>
+            </selector>
+            <accepter>
+                <completeSolutionTabuSize>500</completeSolutionTabuSize>
+                <completePropertyTabuSize>10</completePropertyTabuSize>
+            </accepter>
+            <forager>
+                <foragerType>MAX_SCORE_OF_ALL</foragerType>
+            </forager>
+        </localSearchSolver>
+    </solverBenchmark>
+    <solverBenchmark>
+        <localSearchSolver>
+            <deciderScoreComparatorFactory>
+                <deciderScoreComparatorFactoryType>SHIFTING_HARD_PENALTY</deciderScoreComparatorFactoryType>
+                <hardScoreActivationThreshold>1</hardScoreActivationThreshold>
+                <successiveNoHardChangeMinimum>2</successiveNoHardChangeMinimum>
+                <successiveNoHardChangeMaximum>20</successiveNoHardChangeMaximum>
+                <successiveNoHardChangeRepetitionMultiplicand>20.0</successiveNoHardChangeRepetitionMultiplicand>
+                <hardWeightDegradationRatio>0.2</hardWeightDegradationRatio>
+                <startingHardWeight>1000</startingHardWeight>
+            </deciderScoreComparatorFactory>
+            <selector>
+                <selector>
+                    <topSize>10</topSize>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.002</relativeSelection>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.move.factory.RoomChangeMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.002</relativeSelection>
+                </selector>
+                <selector>
+                    <moveFactoryClass>org.drools.solver.examples.itc2007.examination.solver.move.factory.ExamSwitchMoveFactory</moveFactoryClass>
+                    <relativeSelection>0.002</relativeSelection>
+                </selector>
+            </selector>
+            <accepter>
+                <completeSolutionTabuSize>500</completeSolutionTabuSize>
+                <completePropertyTabuSize>10</completePropertyTabuSize>
+            </accepter>
+            <forager>
+                <foragerType>MAX_SCORE_OF_ALL</foragerType>
+            </forager>
+        </localSearchSolver>
+    </solverBenchmark>
 </solverBenchmarkSuite>

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml	2009-05-24 10:57:35 UTC (rev 26708)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml	2009-05-24 13:47:49 UTC (rev 26709)
@@ -15,6 +15,15 @@
         <!--<feasableScore>-0hard/-999999soft</feasableScore>-->
         <!--<maximumStepCount>100</maximumStepCount>-->
     </finish>
+    <!--<deciderScoreComparatorFactory>-->
+        <!--<deciderScoreComparatorFactoryType>SHIFTING_HARD_PENALTY</deciderScoreComparatorFactoryType>-->
+        <!--<hardScoreActivationThreshold>0</hardScoreActivationThreshold>-->
+        <!--<successiveNoHardChangeMinimum>2</successiveNoHardChangeMinimum>-->
+        <!--<successiveNoHardChangeMaximum>20</successiveNoHardChangeMaximum>-->
+        <!--<successiveNoHardChangeRepetitionMultiplicand>20.0</successiveNoHardChangeRepetitionMultiplicand>-->
+        <!--<hardWeightDegradationRatio>0.2</hardWeightDegradationRatio>-->
+        <!--<startingHardWeight>1000</startingHardWeight>-->
+    <!--</deciderScoreComparatorFactory>-->
     <selector>
         <selector>
             <topSize>10</topSize>




More information about the jboss-svn-commits mailing list