Index: trunk/HeuristicLab 3.3.sln
===================================================================
--- trunk/HeuristicLab 3.3.sln	(revision 17835)
+++ trunk/HeuristicLab 3.3.sln	(revision 17836)
@@ -1,6 +1,6 @@
 ﻿
 Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.26730.16
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.30907.101
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{96396439-A764-4022-A8D2-BE021449B8D1}"
@@ -471,4 +471,6 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Algorithms.DataAnalysis.DecisionTrees-3.4", "HeuristicLab.Algorithms.DataAnalysis.DecisionTrees\3.4\HeuristicLab.Algorithms.DataAnalysis.DecisionTrees-3.4.csproj", "{541A53F3-E6A7-402F-91BB-D76041CDD9FD}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Algorithms.MultiObjectiveLocalSearch", "HeuristicLab.Algorithms.MultiObjectiveLocalSearch\3.3\HeuristicLab.Algorithms.MultiObjectiveLocalSearch.csproj", "{4CCDD23A-9FA3-4B36-9469-87D67E99225F}"
 EndProject
 Global
@@ -2290,4 +2292,16 @@
 		{541A53F3-E6A7-402F-91BB-D76041CDD9FD}.Release|x86.ActiveCfg = Release|Any CPU
 		{541A53F3-E6A7-402F-91BB-D76041CDD9FD}.Release|x86.Build.0 = Release|Any CPU
+		{4CCDD23A-9FA3-4B36-9469-87D67E99225F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4CCDD23A-9FA3-4B36-9469-87D67E99225F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{4CCDD23A-9FA3-4B36-9469-87D67E99225F}.Debug|x64.ActiveCfg = Debug|x64
+		{4CCDD23A-9FA3-4B36-9469-87D67E99225F}.Debug|x64.Build.0 = Debug|x64
+		{4CCDD23A-9FA3-4B36-9469-87D67E99225F}.Debug|x86.ActiveCfg = Debug|x86
+		{4CCDD23A-9FA3-4B36-9469-87D67E99225F}.Debug|x86.Build.0 = Debug|x86
+		{4CCDD23A-9FA3-4B36-9469-87D67E99225F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{4CCDD23A-9FA3-4B36-9469-87D67E99225F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{4CCDD23A-9FA3-4B36-9469-87D67E99225F}.Release|x64.ActiveCfg = Release|x64
+		{4CCDD23A-9FA3-4B36-9469-87D67E99225F}.Release|x64.Build.0 = Release|x64
+		{4CCDD23A-9FA3-4B36-9469-87D67E99225F}.Release|x86.ActiveCfg = Release|x86
+		{4CCDD23A-9FA3-4B36-9469-87D67E99225F}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
Index: trunk/HeuristicLab.Algorithms.MultiObjectiveLocalSearch/3.3/GSEMO.cs
===================================================================
--- trunk/HeuristicLab.Algorithms.MultiObjectiveLocalSearch/3.3/GSEMO.cs	(revision 17836)
+++ trunk/HeuristicLab.Algorithms.MultiObjectiveLocalSearch/3.3/GSEMO.cs	(revision 17836)
@@ -0,0 +1,450 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2021 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.Linq;
+using HEAL.Attic;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Random;
+using HeuristicLab.Selection;
+
+namespace HeuristicLab.Algorithms.MultiObjectiveLocalSearch {
+  [Item("Simple Evolutionary Multiobjective Algorithm (G-SEMO)", "Global Simple Evolutionary MultiObjective Algorithm is implemented as described in the literature (e.g. Laumanns, M., Thiele, L. and Zitzler, E., 2004. Running time analysis of evolutionary algorithms on a simplified multiobjective knapsack problem. Natural Computing, 3(1), pp. 37-51), but adds the option to evaluate additional children in each generation.")]
+  [StorableType("D9025144-B783-4484-B35B-7543C5A6D031")]
+  [Creatable(CreatableAttribute.Categories.SingleSolutionAlgorithms)]
+  public class GSEMO : HeuristicOptimizationEngineAlgorithm, IStorableContent {
+    public string Filename { get; set; }
+
+    public override Type ProblemType => typeof(IMultiObjectiveHeuristicOptimizationProblem);
+
+    public new IMultiObjectiveHeuristicOptimizationProblem Problem {
+      get { return (IMultiObjectiveHeuristicOptimizationProblem)base.Problem; }
+      set { base.Problem = value; }
+    }
+
+    private IFixedValueParameter<IntValue> SeedParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["Seed"]; }
+    }
+
+    private IFixedValueParameter<BoolValue> SetSeedRandomlyParameter {
+      get { return (IFixedValueParameter<BoolValue>)Parameters["SetSeedRandomly"]; }
+    }
+
+    public IFixedValueParameter<IntValue> MaximumGenerationsParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["MaximumGenerations"]; }
+    }
+
+
+    public IFixedValueParameter<IntValue> PopulationSizeParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["PopulationSize"]; }
+    }
+
+    public IFixedValueParameter<IntValue> OffspringParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["Offspring"]; }
+    }
+
+    public IConstrainedValueParameter<IManipulator> MutatorParameter {
+      get { return (IConstrainedValueParameter<IManipulator>)Parameters["Mutator"]; }
+    }
+
+    public IValueParameter<MultiAnalyzer> AnalyzerParameter {
+      get { return (IValueParameter<MultiAnalyzer>)Parameters["Analyzer"]; }
+    }
+
+    public IFixedValueParameter<BoolValue> DominateOnEqualQualitiesParameter {
+      get { return (IFixedValueParameter<BoolValue>)Parameters["DominateOnEqualQualities"]; }
+    }
+
+    public int Seed {
+      get { return SeedParameter.Value.Value; }
+      set { SeedParameter.Value.Value = value; }
+    }
+
+    public bool SetSeedRandomly {
+      get { return SetSeedRandomlyParameter.Value.Value; }
+      set { SetSeedRandomlyParameter.Value.Value = value; }
+    }
+
+    public int MaximumGenerations {
+      get { return MaximumGenerationsParameter.Value.Value; }
+      set { MaximumGenerationsParameter.Value.Value = value; }
+    }
+
+    public int PopulationSize {
+      get { return PopulationSizeParameter.Value.Value; }
+      set { PopulationSizeParameter.Value.Value = value; }
+    }
+
+    public int Offspring {
+      get { return OffspringParameter.Value.Value; }
+      set { OffspringParameter.Value.Value = value; }
+    }
+
+    public IManipulator Mutator {
+      get { return MutatorParameter.Value; }
+      set {
+        if (!MutatorParameter.ValidValues.Contains(value))
+          MutatorParameter.ValidValues.Add(value);
+        MutatorParameter.Value = value;
+      }
+    }
+
+    public MultiAnalyzer Analyzer {
+      get { return AnalyzerParameter.Value; }
+      set { AnalyzerParameter.Value = value; }
+    }
+
+    public bool DominateOnEqualQualities {
+      get { return DominateOnEqualQualitiesParameter.Value.Value; }
+      set { DominateOnEqualQualitiesParameter.Value.Value = value; }
+    }
+
+    [Storable]
+    private RankBasedParetoFrontAnalyzer paretoFrontAnalyzer;
+    [Storable]
+    private RandomCreator randomCreator;
+    [Storable]
+    private SolutionsCreator solutionsCreator;
+    [Storable]
+    private CrowdingDistanceAssignment popSizeCrowding;
+
+    [StorableConstructor]
+    protected GSEMO(StorableConstructorFlag _) : base(_) { }
+    protected GSEMO(GSEMO original, Cloner cloner)
+    : base(original, cloner) {
+      paretoFrontAnalyzer = cloner.Clone(original.paretoFrontAnalyzer);
+      randomCreator = cloner.Clone(original.randomCreator);
+      solutionsCreator = cloner.Clone(original.solutionsCreator);
+      popSizeCrowding = cloner.Clone(original.popSizeCrowding);
+      RegisterEventhandlers();
+    }
+    public GSEMO() {
+      Parameters.Add(new FixedValueParameter<IntValue>("Seed", "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
+      Parameters.Add(new FixedValueParameter<BoolValue>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true)));
+      Parameters.Add(new FixedValueParameter<IntValue>("MaximumGenerations", "Stopping criterion, terminates after this number of generations.", new IntValue(1000)));
+      Parameters.Add(new FixedValueParameter<IntValue>("PopulationSize", "The size of the pareto archive, the NSGA-II's rank and crowding sorter will be used to determine which solutions remain in the population.", new IntValue(int.MaxValue)));
+      Parameters.Add(new FixedValueParameter<IntValue>("Offspring", "The number of offspring to generate in each generation.", new IntValue(1)));
+      Parameters.Add(new ConstrainedValueParameter<IManipulator>("Mutator", "The operator that mutates a solutions slightly."));
+      Parameters.Add(new ValueParameter<MultiAnalyzer>("Analyzer", "The operator used to analyze each generation.", new MultiAnalyzer()));
+      Parameters.Add(new FixedValueParameter<BoolValue>("DominateOnEqualQualities", "Flag which determines wether solutions with equal quality values should be treated as dominated.", new BoolValue(false)) { Hidden = true });
+
+      randomCreator = new RandomCreator();
+      solutionsCreator = new SolutionsCreator();
+      var countInitialEvaluatedSolutions = new SubScopesCounter();
+      var resultsCollectorLoop = new ResultsCollector();
+      var variableCreator = new VariableCreator();
+      var analyzerLoop = new Placeholder();
+      var selector = new RandomSelector();
+      var generationProcessor = new SubScopesProcessor();
+      var usspManipulation = new UniformSubScopesProcessor();
+      var manipulatorPlaceholder = new Placeholder();
+      var usspEvaluation = new UniformSubScopesProcessor();
+      var evaluatorPlaceholder = new Placeholder();
+      var countEvaluatedSolutions = new SubScopesCounter();
+      var merge = new MergingReducer();
+      var nonDominatedSort = new FastNonDominatedSort();
+      var frontSelector = new LeftReducer();
+
+      var popSizeCounter = new SubScopesCounter();
+      var popSizeComparator = new Comparator();
+      var popSizeBranch = new ConditionalBranch();
+      popSizeCrowding = new CrowdingDistanceAssignment();
+      var popSizeSorter = new CrowdedComparisonSorter();
+      var popSizeSelector = new LeftSelector();
+      var popSizeTrimmer = new RightReducer();
+
+      var incrementGenerations = new IntCounter();
+      var comparator = new Comparator();
+      var conditionalBranch = new ConditionalBranch();
+      var resultsCollectorFinish = new ResultsCollector();
+      var analyzerFinish = new Placeholder();
+
+      OperatorGraph.InitialOperator = randomCreator;
+
+      randomCreator.RandomParameter.ActualName = "Random";
+      randomCreator.SeedParameter.ActualName = SeedParameter.Name;
+      randomCreator.SeedParameter.Value = null;
+      randomCreator.SetSeedRandomlyParameter.ActualName = SetSeedRandomlyParameter.Name;
+      randomCreator.SetSeedRandomlyParameter.Value = null;
+      randomCreator.Successor = variableCreator;
+
+      variableCreator.Name = "Generations := 0";
+      variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("Generations", new IntValue(0)));
+      variableCreator.Successor = solutionsCreator;
+
+      solutionsCreator.Name = "Create initial solution";
+      solutionsCreator.NumberOfSolutionsParameter.Value = new IntValue(1);
+      solutionsCreator.Successor = countInitialEvaluatedSolutions;
+
+      countInitialEvaluatedSolutions.Name = "Initialize EvaluatedSolutions";
+      countInitialEvaluatedSolutions.ValueParameter.ActualName = "EvaluatedSolutions";
+      countInitialEvaluatedSolutions.Successor = resultsCollectorLoop;
+
+      resultsCollectorLoop.CollectedValues.Add(new LookupParameter<IntValue>("Evaluated Solutions", null, "EvaluatedSolutions"));
+      resultsCollectorLoop.CollectedValues.Add(new LookupParameter<IntValue>("Generations"));
+      resultsCollectorLoop.ResultsParameter.ActualName = "Results";
+      resultsCollectorLoop.Successor = analyzerLoop;
+
+      analyzerLoop.Name = "(Analyzer)";
+      analyzerLoop.OperatorParameter.ActualName = AnalyzerParameter.Name;
+      analyzerLoop.Successor = selector;
+
+      selector.NumberOfSelectedSubScopesParameter.Value = null;
+      selector.NumberOfSelectedSubScopesParameter.ActualName = OffspringParameter.Name;
+      selector.RandomParameter.ActualName = "Random";
+      selector.CopySelected = new BoolValue(true);
+      selector.Successor = generationProcessor;
+
+      generationProcessor.Name = "Process Generations";
+      generationProcessor.Operators.Add(new EmptyOperator() { Name = "Leave Parent Population" });
+      generationProcessor.Operators.Add(usspManipulation);
+      generationProcessor.Successor = merge;
+
+      usspManipulation.Name = "Mutate Child Population";
+      usspManipulation.Parallel = new BoolValue(false);
+      usspManipulation.Operator = manipulatorPlaceholder;
+      usspManipulation.Successor = usspEvaluation;
+
+      manipulatorPlaceholder.Name = "(Manipulator)";
+      manipulatorPlaceholder.OperatorParameter.ActualName = MutatorParameter.Name;
+
+      usspEvaluation.Parallel = new BoolValue(true);
+      usspEvaluation.Operator = evaluatorPlaceholder;
+      usspEvaluation.Successor = countEvaluatedSolutions;
+
+      evaluatorPlaceholder.Name = "(Evaluate)";
+      evaluatorPlaceholder.OperatorParameter.ActualName = "Evaluator";
+
+      countEvaluatedSolutions.Name = "Increment EvaluatedSolutions";
+      countEvaluatedSolutions.ValueParameter.ActualName = "EvaluatedSolutions";
+
+      merge.Successor = nonDominatedSort;
+
+      nonDominatedSort.Name = "Calculate Fronts";
+      nonDominatedSort.DominateOnEqualQualitiesParameter.ActualName = DominateOnEqualQualitiesParameter.Name;
+      nonDominatedSort.Successor = frontSelector;
+
+      frontSelector.Name = "Keep Best Front";
+      frontSelector.Successor = popSizeCounter;
+
+      popSizeCounter.Name = "Count Population";
+      popSizeCounter.AccumulateParameter.Value = new BoolValue(false);
+      popSizeCounter.ValueParameter.ActualName = "CurrentPopulationSize";
+      popSizeCounter.Successor = popSizeComparator;
+
+      popSizeComparator.Name = "CurrentPopulationSize > PopulationSize ?";
+      popSizeComparator.LeftSideParameter.ActualName = "CurrentPopulationSize";
+      popSizeComparator.RightSideParameter.Value = null;
+      popSizeComparator.RightSideParameter.ActualName = PopulationSizeParameter.Name;
+      popSizeComparator.Comparison.Value = ComparisonType.Greater;
+      popSizeComparator.ResultParameter.ActualName = "TrimPopulation";
+      popSizeComparator.Successor = popSizeBranch;
+
+      popSizeBranch.Name = "Trim Population ?";
+      popSizeBranch.ConditionParameter.ActualName = "TrimPopulation";
+      popSizeBranch.TrueBranch = popSizeCrowding;
+      popSizeBranch.Successor = incrementGenerations;
+
+      popSizeCrowding.CrowdingDistanceParameter.Depth = 1;
+      popSizeCrowding.Successor = popSizeSorter;
+
+      popSizeSorter.CrowdingDistanceParameter.ActualName = popSizeCrowding.CrowdingDistanceParameter.ActualName;
+      popSizeSorter.RankParameter.ActualName = nonDominatedSort.RankParameter.ActualName;
+      popSizeSorter.RankParameter.Depth = 1;
+      popSizeSorter.Successor = popSizeSelector;
+
+      popSizeSelector.CopySelected = new BoolValue(false);
+      popSizeSelector.NumberOfSelectedSubScopesParameter.Value = null;
+      popSizeSelector.NumberOfSelectedSubScopesParameter.ActualName = PopulationSizeParameter.Name;
+      popSizeSelector.Successor = popSizeTrimmer;
+
+      popSizeTrimmer.Name = "Trim PopulationSize";
+      popSizeTrimmer.Successor = null;
+
+      incrementGenerations.Name = "Generations++";
+      incrementGenerations.Increment = new IntValue(1);
+      incrementGenerations.ValueParameter.ActualName = "Generations";
+      incrementGenerations.Successor = comparator;
+
+      comparator.Name = "Generations >= MaximumGenerations ?";
+      comparator.Comparison = new Comparison(ComparisonType.GreaterOrEqual);
+      comparator.LeftSideParameter.ActualName = "Generations";
+      comparator.ResultParameter.ActualName = "Terminate";
+      comparator.RightSideParameter.ActualName = "MaximumGenerations";
+      comparator.Successor = conditionalBranch;
+
+      conditionalBranch.Name = "Terminate?";
+      conditionalBranch.ConditionParameter.ActualName = "Terminate";
+      conditionalBranch.FalseBranch = resultsCollectorLoop;
+      conditionalBranch.TrueBranch = resultsCollectorFinish;
+
+      resultsCollectorFinish.CollectedValues.Add(new LookupParameter<IntValue>("Evaluated Solutions", null, "EvaluatedSolutions"));
+      resultsCollectorFinish.CollectedValues.Add(new LookupParameter<IntValue>("Generations"));
+      resultsCollectorFinish.ResultsParameter.ActualName = "Results";
+      resultsCollectorFinish.Successor = analyzerFinish;
+
+      analyzerFinish.Name = "(Analyzer)";
+      analyzerFinish.OperatorParameter.ActualName = AnalyzerParameter.Name;
+
+      paretoFrontAnalyzer = new RankBasedParetoFrontAnalyzer();
+      paretoFrontAnalyzer.RankParameter.ActualName = "Rank";
+      paretoFrontAnalyzer.RankParameter.Depth = 1;
+      paretoFrontAnalyzer.ResultsParameter.ActualName = "Results";
+
+      ParameterizeAnalyzers();
+      UpdateAnalyzers();
+
+      RegisterEventhandlers();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GSEMO(this, cloner);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventhandlers();
+    }
+
+    private void RegisterEventhandlers() {
+      if (Problem != null) {
+        Problem.Evaluator.QualitiesParameter.ActualNameChanged += new EventHandler(Evaluator_QualitiesParameter_ActualNameChanged);
+      }
+    }
+
+    public override void Prepare() {
+      if (Problem != null) base.Prepare();
+    }
+
+    #region Events
+    protected override void OnProblemChanged() {
+      ParameterizeStochasticOperator(Problem.SolutionCreator);
+      ParameterizeStochasticOperator(Problem.Evaluator);
+      foreach (var op in Problem.Operators.OfType<IOperator>()) ParameterizeStochasticOperator(op);
+      ParameterizeSolutionsCreator();
+      ParameterizeAnalyzers();
+      ParameterizeQualitiesOperators();
+      ParameterizeIterationBasedOperators();
+      UpdateMutators();
+      UpdateAnalyzers();
+      Problem.Evaluator.QualitiesParameter.ActualNameChanged += new EventHandler(Evaluator_QualitiesParameter_ActualNameChanged);
+      base.OnProblemChanged();
+    }
+
+    protected override void Problem_SolutionCreatorChanged(object sender, EventArgs e) {
+      ParameterizeStochasticOperator(Problem.SolutionCreator);
+      ParameterizeSolutionsCreator();
+      base.Problem_SolutionCreatorChanged(sender, e);
+    }
+    protected override void Problem_EvaluatorChanged(object sender, EventArgs e) {
+      ParameterizeStochasticOperator(Problem.Evaluator);
+      ParameterizeSolutionsCreator();
+      ParameterizeAnalyzers();
+      ParameterizeQualitiesOperators();
+      Problem.Evaluator.QualitiesParameter.ActualNameChanged += new EventHandler(Evaluator_QualitiesParameter_ActualNameChanged);
+      base.Problem_EvaluatorChanged(sender, e);
+    }
+    protected override void Problem_OperatorsChanged(object sender, EventArgs e) {
+      foreach (var op in Problem.Operators.OfType<IOperator>()) ParameterizeStochasticOperator(op);
+      ParameterizeIterationBasedOperators();
+      UpdateMutators();
+      UpdateAnalyzers();
+      base.Problem_OperatorsChanged(sender, e);
+    }
+    private void Evaluator_QualitiesParameter_ActualNameChanged(object sender, EventArgs e) {
+      ParameterizeAnalyzers();
+      ParameterizeQualitiesOperators();
+    }
+    #endregion
+
+    private void ParameterizeSolutionsCreator() {
+      solutionsCreator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
+      solutionsCreator.SolutionCreatorParameter.ActualName = Problem.SolutionCreatorParameter.Name;
+    }
+    private void ParameterizeStochasticOperator(IOperator op) {
+      var stochasticOp = op as IStochasticOperator;
+      if (stochasticOp != null) {
+        stochasticOp.RandomParameter.ActualName = randomCreator.RandomParameter.ActualName;
+        stochasticOp.RandomParameter.Hidden = true;
+      }
+    }
+    private void ParameterizeAnalyzers() {
+      paretoFrontAnalyzer.ResultsParameter.ActualName = "Results";
+      paretoFrontAnalyzer.ResultsParameter.Hidden = true;
+      if (Problem != null) {
+        paretoFrontAnalyzer.QualitiesParameter.ActualName = Problem.Evaluator.QualitiesParameter.ActualName;
+        paretoFrontAnalyzer.QualitiesParameter.Depth = 1;
+        paretoFrontAnalyzer.QualitiesParameter.Hidden = true;
+      }
+    }
+    private void ParameterizeIterationBasedOperators() {
+      if (Problem != null) {
+        foreach (var op in Problem.Operators.OfType<IIterationBasedOperator>()) {
+          op.IterationsParameter.ActualName = "Generations";
+          op.IterationsParameter.Hidden = true;
+          op.MaximumIterationsParameter.ActualName = "MaximumGenerations";
+          op.MaximumIterationsParameter.Hidden = true;
+        }
+      }
+    }
+    private void ParameterizeQualitiesOperators() {
+      if (Problem != null) {
+        popSizeCrowding.QualitiesParameter.ActualName = Problem.Evaluator.QualitiesParameter.Name;
+      }
+    }
+    private void UpdateMutators() {
+      var oldMutator = MutatorParameter.Value;
+      MutatorParameter.ValidValues.Clear();
+      var defaultMutator = Problem.Operators.Where(x => !(x is ISingleObjectiveOperator)).OfType<IManipulator>().FirstOrDefault();
+
+      foreach (var mutator in Problem.Operators.Where(x => !(x is ISingleObjectiveOperator)).OfType<IManipulator>().OrderBy(x => x.Name))
+        MutatorParameter.ValidValues.Add(mutator);
+
+      if (oldMutator != null) {
+        var mutator = MutatorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMutator.GetType());
+        if (mutator != null) MutatorParameter.Value = mutator;
+        else oldMutator = null;
+      }
+
+      if (oldMutator == null && defaultMutator != null)
+        MutatorParameter.Value = defaultMutator;
+    }
+    private void UpdateAnalyzers() {
+      Analyzer.Operators.Clear();
+      if (Problem != null) {
+        foreach (var analyzer in Problem.Operators.Where(x => !(x is ISingleObjectiveOperator)).OfType<IAnalyzer>()) {
+          foreach (var param in analyzer.Parameters.OfType<IScopeTreeLookupParameter>())
+            param.Depth = 1;
+          Analyzer.Operators.Add(analyzer, analyzer.EnabledByDefault);
+        }
+      }
+      Analyzer.Operators.Add(paretoFrontAnalyzer, paretoFrontAnalyzer.EnabledByDefault);
+    }
+
+  }
+}
Index: trunk/HeuristicLab.Algorithms.MultiObjectiveLocalSearch/3.3/HeuristicLab.Algorithms.MultiObjectiveLocalSearch.csproj
===================================================================
--- trunk/HeuristicLab.Algorithms.MultiObjectiveLocalSearch/3.3/HeuristicLab.Algorithms.MultiObjectiveLocalSearch.csproj	(revision 17836)
+++ trunk/HeuristicLab.Algorithms.MultiObjectiveLocalSearch/3.3/HeuristicLab.Algorithms.MultiObjectiveLocalSearch.csproj	(revision 17836)
@@ -0,0 +1,177 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{4CCDD23A-9FA3-4B36-9469-87D67E99225F}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Algorithms.MultiObjectiveLocalSearch</RootNamespace>
+    <AssemblyName>HeuristicLab.Algorithms.MultiObjectiveLocalSearch-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <Deterministic>true</Deterministic>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <LangVersion>7.3</LangVersion>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <LangVersion>7.3</LangVersion>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <LangVersion>7.3</LangVersion>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <LangVersion>7.3</LangVersion>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HEAL.Attic">
+      <HintPath>$(SolutionDir)\bin\HEAL.Attic.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="GSEMO.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <Compile Include="Plugin.cs" />
+    <None Include="Plugin.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Analysis\3.3\HeuristicLab.Analysis-3.3.csproj">
+      <Project>{887425b4-4348-49ed-a457-b7d2c26ddbf9}</Project>
+      <Name>HeuristicLab.Analysis-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958b43bc-cc5c-4fa2-8628-2b3b01d890b6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{a9ad58b9-3ef9-4cc1-97e5-8d909039ff5c}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{c36bd924-a541-4a00-afa8-41701378ddc5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{bbab9df5-5ef3-4ba8-ade9-b36e82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Operators\3.3\HeuristicLab.Operators-3.3.csproj">
+      <Project>{23da7ff4-d5b8-41b6-aa96-f0561d24f3ee}</Project>
+      <Name>HeuristicLab.Operators-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization.Operators\3.3\HeuristicLab.Optimization.Operators-3.3.csproj">
+      <Project>{25087811-f74c-4128-bc86-8324271da13e}</Project>
+      <Name>HeuristicLab.Optimization.Operators-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
+      <Project>{14ab8d24-25bc-400c-a846-4627aa945192}</Project>
+      <Name>HeuristicLab.Optimization-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
+      <Project>{56f9106a-079f-4c61-92f6-86a84c2d84b7}</Project>
+      <Name>HeuristicLab.Parameters-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102bc7d3-0ef9-439c-8f6d-96ff0fdb8e1b}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186a6a-5176-4402-ae83-886557b53cca}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Random\3.3\HeuristicLab.Random-3.3.csproj">
+      <Project>{f4539fb6-4708-40c9-be64-0a1390aea197}</Project>
+      <Name>HeuristicLab.Random-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Selection\3.3\HeuristicLab.Selection-3.3.csproj">
+      <Project>{2c36cd4f-e5f5-43a4-801a-201ea895fe17}</Project>
+      <Name>HeuristicLab.Selection-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: trunk/HeuristicLab.Algorithms.MultiObjectiveLocalSearch/3.3/Plugin.cs.frame
===================================================================
--- trunk/HeuristicLab.Algorithms.MultiObjectiveLocalSearch/3.3/Plugin.cs.frame	(revision 17836)
+++ trunk/HeuristicLab.Algorithms.MultiObjectiveLocalSearch/3.3/Plugin.cs.frame	(revision 17836)
@@ -0,0 +1,41 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2021 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 HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Algorithms.MultiObjectiveLocalSearch {
+  [Plugin("HeuristicLab.Algorithms.MultiObjectiveLocalSearch", "3.3.16.$WCREV$")]
+  [PluginFile("HeuristicLab.Algorithms.MultiObjectiveLocalSearch-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Attic", "1.0")]
+  [PluginDependency("HeuristicLab.Analysis", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
+  [PluginDependency("HeuristicLab.Selection", "3.3")]
+  public sealed class HeuristicLabAlgorithmsMultiObjectiveLocalSearchPlugin : PluginBase {
+  }
+}
Index: trunk/HeuristicLab.Algorithms.MultiObjectiveLocalSearch/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- trunk/HeuristicLab.Algorithms.MultiObjectiveLocalSearch/3.3/Properties/AssemblyInfo.cs.frame	(revision 17836)
+++ trunk/HeuristicLab.Algorithms.MultiObjectiveLocalSearch/3.3/Properties/AssemblyInfo.cs.frame	(revision 17836)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2021 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Algorithms.MultiObjectiveLocalSearch")]
+[assembly: AssemblyDescription("Local search algorithms for multi-objective problems")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) HEAL 2002-2021")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components.  If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("4ccdd23a-9fa3-4b36-9469-87d67e99225f")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.16.$WCREV$")]
