Index: /branches/3107_LearningALPS/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/Creators/NodeImpactsReinitializationStrategyController.cs
===================================================================
--- /branches/3107_LearningALPS/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/Creators/NodeImpactsReinitializationStrategyController.cs	(revision 17946)
+++ /branches/3107_LearningALPS/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/Creators/NodeImpactsReinitializationStrategyController.cs	(revision 17947)
@@ -6,4 +6,5 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using HeuristicLab.Operators;
@@ -20,4 +21,6 @@
     private const string ProblemDataParameterName = "ProblemData";
     private const string EstimationLimitsParameterName = "EstimationLimits";
+    private const string MinimumFrequencyParameterName = "MinimumFrequency";
+    private const string LearningRateParameterName = "LearningRate";
 
     #region Parameter Properties
@@ -41,4 +44,24 @@
       get { return (IValueLookupParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; }
     }
+
+    public IFixedValueParameter<DoubleValue> MinimumFrequencyParameter {
+      get { return (IFixedValueParameter<DoubleValue>)Parameters[MinimumFrequencyParameterName]; }
+    }
+
+    public IFixedValueParameter<DoubleValue> LearningRateParameter {
+      get { return (IFixedValueParameter<DoubleValue>)Parameters[LearningRateParameterName]; }
+    }
+    #endregion
+
+    #region Properties
+    public double MinimumFrequency {
+      get { return MinimumFrequencyParameter.Value.Value; }
+      set { MinimumFrequencyParameter.Value.Value = value; }
+    }
+
+    public double LearningRate {
+      get { return LearningRateParameter.Value.Value; }
+      set { LearningRateParameter.Value.Value = value; }
+    }
     #endregion
 
@@ -50,4 +73,6 @@
       Parameters.Add(new LookupParameter<IRegressionProblemData>(ProblemDataParameterName, "The problem data for the symbolic regression solution."));
       Parameters.Add(new ValueLookupParameter<DoubleLimit>(EstimationLimitsParameterName, "The lower and upper limit for the estimated values produced by the symbolic regression model."));
+      Parameters.Add(new FixedValueParameter<DoubleValue>(MinimumFrequencyParameterName, "Minimum Frequency for the controller to set to symbols.", new DoubleValue(0)));
+      Parameters.Add(new FixedValueParameter<DoubleValue>(LearningRateParameterName, "Learning Rate for how fast the frequency is adapted. Zero learning rate means no adaption, one means new frequency = symbol frequency.", new DoubleValue(0.1)));
     }
 
@@ -62,4 +87,8 @@
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
+      if (!Parameters.ContainsKey(MinimumFrequencyParameterName))
+        Parameters.Add(new FixedValueParameter<DoubleValue>(MinimumFrequencyParameterName, "Minimum Frequency for the controller to set to symbols.", new DoubleValue(0)));
+      if (!Parameters.ContainsKey(LearningRateParameterName))
+        Parameters.Add(new FixedValueParameter<DoubleValue>(LearningRateParameterName, "Learning Rate for how fast the frequency is adapted. Zero learning rate means no adaption, one means new frequency = symbol frequency.", new DoubleValue(0.1)));
     }
     #endregion
@@ -71,4 +100,6 @@
       var pd = ProblemDataParameter.ActualValue;
       var interpreter = SymbolicDataAnalysisTreeInterpreterParameter.ActualValue;
+      double minimumFrequency = MinimumFrequency;
+      double learningRate = LearningRate;
 
       if (interpreter == null) {
@@ -108,5 +139,8 @@
         if (symbolImpacts.TryGetValue(symbol.Name, out double impact)) {
           var f = Math.Max(0, impact / symbolCounts[symbol.Name]); // do something clever here
-          symbol.InitialFrequency = f;
+          double oldFrequency = symbol.InitialFrequency;
+          double impactFrequency = f;
+          double newFrequency = oldFrequency + (impactFrequency - oldFrequency) * learningRate;
+          symbol.InitialFrequency = Math.Max(minimumFrequency, newFrequency);
         }
       }
Index: /branches/3107_LearningALPS/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Creators/SymbolFrequencyReinitializationStrategyController.cs
===================================================================
--- /branches/3107_LearningALPS/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Creators/SymbolFrequencyReinitializationStrategyController.cs	(revision 17946)
+++ /branches/3107_LearningALPS/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Creators/SymbolFrequencyReinitializationStrategyController.cs	(revision 17947)
@@ -1,7 +1,8 @@
-﻿using System.Linq;
-
+﻿using System;
+using System.Linq;
 using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using HeuristicLab.Operators;
@@ -16,4 +17,6 @@
     private const string SymbolicExpressionTreeParameterName = "SymbolicExpressionTree";
     private const string SymbolicExpressionTreeGrammarParameterName = "ClonedSymbolicExpressionTreeGrammar";
+    private const string MinimumFrequencyParameterName = "MinimumFrequency";
+    private const string LearningRateParameterName = "LearningRate";
 
     #region Parameter Properties
@@ -25,5 +28,26 @@
       get { return (IValueLookupParameter<ISymbolicExpressionGrammar>)Parameters[SymbolicExpressionTreeGrammarParameterName]; }
     }
+
+    public IFixedValueParameter<DoubleValue> MinimumFrequencyParameter {
+      get { return (IFixedValueParameter<DoubleValue>)Parameters[MinimumFrequencyParameterName]; }
+    }
+
+    public IFixedValueParameter<DoubleValue> LearningRateParameter {
+      get { return (IFixedValueParameter<DoubleValue>)Parameters[LearningRateParameterName]; }
+    }
     #endregion
+
+    #region Properties
+    public double MinimumFrequency {
+      get { return MinimumFrequencyParameter.Value.Value; }
+      set { MinimumFrequencyParameter.Value.Value = value; }
+    }
+
+    public double LearningRate {
+      get { return LearningRateParameter.Value.Value; }
+      set { LearningRateParameter.Value.Value = value; }
+    }
+    #endregion
+
 
     #region Constructors
@@ -31,4 +55,6 @@
       Parameters.Add(new ScopeTreeLookupParameter<ISymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The symbolic expression tree whose length should be calculated."));
       Parameters.Add(new ValueLookupParameter<ISymbolicExpressionGrammar>(SymbolicExpressionTreeGrammarParameterName, "The tree grammar that defines the correct syntax of symbolic expression trees that should be created."));
+      Parameters.Add(new FixedValueParameter<DoubleValue>(MinimumFrequencyParameterName, "Minimum Frequency for the controller to set to symbols.", new DoubleValue(0)));
+      Parameters.Add(new FixedValueParameter<DoubleValue>(LearningRateParameterName, "Learning Rate for how fast the frequency is adapted. Zero learning rate means no adaption, one means new frequency = symbol frequency.", new DoubleValue(0.1)));
     }
 
@@ -43,4 +69,8 @@
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
+      if (!Parameters.ContainsKey(MinimumFrequencyParameterName))
+        Parameters.Add(new FixedValueParameter<DoubleValue>(MinimumFrequencyParameterName, "Minimum Frequency for the controller to set to symbols.", new DoubleValue(0)));
+      if (!Parameters.ContainsKey(LearningRateParameterName))
+        Parameters.Add(new FixedValueParameter<DoubleValue>(LearningRateParameterName, "Learning Rate for how fast the frequency is adapted. Zero learning rate means no adaption, one means new frequency = symbol frequency.", new DoubleValue(0.1)));
     }
     #endregion
@@ -50,4 +80,6 @@
       var trees = SymbolicExpressionTreeParameter.ActualValue;
       var grammar = SymbolicExpressionTreeGrammarParameter.ActualValue;
+      double minimumFrequency = MinimumFrequency;
+      double learningRate = LearningRate;
 
       var symbolFrequencies = SymbolicExpressionSymbolFrequencyAnalyzer.CalculateSymbolFrequencies(trees).ToDictionary(x => x.Key, x => x.Value);
@@ -59,5 +91,8 @@
 
         if (symbolFrequencies.TryGetValue(s.Name, out double f)) {
-          s.InitialFrequency = f;
+          double oldFrequency = s.InitialFrequency;
+          double symbolFrequency = f;
+          double newFrequency = oldFrequency + (symbolFrequency - oldFrequency) * learningRate;
+          s.InitialFrequency = Math.Max(minimumFrequency, newFrequency);
         }
       }
