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 11663)
+++ /branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3.csproj	(revision 11664)
@@ -104,4 +104,5 @@
     <Compile Include="HillClimber.cs" />
     <Compile Include="LinkageTree.cs" />
+    <Compile Include="ParameterlessPopulationPyramid.cs" />
     <Compile Include="Population.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 11663)
+++ /branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HillClimber.cs	(revision 11664)
@@ -39,5 +39,5 @@
     [Storable]
     private IRandom random;
-    
+
     private const string IterationsParameterName = "Iterations";
 
Index: /branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/ParameterlessPopulationPyramid.cs
===================================================================
--- /branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/ParameterlessPopulationPyramid.cs	(revision 11664)
+++ /branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/ParameterlessPopulationPyramid.cs	(revision 11664)
@@ -0,0 +1,120 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Algorithms.ParameterlessPopulationPyramid {
+  [Item("Parameter-less Population Pyramid", "Binary value optimization algorithm which requires no configuration.")]
+  [StorableClass]
+  [Creatable("Parameterless Population Pyramid")]
+  
+  public class ParameterlessPopulationPyramid : AlgorithmBase {
+    [Storable]
+    private IRandom random;
+
+    [Storable]
+    private List<Population> pyramid;
+
+    // Tracks all solutions in Pyramid for quick membership checks
+    private readonly HashSet<bool[]> seen = new HashSet<bool[]>();
+
+    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]
+    protected ParameterlessPopulationPyramid(bool deserializing) : base(deserializing) { }
+
+    protected ParameterlessPopulationPyramid(ParameterlessPopulationPyramid original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParameterlessPopulationPyramid(this, cloner);
+    }
+
+    public ParameterlessPopulationPyramid() {
+      Parameters.Add(new FixedValueParameter<IntValue>(IterationsParameterName, "", new IntValue(100)));
+    }
+
+
+    private void AddIfUnique(bool[] solution, int level) {
+      // Don't add things you have seen
+      if (seen.Contains(solution)) return;
+      if (level == pyramid.Count) {
+        pyramid.Add(new Population(Problem.Length, random));
+      }
+      pyramid[level].Add(solution);
+      seen.Add(solution);
+    }
+
+    private double iterate() {
+      // Create a random solution
+      bool[] solution = new bool[Problem.Length];
+      for (int i = 0; i < solution.Length; i++) {
+        solution[i] = random.Next(2) == 1;
+      }
+      double fitness = Problem.Evaluate(solution);
+      fitness = HillClimber.ImproveToLocalOptimum(Problem, solution, fitness, random);
+      AddIfUnique(solution, 0);
+      for (int level = 0; level < pyramid.Count; level++) {
+        var current = pyramid[level];
+        double newFitness = LinkageCrossover.ImproveUsingTree(current.Tree, current.Solutions, solution, fitness, Problem, random);
+        // add it to the next level if its a strict fitness improvement
+        if (Problem.IsBetter(newFitness, fitness)) {
+          fitness = newFitness;
+          AddIfUnique(solution, level + 1);
+        }
+      }
+      return fitness;
+    }
+
+    protected override void Run() {
+      pyramid = new List<Population>();
+      random = new MersenneTwister();
+      var BestQuality = new DoubleValue(double.NaN);
+      Results.Add(new Result("Best quality", BestQuality));
+      for (int iteration = 0; iteration < Iterations; iteration++) {
+        var fitness = iterate();
+        if (double.IsNaN(BestQuality.Value) || Problem.IsBetter(fitness, BestQuality.Value)) {
+          BestQuality.Value = fitness;
+        }
+      }
+    }
+  }
+}
Index: /branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Population.cs
===================================================================
--- /branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Population.cs	(revision 11663)
+++ /branches/Parameter-less Population Pyramid/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Population.cs	(revision 11664)
@@ -31,8 +31,17 @@
     private readonly List<bool[]> solutions = new List<bool[]>();
     private LinkageTree tree;
+
+    public LinkageTree Tree {
+      get { return tree; }
+    }
+
+    public List<bool[]> Solutions {
+      get { return solutions; }
+    }
+
     public Population(int length, IRandom rand) {
       tree = new LinkageTree(length, rand);
     }
-    void Add(bool[] solution) {
+    public void Add(bool[] solution) {
       solutions.Add(solution);
       tree.Add(solution);
