Index: branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/DeceptiveTrapProblem.cs
===================================================================
--- branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/DeceptiveTrapProblem.cs	(revision 11640)
+++ branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/DeceptiveTrapProblem.cs	(revision 11640)
@@ -0,0 +1,63 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Algorithms.ParameterlessPopulationPyramid {
+  [Item("Deceptive Trap Problem", "Genome encodes completely separable blocks, where each block is fully deceptive.")]
+  [StorableClass]
+  [Creatable("Parameterless Population Pyramid")]
+  public class DeceptiveTrapProblem : BinaryVectorProblem {
+    [StorableConstructor]
+    protected DeceptiveTrapProblem(bool deserializing) : base(deserializing) { }
+    protected DeceptiveTrapProblem(DeceptiveTrapProblem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DeceptiveTrapProblem(this, cloner);
+    }
+
+    public override bool Maximization {
+      get { return true; }
+    }
+
+    private const string TrapSizeParameterName = "Trap Size";
+
+    public IFixedValueParameter<IntValue> TrapSizeParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters[TrapSizeParameterName]; }
+    }
+
+    public int TrapSize {
+      get { return TrapSizeParameter.Value.Value; }
+      set { TrapSizeParameter.Value.Value = value; }
+    }
+    public DeceptiveTrapProblem()
+      : base() {
+      Parameters.Add(new FixedValueParameter<IntValue>(TrapSizeParameterName, "", new IntValue(5)));
+    }
+
+    public override double Evaluate(bool[] individual) {
+      if (individual.Length != Length) throw new ArgumentException("The individual has not the correct length.");
+      int total = 0;
+      for (int i = 0; i < individual.Length; i += TrapSize) {
+        int partial = 0;
+        for (int index = i; index < i + TrapSize; index++) {
+          if (individual[index]) partial++;
+        }
+
+        // Make it deceptive
+        if (partial < TrapSize) {
+          partial = TrapSize - partial - 1;
+        }
+        total += partial;
+      }
+      return total;
+    }
+  }
+}
Index: branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3.csproj
===================================================================
--- branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3.csproj	(revision 11637)
+++ branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3.csproj	(revision 11640)
@@ -100,4 +100,5 @@
   <ItemGroup>
     <Compile Include="AlgorithmBase.cs" />
+    <Compile Include="DeceptiveTrapProblem.cs" />
     <Compile Include="HillClimber.cs" />
     <Compile Include="Problems\BinaryVectorProblem.cs" />
Index: branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HillClimber.cs
===================================================================
--- branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HillClimber.cs	(revision 11637)
+++ branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HillClimber.cs	(revision 11640)
@@ -27,4 +27,5 @@
 using HeuristicLab.Encodings.BinaryVectorEncoding;
 using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Random;
@@ -38,4 +39,15 @@
     [Storable]
     private IRandom random;
+    
+    private const string IterationsParameterName = "Iterations";
+
+    public IFixedValueParameter<IntValue> IterationsParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters[IterationsParameterName]; }
+    }
+
+    public int Iterations {
+      get { return IterationsParameter.Value.Value; }
+      set { IterationsParameter.Value.Value = value; }
+    }
 
     [StorableConstructor]
@@ -51,15 +63,22 @@
       : base() {
       random = new MersenneTwister();
+      Parameters.Add(new FixedValueParameter<IntValue>(IterationsParameterName, "", new IntValue(100)));
     }
     protected override void Run() {
-      bool[] solution = new bool[Problem.Length];
-      for (int i = 0; i < solution.Length; i++) {
-        solution[i] = random.Next(2) == 1;
+      var BestQuality = new DoubleValue(double.NaN);
+      Results.Add(new Result("Best quality", BestQuality));
+      for (int iteration = 0; iteration < Iterations; iteration++) {
+        bool[] solution = new bool[Problem.Length];
+        for (int i = 0; i < solution.Length; i++) {
+          solution[i] = random.Next(2) == 1;
+        }
+
+        var fitness = Problem.Evaluate(solution);
+
+        fitness = ImproveToLocalOptimum(Problem, solution, fitness, random);
+        if (double.IsNaN(BestQuality.Value) || Problem.IsBetter(fitness, BestQuality.Value)) {
+          BestQuality.Value = fitness;
+        }
       }
-      var fitness = Problem.Evaluate(solution);
-      fitness = ImproveToLocalOptimum(Problem, solution, fitness, random);
-
-      Results.Add(new Result("Best quality", new DoubleValue(fitness)));
-      Results.Add(new Result("Best solution", new BinaryVector(solution)));
     }
     public static double ImproveToLocalOptimum(BinaryVectorProblem problem, bool[] solution, double fitness, IRandom rand) {
@@ -70,5 +89,5 @@
           solution[option] = !solution[option];
           double newFitness = problem.Evaluate(solution);
-          if ((problem.Maximization && fitness < newFitness) || (!problem.Maximization && fitness > newFitness)) {
+          if (problem.IsBetter(newFitness, fitness)) {
             fitness = newFitness;
             tried.Clear();
Index: branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Problems/BinaryVectorProblem.cs
===================================================================
--- branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Problems/BinaryVectorProblem.cs	(revision 11637)
+++ branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Problems/BinaryVectorProblem.cs	(revision 11640)
@@ -48,8 +48,11 @@
     protected BinaryVectorProblem(bool deserializing) : base(deserializing) { }
     protected BinaryVectorProblem(BinaryVectorProblem original, Cloner cloner) : base(original, cloner) { }
+    public bool IsBetter(double quality, double bestQuality) {
+      return (Maximization && quality > bestQuality || !Maximization && quality < bestQuality);
+    }
 
     public BinaryVectorProblem()
       : base() {
-      Parameters.Add(new FixedValueParameter<IntValue>(LengthParameterName, "", new IntValue(5)));
+      Parameters.Add(new FixedValueParameter<IntValue>(LengthParameterName, "", new IntValue(20)));
     }
 
Index: branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Problems/OneMaxProblem.cs
===================================================================
--- branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Problems/OneMaxProblem.cs	(revision 11637)
+++ branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Problems/OneMaxProblem.cs	(revision 11640)
@@ -42,5 +42,4 @@
     public override double Evaluate(bool[] individual) {
       if (individual.Length != Length) throw new ArgumentException("The individual has not the correct length.");
-      //return individual.Count(x => x);
       double quality = 0;
       for (int i = 0; i < individual.Length; i++)
