#region License Information
/* HeuristicLab
* Copyright (C) 2002-2010 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 .
*/
#endregion
using HeuristicLab.Analysis;
using HeuristicLab.Core;
using HeuristicLab.Data;
using HeuristicLab.Operators;
using HeuristicLab.Parameters;
using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
using HeuristicLab.Selection;
namespace HeuristicLab.Algorithms.TabuSearch {
///
/// An operator which represents a tabu search.
///
[Item("TabuSearchMainLoop", "An operator which represents the main loop of a tabu search.")]
[StorableClass]
public sealed class TabuSearchMainLoop : AlgorithmOperator {
#region Parameter properties
public ValueLookupParameter RandomParameter {
get { return (ValueLookupParameter)Parameters["Random"]; }
}
public ValueLookupParameter MaximizationParameter {
get { return (ValueLookupParameter)Parameters["Maximization"]; }
}
public LookupParameter QualityParameter {
get { return (LookupParameter)Parameters["Quality"]; }
}
public ValueLookupParameter BestKnownQualityParameter {
get { return (ValueLookupParameter)Parameters["BestKnownQuality"]; }
}
public LookupParameter MoveQualityParameter {
get { return (LookupParameter)Parameters["MoveQuality"]; }
}
public LookupParameter MoveTabuParameter {
get { return (LookupParameter)Parameters["MoveTabu"]; }
}
public ValueLookupParameter MaximumIterationsParameter {
get { return (ValueLookupParameter)Parameters["MaximumIterations"]; }
}
public ValueLookupParameter TabuTenureParameter {
get { return (ValueLookupParameter)Parameters["TabuTenure"]; }
}
public ValueLookupParameter MoveGeneratorParameter {
get { return (ValueLookupParameter)Parameters["MoveGenerator"]; }
}
public ValueLookupParameter MoveEvaluatorParameter {
get { return (ValueLookupParameter)Parameters["MoveEvaluator"]; }
}
public ValueLookupParameter MoveMakerParameter {
get { return (ValueLookupParameter)Parameters["MoveMaker"]; }
}
public ValueLookupParameter TabuMoveEvaluatorParameter {
get { return (ValueLookupParameter)Parameters["TabuMoveEvaluator"]; }
}
public ValueLookupParameter TabuMoveMakerParameter {
get { return (ValueLookupParameter)Parameters["TabuMoveMaker"]; }
}
public ValueLookupParameter VisualizerParameter {
get { return (ValueLookupParameter)Parameters["Visualizer"]; }
}
public LookupParameter VisualizationParameter {
get { return (LookupParameter)Parameters["Visualization"]; }
}
public ValueLookupParameter ResultsParameter {
get { return (ValueLookupParameter)Parameters["Results"]; }
}
#endregion
[StorableConstructor]
private TabuSearchMainLoop(bool deserializing) : base() { }
public TabuSearchMainLoop()
: base() {
Initialize();
}
private void Initialize() {
#region Create parameters
Parameters.Add(new ValueLookupParameter("Random", "A pseudo random number generator."));
Parameters.Add(new ValueLookupParameter("Maximization", "True if the problem is a maximization problem, otherwise false."));
Parameters.Add(new LookupParameter("Quality", "The value which represents the quality of a solution."));
Parameters.Add(new ValueLookupParameter("BestKnownQuality", "The best known quality value found so far."));
Parameters.Add(new LookupParameter("MoveQuality", "The value which represents the quality of a move."));
Parameters.Add(new LookupParameter("MoveTabu", "The value that indicates if a move is tabu or not."));
Parameters.Add(new ValueLookupParameter("MaximumIterations", "The maximum number of generations which should be processed."));
Parameters.Add(new ValueLookupParameter("TabuTenure", "The length of the tabu list, and also means the number of iterations a move is kept tabu"));
Parameters.Add(new ValueLookupParameter("MoveGenerator", "The operator that generates the moves."));
Parameters.Add(new ValueLookupParameter("MoveMaker", "The operator that performs a move and updates the quality."));
Parameters.Add(new ValueLookupParameter("MoveEvaluator", "The operator that evaluates a move."));
Parameters.Add(new ValueLookupParameter("TabuMoveEvaluator", "The operator that evaluates whether a move is tabu."));
Parameters.Add(new ValueLookupParameter("TabuMoveMaker", "The operator that declares a move tabu."));
Parameters.Add(new ValueLookupParameter("Visualizer", "The operator used to visualize solutions."));
Parameters.Add(new LookupParameter("Visualization", "The item which represents the visualization of solutions."));
Parameters.Add(new ValueLookupParameter("Results", "The variable collection where results should be stored."));
#endregion
#region Create operators
TabuListCreator tabuListCreator = new TabuListCreator();
VariableCreator variableCreator = new VariableCreator();
BestQualityMemorizer bestQualityMemorizer1 = new BestQualityMemorizer();
BestQualityMemorizer bestQualityMemorizer2 = new BestQualityMemorizer();
QualityDifferenceCalculator qualityDifferenceCalculator1 = new QualityDifferenceCalculator();
Placeholder visualizer1 = new Placeholder();
ResultsCollector resultsCollector = new ResultsCollector();
UniformSequentialSubScopesProcessor mainProcessor = new UniformSequentialSubScopesProcessor();
Placeholder moveGenerator = new Placeholder();
UniformSequentialSubScopesProcessor moveEvaluationProcessor = new UniformSequentialSubScopesProcessor();
Placeholder moveEvaluator = new Placeholder();
Placeholder tabuMoveEvaluator = new Placeholder();
SubScopesSorter moveQualitySorter = new SubScopesSorter();
BestAverageWorstQualityCalculator bestAverageWorstMoveQualityCalculator = new BestAverageWorstQualityCalculator();
TabuSelector tabuSelector = new TabuSelector();
RightReducer rightReducer = new RightReducer();
UniformSequentialSubScopesProcessor moveMakingProcessor = new UniformSequentialSubScopesProcessor();
Placeholder tabuMoveMaker = new Placeholder();
Placeholder moveMaker = new Placeholder();
DataTableValuesCollector valuesCollector = new DataTableValuesCollector();
SubScopesRemover subScopesRemover = new SubScopesRemover();
IntCounter iterationsCounter = new IntCounter();
Comparator iterationsComparator = new Comparator();
BestQualityMemorizer bestQualityMemorizer3 = new BestQualityMemorizer();
BestQualityMemorizer bestQualityMemorizer4 = new BestQualityMemorizer();
QualityDifferenceCalculator qualityDifferenceCalculator2 = new QualityDifferenceCalculator();
Placeholder visualizer2 = new Placeholder();
ConditionalBranch iterationsTermination = new ConditionalBranch();
variableCreator.CollectedValues.Add(new ValueParameter("Iterations", new IntValue(0)));
variableCreator.CollectedValues.Add(new ValueParameter("Best Move Quality", new DoubleValue(0)));
variableCreator.CollectedValues.Add(new ValueParameter("Average Move Quality", new DoubleValue(0)));
variableCreator.CollectedValues.Add(new ValueParameter("Worst Move Quality", new DoubleValue(0)));
variableCreator.CollectedValues.Add(new ValueParameter("MoveQualities", new DataTable("MoveQualities")));
bestQualityMemorizer1.BestQualityParameter.ActualName = "BestQuality";
bestQualityMemorizer1.MaximizationParameter.ActualName = MaximizationParameter.Name;
bestQualityMemorizer1.QualityParameter.ActualName = QualityParameter.Name;
bestQualityMemorizer2.BestQualityParameter.ActualName = BestKnownQualityParameter.Name;
bestQualityMemorizer2.MaximizationParameter.ActualName = MaximizationParameter.Name;
bestQualityMemorizer2.QualityParameter.ActualName = QualityParameter.Name;
qualityDifferenceCalculator1.AbsoluteDifferenceParameter.ActualName = "AbsoluteDifferenceBestKnownToBest";
qualityDifferenceCalculator1.FirstQualityParameter.ActualName = BestKnownQualityParameter.Name;
qualityDifferenceCalculator1.RelativeDifferenceParameter.ActualName = "RelativeDifferenceBestKnownToBest";
qualityDifferenceCalculator1.SecondQualityParameter.ActualName = "BestQuality";
visualizer1.Name = "Visualizer (placeholder)";
visualizer1.OperatorParameter.ActualName = VisualizerParameter.Name;
resultsCollector.CollectedValues.Add(new LookupParameter("Iterations"));
resultsCollector.CollectedValues.Add(new LookupParameter("Best Quality", null, "BestQuality"));
resultsCollector.CollectedValues.Add(new LookupParameter("Best Move Quality"));
resultsCollector.CollectedValues.Add(new LookupParameter("Average Move Quality"));
resultsCollector.CollectedValues.Add(new LookupParameter("Worst Move Quality"));
resultsCollector.CollectedValues.Add(new LookupParameter("MoveQualities"));
resultsCollector.CollectedValues.Add(new LookupParameter("Best Known Quality", null, BestKnownQualityParameter.Name));
resultsCollector.CollectedValues.Add(new LookupParameter("Absolute Difference of Best Known Quality to Best Quality", null, "AbsoluteDifferenceBestKnownToBest"));
resultsCollector.CollectedValues.Add(new LookupParameter("Relative Difference of Best Known Quality to Best Quality", null, "RelativeDifferenceBestKnownToBest"));
resultsCollector.CollectedValues.Add(new LookupParameter("Solution Visualization", null, VisualizationParameter.Name));
resultsCollector.ResultsParameter.ActualName = "Results";
mainProcessor.Name = "Solution processor (UniformSequentialSubScopesProcessor)";
moveGenerator.Name = "MoveGenerator (placeholder)";
moveGenerator.OperatorParameter.ActualName = MoveGeneratorParameter.Name;
moveEvaluator.Name = "MoveEvaluator (placeholder)";
moveEvaluator.OperatorParameter.ActualName = MoveEvaluatorParameter.Name;
tabuMoveEvaluator.Name = "TabuMoveEvaluator (placeholder)";
tabuMoveEvaluator.OperatorParameter.ActualName = TabuMoveEvaluatorParameter.Name;
moveQualitySorter.DescendingParameter.ActualName = MaximizationParameter.Name;
moveQualitySorter.ValueParameter.ActualName = MoveQualityParameter.Name;
bestAverageWorstMoveQualityCalculator.AverageQualityParameter.ActualName = "Average Move Quality";
bestAverageWorstMoveQualityCalculator.BestQualityParameter.ActualName = "Best Move Quality";
bestAverageWorstMoveQualityCalculator.MaximizationParameter.ActualName = "Maximization";
bestAverageWorstMoveQualityCalculator.QualityParameter.ActualName = MoveQualityParameter.Name;
bestAverageWorstMoveQualityCalculator.WorstQualityParameter.ActualName = "Worst Move Quality";
valuesCollector.CollectedValues.Add(new LookupParameter("Best Move Quality"));
valuesCollector.CollectedValues.Add(new LookupParameter("Average Move Quality"));
valuesCollector.CollectedValues.Add(new LookupParameter("Worst Move Quality"));
valuesCollector.DataTableParameter.ActualName = "MoveQualities";
moveMakingProcessor.Name = "MoveMaking processor (UniformSequentialSubScopesProcessor)";
tabuMoveMaker.Name = "TabuMoveMaker (placeholder)";
tabuMoveMaker.OperatorParameter.ActualName = TabuMoveMakerParameter.Name;
moveMaker.Name = "MoveMaker (placeholder)";
moveMaker.OperatorParameter.ActualName = MoveMakerParameter.Name;
subScopesRemover.RemoveAllSubScopes = true;
iterationsCounter.Name = "Iterations Counter";
iterationsCounter.Increment = new IntValue(1);
iterationsCounter.ValueParameter.ActualName = "Iterations";
iterationsComparator.Name = "Iterations >= MaximumIterations";
iterationsComparator.Comparison = new Comparison(ComparisonType.GreaterOrEqual);
iterationsComparator.LeftSideParameter.ActualName = "Iterations";
iterationsComparator.RightSideParameter.ActualName = MaximumIterationsParameter.Name;
iterationsComparator.ResultParameter.ActualName = "Terminate";
bestQualityMemorizer3.BestQualityParameter.ActualName = "BestQuality";
bestQualityMemorizer3.MaximizationParameter.ActualName = MaximizationParameter.Name;
bestQualityMemorizer3.QualityParameter.ActualName = QualityParameter.Name;
bestQualityMemorizer4.BestQualityParameter.ActualName = BestKnownQualityParameter.Name;
bestQualityMemorizer4.MaximizationParameter.ActualName = MaximizationParameter.Name;
bestQualityMemorizer4.QualityParameter.ActualName = QualityParameter.Name;
qualityDifferenceCalculator2.AbsoluteDifferenceParameter.ActualName = "AbsoluteDifferenceBestKnownToBest";
qualityDifferenceCalculator2.FirstQualityParameter.ActualName = BestKnownQualityParameter.Name;
qualityDifferenceCalculator2.RelativeDifferenceParameter.ActualName = "RelativeDifferenceBestKnownToBest";
qualityDifferenceCalculator2.SecondQualityParameter.ActualName = "BestQuality";
visualizer2.Name = "Visualizer (placeholder)";
visualizer2.OperatorParameter.ActualName = VisualizerParameter.Name;
iterationsTermination.Name = "Iterations Termination Condition";
iterationsTermination.ConditionParameter.ActualName = "Terminate";
#endregion
#region Create operator graph
OperatorGraph.InitialOperator = tabuListCreator;
tabuListCreator.Successor = variableCreator;
variableCreator.Successor = bestQualityMemorizer1;
bestQualityMemorizer1.Successor = bestQualityMemorizer2;
bestQualityMemorizer2.Successor = qualityDifferenceCalculator1;
qualityDifferenceCalculator1.Successor = visualizer1;
visualizer1.Successor = resultsCollector;
resultsCollector.Successor = mainProcessor;
mainProcessor.Operator = moveGenerator;
mainProcessor.Successor = iterationsCounter;
moveGenerator.Successor = moveEvaluationProcessor;
moveEvaluationProcessor.Operator = moveEvaluator;
moveEvaluationProcessor.Successor = moveQualitySorter;
moveEvaluator.Successor = tabuMoveEvaluator;
tabuMoveEvaluator.Successor = null;
moveQualitySorter.Successor = bestAverageWorstMoveQualityCalculator;
bestAverageWorstMoveQualityCalculator.Successor = valuesCollector;
valuesCollector.Successor = tabuSelector;
tabuSelector.Successor = rightReducer;
rightReducer.Successor = moveMakingProcessor;
moveMakingProcessor.Operator = tabuMoveMaker;
moveMakingProcessor.Successor = subScopesRemover;
tabuMoveMaker.Successor = moveMaker;
moveMaker.Successor = null;
subScopesRemover.Successor = null;
iterationsCounter.Successor = iterationsComparator;
iterationsComparator.Successor = bestQualityMemorizer3;
bestQualityMemorizer3.Successor = bestQualityMemorizer4;
bestQualityMemorizer4.Successor = qualityDifferenceCalculator2;
qualityDifferenceCalculator2.Successor = visualizer2;
visualizer2.Successor = iterationsTermination;
iterationsTermination.TrueBranch = null;
iterationsTermination.FalseBranch = mainProcessor;
#endregion
}
}
}