public override void Main() {
    DateTime start = DateTime.UtcNow;

    QuadraticAssignmentProblem qap;
    if (vars.Contains("qap")) qap = vars.qap;
    else {
      var provider = new DreznerQAPInstanceProvider();
      var instance = provider.GetDataDescriptors().Single(x => x.Name == "dre56");
      var data = provider.LoadData(instance);
      qap = new QuadraticAssignmentProblem();
      qap.Load(data);
      vars.qap = qap;
    }

    const uint seed = 0;
    const int popSize = 100;
    const int generations = 1000;
    const double mutationRate = 0.05;

    var random = new MersenneTwister(seed);
    var population = new Permutation[popSize];
    var qualities = new double[popSize];
    var nextGen = new Permutation[popSize];
    var nextQual = new double[popSize];

    var qualityChart = new DataTable("Quality Chart");
    var qualityRow = new DataRow("Best Quality");
    qualityChart.Rows.Add(qualityRow);
    vars.qualityChart = qualityChart;

    for (int i = 0; i < popSize; i++) {
      population[i] = new Permutation(PermutationTypes.Absolute, qap.Weights.Rows, random);
      qualities[i] = QAPEvaluator.Apply(population[i], qap.Weights, qap.Distances);
    }
    var bestQuality = qualities.Min();
    var bestQualityGeneration = 0;

    for (int g = 0; g < generations; g++) {
      var parents = population.SampleProportional(random, 2 * popSize, qualities, windowing: true, inverseProportional: true).ToArray();
      for (int i = 0; i < popSize; i++) {
        nextGen[i] = PartiallyMatchedCrossover.Apply(random, parents[i * 2], parents[i * 2 + 1]);
        if (random.NextDouble() < mutationRate) Swap2Manipulator.Apply(random, nextGen[i]);
        nextQual[i] = QAPEvaluator.Apply(nextGen[i], qap.Weights, qap.Distances);
        if (nextQual[i] < bestQuality) {
          bestQuality = nextQual[i];
          bestQualityGeneration = g;
        }
      }
      qualityRow.Values.Add(bestQuality);
      Array.Copy(nextGen, population, popSize);
      Array.Copy(nextQual, qualities, popSize);
    }

    vars.elapsed = new TimeSpanValue(DateTime.UtcNow - start);
    vars.bestQuality = bestQuality;
    vars.bestQualityFoundAt = bestQualityGeneration;
  }
Esempio n. 2
0
 private CSharpScript CreateGAQAPScript() {
   var script = new CSharpScript {
     Name = ScriptItemName,
     Description = ScriptItemDescription
   };
   #region Variables
   var provider = new DreznerQAPInstanceProvider();
   var instance = provider.GetDataDescriptors().Single(x => x.Name == ProblemInstanceName);
   var data = provider.LoadData(instance);
   var problem = new QuadraticAssignmentProblem();
   problem.Load(data);
   script.VariableStore.Add(ProblemInstanceName, problem);
   #endregion
   #region Code
   script.Code = ScriptSources.GAQAPScriptSource;
   #endregion
   return script;
 }
        public void TestQAPLIBInstances()
        {
            var provider        = new QAPLIBInstanceProvider();
            var qap             = new QuadraticAssignmentProblem();
            var failedInstances = new StringBuilder();

            var instances = provider.GetDataDescriptors();

            Assert.IsTrue(instances.Any(), "No instances could be found.");

            foreach (var instance in instances)
            {
                try {
                    qap.Load(provider.LoadData(instance));
                } catch (Exception ex) {
                    failedInstances.AppendLine(instance + ": " + ex.Message);
                }
            }
            Assert.IsTrue(failedInstances.Length == 0, "Following instances failed: " + Environment.NewLine + failedInstances.ToString());
        }
        private CSharpScript CreateGAQAPScript()
        {
            var script = new CSharpScript {
                Name        = ScriptItemName,
                Description = ScriptItemDescription
            };

            #region Variables
            var provider = new DreznerQAPInstanceProvider();
            var instance = provider.GetDataDescriptors().Single(x => x.Name == ProblemInstanceName);
            var data     = provider.LoadData(instance);
            var problem  = new QuadraticAssignmentProblem();
            problem.Load(data);
            script.VariableStore.Add(ProblemInstanceName, problem);
            #endregion
            #region Code
            script.Code = ScriptSources.GAQAPScriptSource;
            #endregion
            return(script);
        }
        public void TestQAPLIBSolutions()
        {
            var provider        = new QAPLIBInstanceProvider();
            var qap             = new QuadraticAssignmentProblem();
            var failedInstances = new StringBuilder();

            var instances = provider.GetDataDescriptors();

            Assert.IsTrue(instances.Any(), "No instances could be found.");

            foreach (var instance in instances)
            {
                qap.Load(provider.LoadData(instance));
                if (qaplibInstances.ContainsKey(instance.Name) &&
                    qap.BestKnownQuality != null && qap.BestKnownQuality.Value != qaplibInstances[instance.Name])
                {
                    failedInstances.AppendLine(instance.Name + ": " + qap.BestKnownQuality.Value.ToString() + " vs " + qaplibInstances[instance.Name]);
                }
            }
            Assert.IsTrue(failedInstances.Length == 0, "Following instances/solutions have suspicious best quality: " + Environment.NewLine + failedInstances.ToString());
        }
        public void TestQAPLIBLowerBounds()
        {
            var provider        = new QAPLIBInstanceProvider();
            var qap             = new QuadraticAssignmentProblem();
            var failedInstances = new StringBuilder();

            var instances = provider.GetDataDescriptors();

            Assert.IsTrue(instances.Any(), "No instances could be found.");

            foreach (var instance in instances)
            {
                if (lowerBounds.ContainsKey(instance.Name))
                {
                    qap.Load(provider.LoadData(instance));
                    if (qap.LowerBound.Value != lowerBounds[instance.Name])
                    {
                        failedInstances.AppendLine(instance.Name + ": The Gilmore-Lawler lower bound is not valid.");
                    }
                }
            }
            Assert.IsTrue(failedInstances.Length == 0, "Following instances failed for the GLB calculation: " + Environment.NewLine + failedInstances.ToString());
        }
Esempio n. 7
0
    public void TestQAPLIBLowerBounds() {
      var provider = new QAPLIBInstanceProvider();
      var qap = new QuadraticAssignmentProblem();
      var failedInstances = new StringBuilder();

      var instances = provider.GetDataDescriptors();
      Assert.IsTrue(instances.Any(), "No instances could be found.");

      foreach (var instance in instances) {
        if (lowerBounds.ContainsKey(instance.Name)) {
          qap.Load(provider.LoadData(instance));
          if (qap.LowerBound.Value != lowerBounds[instance.Name])
            failedInstances.AppendLine(instance.Name + ": The Gilmore-Lawler lower bound is not valid.");
        }
      }
      Assert.IsTrue(failedInstances.Length == 0, "Following instances failed for the GLB calculation: " + Environment.NewLine + failedInstances.ToString());
    }
Esempio n. 8
0
    public void TestQAPLIBSolutions() {
      var provider = new QAPLIBInstanceProvider();
      var qap = new QuadraticAssignmentProblem();
      var failedInstances = new StringBuilder();

      var instances = provider.GetDataDescriptors();
      Assert.IsTrue(instances.Any(), "No instances could be found.");

      foreach (var instance in instances) {
        qap.Load(provider.LoadData(instance));
        if (qaplibInstances.ContainsKey(instance.Name)
          && qap.BestKnownQuality != null && qap.BestKnownQuality.Value != qaplibInstances[instance.Name])
          failedInstances.AppendLine(instance.Name + ": " + qap.BestKnownQuality.Value.ToString() + " vs " + qaplibInstances[instance.Name]);
      }
      Assert.IsTrue(failedInstances.Length == 0, "Following instances/solutions have suspicious best quality: " + Environment.NewLine + failedInstances.ToString());
    }
Esempio n. 9
0
    public void TestQAPLIBInstances() {
      var provider = new QAPLIBInstanceProvider();
      var qap = new QuadraticAssignmentProblem();
      var failedInstances = new StringBuilder();

      var instances = provider.GetDataDescriptors();
      Assert.IsTrue(instances.Any(), "No instances could be found.");

      foreach (var instance in instances) {
        try {
          qap.Load(provider.LoadData(instance));
        } catch (Exception ex) {
          failedInstances.AppendLine(instance + ": " + ex.Message);
        }
      }
      Assert.IsTrue(failedInstances.Length == 0, "Following instances failed: " + Environment.NewLine + failedInstances.ToString());
    }
Esempio n. 10
0
    public RobustTabooSearch() {
      Parameters.Add(new ValueParameter<MultiAnalyzer>("Analyzer", "The analyzers that are applied after each iteration.", new MultiAnalyzer()));
      Parameters.Add(new FixedValueParameter<IntValue>("Seed", "The seed value of the random number generator.", new IntValue(0)));
      Parameters.Add(new FixedValueParameter<BoolValue>("SetSeedRandomly", "True whether the seed should be set randomly for each run, false if it should be fixed.", new BoolValue(true)));
      Parameters.Add(new FixedValueParameter<IntValue>("MaximumIterations", "The number of iterations that the algorithm should run.", new IntValue(10000)));
      Parameters.Add(new FixedValueParameter<IntValue>("MinimumTabuTenure", "The minimum tabu tenure.", new IntValue(10)));
      Parameters.Add(new FixedValueParameter<IntValue>("MaximumTabuTenure", "The maximum tabu tenure.", new IntValue(20)));
      Parameters.Add(new FixedValueParameter<BoolValue>("UseAlternativeAspiration", "True if the alternative aspiration condition should be used that takes moves that have not been made for some time above others.", new BoolValue(false)));
      Parameters.Add(new FixedValueParameter<IntValue>("AlternativeAspirationTenure", "The time t that a move will be remembered for the alternative aspiration condition.", new IntValue(int.MaxValue)));
      Parameters.Add(new FixedValueParameter<BoolValue>("TerminateOnOptimalSolution", "True when the algorithm should stop if it reached a quality equal or smaller to the BestKnownQuality.", new BoolValue(false)));
      Parameters.Add(new FixedValueParameter<BoolValue>("UseNewTabuTenureAdaptionScheme", @"In an updated version of his implementation, Eric Taillard introduced a different way to change the tabu tenure.
Instead of setting it uniformly between min and max, it will be set between 0 and max according to a right-skewed distribution.
Set this option to false if you want to optimize using the earlier 1991 version, and set to true if you want to optimize using the newer version.
Please note that the MinimumTabuTenure parameter has no effect in the new version.", new BoolValue(true)));

      TerminateOnOptimalSolutionParameter.Hidden = true;

      qualityAnalyzer = new BestAverageWorstQualityAnalyzer();
      qualityAnalyzer.ResultsParameter.ActualName = "Results";
      AnalyzerParameter.Value.Operators.Add(qualityAnalyzer);

      RandomCreator randomCreator = new RandomCreator();
      randomCreator.RandomParameter.ActualName = "Random";
      randomCreator.SeedParameter.Value = null;
      randomCreator.SeedParameter.ActualName = SeedParameter.Name;
      randomCreator.SetSeedRandomlyParameter.Value = null;
      randomCreator.SetSeedRandomlyParameter.ActualName = SetSeedRandomlyParameter.Name;

      VariableCreator variableCreator = new VariableCreator();
      variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("Iterations", new IntValue(0)));
      variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("EvaluatedSolutions", new IntValue(1)));
      variableCreator.CollectedValues.Add(new ValueParameter<DoubleValue>("EvaluatedSolutionEquivalents", new DoubleValue(1)));

      ResultsCollector resultsCollector = new ResultsCollector();
      resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>("Iterations", "The actual iteration."));
      resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>("EvaluatedSolutions", "Number of evaluated solutions."));

      solutionsCreator = new SolutionsCreator();
      solutionsCreator.NumberOfSolutions = new IntValue(1);

      Placeholder analyzer = new Placeholder();
      analyzer.Name = "(Analyzer)";
      analyzer.OperatorParameter.ActualName = AnalyzerParameter.Name;

      UniformSubScopesProcessor ussp = new UniformSubScopesProcessor();

      mainOperator = new RobustTabooSeachOperator();
      mainOperator.AlternativeAspirationTenureParameter.ActualName = AlternativeAspirationTenureParameter.Name;
      mainOperator.BestQualityParameter.ActualName = "BestSoFarQuality";
      mainOperator.IterationsParameter.ActualName = "Iterations";
      mainOperator.LastMoveParameter.ActualName = "LastMove";
      mainOperator.MaximumIterationsParameter.ActualName = MaximumIterationsParameter.Name;
      mainOperator.MaximumTabuTenureParameter.ActualName = MaximumTabuTenureParameter.Name;
      mainOperator.MinimumTabuTenureParameter.ActualName = MinimumTabuTenureParameter.Name;
      mainOperator.MoveQualityMatrixParameter.ActualName = "MoveQualityMatrix";
      mainOperator.RandomParameter.ActualName = "Random";
      mainOperator.ResultsParameter.ActualName = "Results";
      mainOperator.ShortTermMemoryParameter.ActualName = "ShortTermMemory";
      mainOperator.UseAlternativeAspirationParameter.ActualName = UseAlternativeAspirationParameter.Name;
      mainOperator.EvaluatedSolutionsParameter.ActualName = "EvaluatedSolutions";
      mainOperator.EvaluatedSolutionEquivalentsParameter.ActualName = "EvaluatedSolutionEquivalents";

      ConditionalBranch qualityStopBranch = new ConditionalBranch();
      qualityStopBranch.Name = "Terminate on optimal quality?";
      qualityStopBranch.ConditionParameter.ActualName = "TerminateOnOptimalSolution";

      Comparator qualityComparator = new Comparator();
      qualityComparator.Comparison = new Comparison(ComparisonType.Greater);
      qualityComparator.LeftSideParameter.ActualName = "BestQuality";
      qualityComparator.RightSideParameter.ActualName = "BestKnownQuality";
      qualityComparator.ResultParameter.ActualName = "ContinueByQuality";

      ConditionalBranch continueByQualityBranch = new ConditionalBranch();
      continueByQualityBranch.ConditionParameter.ActualName = "ContinueByQuality";

      IntCounter iterationsCounter = new IntCounter();
      iterationsCounter.ValueParameter.ActualName = "Iterations";
      iterationsCounter.Increment = new IntValue(1);

      Comparator comparator = new Comparator();
      comparator.Name = "Iterations < MaximumIterations ?";
      comparator.LeftSideParameter.ActualName = "Iterations";
      comparator.RightSideParameter.ActualName = MaximumIterationsParameter.Name;
      comparator.Comparison = new Comparison(ComparisonType.Less);
      comparator.ResultParameter.ActualName = "ContinueByIteration";

      ConditionalBranch continueByIterationBranch = new ConditionalBranch();
      continueByIterationBranch.ConditionParameter.ActualName = "ContinueByIteration";

      OperatorGraph.InitialOperator = randomCreator;
      randomCreator.Successor = variableCreator;
      variableCreator.Successor = resultsCollector;
      resultsCollector.Successor = solutionsCreator;
      solutionsCreator.Successor = analyzer;
      analyzer.Successor = ussp;
      ussp.Operator = mainOperator;
      ussp.Successor = qualityStopBranch;
      qualityStopBranch.FalseBranch = iterationsCounter;
      qualityStopBranch.TrueBranch = qualityComparator;
      qualityStopBranch.Successor = null;
      qualityComparator.Successor = continueByQualityBranch;
      continueByQualityBranch.TrueBranch = iterationsCounter;
      continueByQualityBranch.FalseBranch = null;
      continueByQualityBranch.Successor = null;
      iterationsCounter.Successor = comparator;
      comparator.Successor = continueByIterationBranch;
      continueByIterationBranch.TrueBranch = analyzer;
      continueByIterationBranch.FalseBranch = null;
      continueByIterationBranch.Successor = null;

      RegisterEventHandlers();
      Problem = new QuadraticAssignmentProblem();
    }
Esempio n. 11
0
    public override void Main()
    {
        DateTime start = DateTime.UtcNow;

        QuadraticAssignmentProblem qap;

        if (vars.Contains("qap"))
        {
            qap = vars.qap;
        }
        else
        {
            var provider = new DreznerQAPInstanceProvider();
            var instance = provider.GetDataDescriptors().Single(x => x.Name == "dre56");
            var data     = provider.LoadData(instance);
            qap = new QuadraticAssignmentProblem();
            qap.Load(data);
            vars.qap = qap;
        }

        const uint   seed         = 0;
        const int    popSize      = 100;
        const int    generations  = 1000;
        const double mutationRate = 0.05;

        var random     = new MersenneTwister(seed);
        var population = new Permutation[popSize];
        var qualities  = new double[popSize];
        var nextGen    = new Permutation[popSize];
        var nextQual   = new double[popSize];

        var qualityChart = new DataTable("Quality Chart");
        var qualityRow   = new DataRow("Best Quality");

        qualityChart.Rows.Add(qualityRow);
        vars.qualityChart = qualityChart;

        for (int i = 0; i < popSize; i++)
        {
            population[i] = new Permutation(PermutationTypes.Absolute, qap.Weights.Rows, random);
            qualities[i]  = QAPEvaluator.Apply(population[i], qap.Weights, qap.Distances);
        }
        var bestQuality           = qualities.Min();
        var bestQualityGeneration = 0;

        for (int g = 0; g < generations; g++)
        {
            var parents = population.SampleProportional(random, 2 * popSize, qualities, windowing: true, inverseProportional: true).ToArray();
            for (int i = 0; i < popSize; i++)
            {
                nextGen[i] = PartiallyMatchedCrossover.Apply(random, parents[i * 2], parents[i * 2 + 1]);
                if (random.NextDouble() < mutationRate)
                {
                    Swap2Manipulator.Apply(random, nextGen[i]);
                }
                nextQual[i] = QAPEvaluator.Apply(nextGen[i], qap.Weights, qap.Distances);
                if (nextQual[i] < bestQuality)
                {
                    bestQuality           = nextQual[i];
                    bestQualityGeneration = g;
                }
            }
            qualityRow.Values.Add(bestQuality);
            Array.Copy(nextGen, population, popSize);
            Array.Copy(nextQual, qualities, popSize);
        }

        vars.elapsed            = new TimeSpanValue(DateTime.UtcNow - start);
        vars.bestQuality        = bestQuality;
        vars.bestQualityFoundAt = bestQualityGeneration;
    }
Esempio n. 12
0
        public RobustTabooSearch()
        {
            Parameters.Add(new ValueParameter <MultiAnalyzer>("Analyzer", "The analyzers that are applied after each iteration.", new MultiAnalyzer()));
            Parameters.Add(new FixedValueParameter <IntValue>("Seed", "The seed value of the random number generator.", new IntValue(0)));
            Parameters.Add(new FixedValueParameter <BoolValue>("SetSeedRandomly", "True whether the seed should be set randomly for each run, false if it should be fixed.", new BoolValue(true)));
            Parameters.Add(new FixedValueParameter <IntValue>("MaximumIterations", "The number of iterations that the algorithm should run.", new IntValue(10000)));
            Parameters.Add(new FixedValueParameter <IntValue>("MinimumTabuTenure", "The minimum tabu tenure.", new IntValue(10)));
            Parameters.Add(new FixedValueParameter <IntValue>("MaximumTabuTenure", "The maximum tabu tenure.", new IntValue(20)));
            Parameters.Add(new FixedValueParameter <BoolValue>("UseAlternativeAspiration", "True if the alternative aspiration condition should be used that takes moves that have not been made for some time above others.", new BoolValue(false)));
            Parameters.Add(new FixedValueParameter <IntValue>("AlternativeAspirationTenure", "The time t that a move will be remembered for the alternative aspiration condition.", new IntValue(int.MaxValue)));
            Parameters.Add(new FixedValueParameter <BoolValue>("TerminateOnOptimalSolution", "True when the algorithm should stop if it reached a quality equal or smaller to the BestKnownQuality.", new BoolValue(false)));
            Parameters.Add(new FixedValueParameter <BoolValue>("UseNewTabuTenureAdaptionScheme", @"In an updated version of his implementation, Eric Taillard introduced a different way to change the tabu tenure.
Instead of setting it uniformly between min and max, it will be set between 0 and max according to a right-skewed distribution.
Set this option to false if you want to optimize using the earlier 1991 version, and set to true if you want to optimize using the newer version.
Please note that the MinimumTabuTenure parameter has no effect in the new version.", new BoolValue(true)));

            TerminateOnOptimalSolutionParameter.Hidden = true;

            qualityAnalyzer = new BestAverageWorstQualityAnalyzer();
            qualityAnalyzer.ResultsParameter.ActualName = "Results";
            AnalyzerParameter.Value.Operators.Add(qualityAnalyzer);

            RandomCreator randomCreator = new RandomCreator();

            randomCreator.RandomParameter.ActualName          = "Random";
            randomCreator.SeedParameter.Value                 = null;
            randomCreator.SeedParameter.ActualName            = SeedParameter.Name;
            randomCreator.SetSeedRandomlyParameter.Value      = null;
            randomCreator.SetSeedRandomlyParameter.ActualName = SetSeedRandomlyParameter.Name;

            VariableCreator variableCreator = new VariableCreator();

            variableCreator.CollectedValues.Add(new ValueParameter <IntValue>("Iterations", new IntValue(0)));
            variableCreator.CollectedValues.Add(new ValueParameter <IntValue>("EvaluatedSolutions", new IntValue(1)));
            variableCreator.CollectedValues.Add(new ValueParameter <DoubleValue>("EvaluatedSolutionEquivalents", new DoubleValue(1)));

            ResultsCollector resultsCollector = new ResultsCollector();

            resultsCollector.CollectedValues.Add(new LookupParameter <IntValue>("Iterations", "The actual iteration."));
            resultsCollector.CollectedValues.Add(new LookupParameter <IntValue>("EvaluatedSolutions", "Number of evaluated solutions."));

            solutionsCreator = new SolutionsCreator();
            solutionsCreator.NumberOfSolutions = new IntValue(1);

            Placeholder analyzer = new Placeholder();

            analyzer.Name = "(Analyzer)";
            analyzer.OperatorParameter.ActualName = AnalyzerParameter.Name;

            UniformSubScopesProcessor ussp = new UniformSubScopesProcessor();

            mainOperator = new RobustTabooSeachOperator();
            mainOperator.AlternativeAspirationTenureParameter.ActualName = AlternativeAspirationTenureParameter.Name;
            mainOperator.BestQualityParameter.ActualName                  = "BestSoFarQuality";
            mainOperator.IterationsParameter.ActualName                   = "Iterations";
            mainOperator.LastMoveParameter.ActualName                     = "LastMove";
            mainOperator.MaximumIterationsParameter.ActualName            = MaximumIterationsParameter.Name;
            mainOperator.MaximumTabuTenureParameter.ActualName            = MaximumTabuTenureParameter.Name;
            mainOperator.MinimumTabuTenureParameter.ActualName            = MinimumTabuTenureParameter.Name;
            mainOperator.MoveQualityMatrixParameter.ActualName            = "MoveQualityMatrix";
            mainOperator.RandomParameter.ActualName                       = "Random";
            mainOperator.ResultsParameter.ActualName                      = "Results";
            mainOperator.ShortTermMemoryParameter.ActualName              = "ShortTermMemory";
            mainOperator.UseAlternativeAspirationParameter.ActualName     = UseAlternativeAspirationParameter.Name;
            mainOperator.EvaluatedSolutionsParameter.ActualName           = "EvaluatedSolutions";
            mainOperator.EvaluatedSolutionEquivalentsParameter.ActualName = "EvaluatedSolutionEquivalents";

            ConditionalBranch qualityStopBranch = new ConditionalBranch();

            qualityStopBranch.Name = "Terminate on optimal quality?";
            qualityStopBranch.ConditionParameter.ActualName = "TerminateOnOptimalSolution";

            Comparator qualityComparator = new Comparator();

            qualityComparator.Comparison = new Comparison(ComparisonType.Greater);
            qualityComparator.LeftSideParameter.ActualName  = "BestQuality";
            qualityComparator.RightSideParameter.ActualName = "BestKnownQuality";
            qualityComparator.ResultParameter.ActualName    = "ContinueByQuality";

            ConditionalBranch continueByQualityBranch = new ConditionalBranch();

            continueByQualityBranch.ConditionParameter.ActualName = "ContinueByQuality";

            IntCounter iterationsCounter = new IntCounter();

            iterationsCounter.ValueParameter.ActualName = "Iterations";
            iterationsCounter.Increment = new IntValue(1);

            Comparator comparator = new Comparator();

            comparator.Name = "Iterations < MaximumIterations ?";
            comparator.LeftSideParameter.ActualName  = "Iterations";
            comparator.RightSideParameter.ActualName = MaximumIterationsParameter.Name;
            comparator.Comparison = new Comparison(ComparisonType.Less);
            comparator.ResultParameter.ActualName = "ContinueByIteration";

            ConditionalBranch continueByIterationBranch = new ConditionalBranch();

            continueByIterationBranch.ConditionParameter.ActualName = "ContinueByIteration";

            OperatorGraph.InitialOperator = randomCreator;
            randomCreator.Successor       = variableCreator;
            variableCreator.Successor     = resultsCollector;
            resultsCollector.Successor    = solutionsCreator;
            solutionsCreator.Successor    = analyzer;
            analyzer.Successor            = ussp;
            ussp.Operator  = mainOperator;
            ussp.Successor = qualityStopBranch;
            qualityStopBranch.FalseBranch       = iterationsCounter;
            qualityStopBranch.TrueBranch        = qualityComparator;
            qualityStopBranch.Successor         = null;
            qualityComparator.Successor         = continueByQualityBranch;
            continueByQualityBranch.TrueBranch  = iterationsCounter;
            continueByQualityBranch.FalseBranch = null;
            continueByQualityBranch.Successor   = null;
            iterationsCounter.Successor         = comparator;
            comparator.Successor = continueByIterationBranch;
            continueByIterationBranch.TrueBranch  = analyzer;
            continueByIterationBranch.FalseBranch = null;
            continueByIterationBranch.Successor   = null;

            RegisterEventHandlers();
            Problem = new QuadraticAssignmentProblem();
        }