Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealingMainLoop.cs @ 6042

Last change on this file since 6042 was 6042, checked in by abeham, 13 years ago

#1425

  • Changed LocalImprovementOperators
    • Changed interface (made Problem a property, added a property that denotes the type of the problem that it can be applied on, added some general parameters)
    • Added some parameters and wiring
    • Changed move discovery and parameterization and added a helper class to ease finding compatible move operators
    • Discovering only IMultiMoveOperators and IExhaustiveMoveOperators and putting the multi move ones first
    • Fixed bug in Apply method that could create an endless string of nested execution contexts
    • Removed all problem specific analyzers in the two local improvement operators and only left the BestAverageWorstQualityAnalyzer since it doesn't make any sense to perform diversity or allele analysis during local improvement in the most common case and those analyzers take a lot of time (one can always add them manually should he/she be interested). The analyzers in the VNS's Analyzer parameter are left untouched.
  • Removed shaking operator and interface from VNS plugin and added that to Optimization and Optimization.Operators
  • Changed some ValueParameters to ConstrainedValueParameters and added type discovery to fill them (using the ProblemType property to get compatible local improvement operators)
  • Added missing GPL license headers
  • Changed some ValueParameters to the new FixedValueParameters
  • Added an additional encoding specific ShakingOperator to each encoding and added that to each problem
    • reason is that only the problem/encoding can really decide if a shaking operator is meaningful or not
  • Fixed an unrelated bug in the BestAverageWorstQualityAnalyzer that I encountered (and made the fix backwards compatible)
    • Also added a snippet for creating the backwards compatible comment marker and region
  • Fixed the operator graph of the VNS main loop
    • The condition to continue only when the local search was not successful is not necessary and is not part of the VNS definition as far as I know it (only condition to break the inner loop is when k reaches k_max)
  • Changed the ShakingOperator to input current index and output the maximum number of neighborhoods instead of a boolean that indicates that the last index has been reached since the maximum number is a little more generally useful and equally powerful in modeling
    • Remodeled the VNS main loop to check for k < k_max in order to continue the inner loop
  • other changes that I forgot...

Still necessary

  • test, test, test
  • check for backwards compatible breakers
  • add a maximum evaluated solutions stop criterion
  • optionally: implement fast problem specific local search improvement operators that do not build on the whole generic overhead (e.g. a 2-opt TSP specific local search operator). The idea of VNS is really to converge to a local optimum which is difficult to achieve using the current rather limited termination options
File size: 12.7 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using HeuristicLab.Common;
23using HeuristicLab.Core;
24using HeuristicLab.Data;
25using HeuristicLab.Operators;
26using HeuristicLab.Optimization.Operators;
27using HeuristicLab.Parameters;
28using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
29
30namespace HeuristicLab.Algorithms.SimulatedAnnealing {
31  /// <summary>
32  /// An operator which represents a simulated annealing.
33  /// </summary>
34  [Item("SimulatedAnnealingMainLoop", "An operator which represents the main loop of a simulated annealing algorithm.")]
35  [StorableClass]
36  public sealed class SimulatedAnnealingMainLoop : AlgorithmOperator {
37    #region Parameter properties
38    public ValueLookupParameter<IRandom> RandomParameter {
39      get { return (ValueLookupParameter<IRandom>)Parameters["Random"]; }
40    }
41    public ValueLookupParameter<BoolValue> MaximizationParameter {
42      get { return (ValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
43    }
44    public LookupParameter<DoubleValue> QualityParameter {
45      get { return (LookupParameter<DoubleValue>)Parameters["Quality"]; }
46    }
47    public ValueLookupParameter<DoubleValue> BestKnownQualityParameter {
48      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
49    }
50    public LookupParameter<DoubleValue> MoveQualityParameter {
51      get { return (LookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
52    }
53    public ValueLookupParameter<DoubleValue> StartTemperatureParameter {
54      get { return (ValueLookupParameter<DoubleValue>)Parameters["StartTemperature"]; }
55    }
56    public ValueLookupParameter<DoubleValue> EndTemperatureParameter {
57      get { return (ValueLookupParameter<DoubleValue>)Parameters["EndTemperature"]; }
58    }
59    public ValueLookupParameter<IntValue> InnerIterationsParameter {
60      get { return (ValueLookupParameter<IntValue>)Parameters["InnerIterations"]; }
61    }
62    public LookupParameter<IntValue> IterationsParameter {
63      get { return (LookupParameter<IntValue>)Parameters["Iterations"]; }
64    }
65    public ValueLookupParameter<IntValue> MaximumIterationsParameter {
66      get { return (ValueLookupParameter<IntValue>)Parameters["MaximumIterations"]; }
67    }
68    public ValueLookupParameter<IOperator> MoveGeneratorParameter {
69      get { return (ValueLookupParameter<IOperator>)Parameters["MoveGenerator"]; }
70    }
71    public ValueLookupParameter<IOperator> MoveEvaluatorParameter {
72      get { return (ValueLookupParameter<IOperator>)Parameters["MoveEvaluator"]; }
73    }
74    public ValueLookupParameter<IOperator> MoveMakerParameter {
75      get { return (ValueLookupParameter<IOperator>)Parameters["MoveMaker"]; }
76    }
77    public ValueLookupParameter<IOperator> AnnealingOperatorParameter {
78      get { return (ValueLookupParameter<IOperator>)Parameters["AnnealingOperator"]; }
79    }
80    public ValueLookupParameter<IOperator> AnalyzerParameter {
81      get { return (ValueLookupParameter<IOperator>)Parameters["Analyzer"]; }
82    }
83    public ValueLookupParameter<VariableCollection> ResultsParameter {
84      get { return (ValueLookupParameter<VariableCollection>)Parameters["Results"]; }
85    }
86    public LookupParameter<IntValue> EvaluatedMovesParameter {
87      get { return (LookupParameter<IntValue>)Parameters["EvaluatedMoves"]; }
88    }
89    #endregion
90
91    [StorableConstructor]
92    private SimulatedAnnealingMainLoop(bool deserializing) : base(deserializing) { }
93    private SimulatedAnnealingMainLoop(SimulatedAnnealingMainLoop original, Cloner cloner)
94      : base(original, cloner) {
95    }
96    public override IDeepCloneable Clone(Cloner cloner) {
97      return new SimulatedAnnealingMainLoop(this, cloner);
98    }
99    public SimulatedAnnealingMainLoop()
100      : base() {
101      Initialize();
102    }
103
104    private void Initialize() {
105      #region Create parameters
106      Parameters.Add(new ValueLookupParameter<IRandom>("Random", "A pseudo random number generator."));
107      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, otherwise false."));
108      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The value which represents the quality of a solution."));
109      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestKnownQuality", "The best known quality value found so far."));
110      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The value which represents the quality of a move."));
111      Parameters.Add(new ValueLookupParameter<DoubleValue>("StartTemperature", "The initial temperature."));
112      Parameters.Add(new ValueLookupParameter<DoubleValue>("EndTemperature", "The end temperature."));
113      Parameters.Add(new ValueLookupParameter<IntValue>("InnerIterations", "The amount of inner iterations (number of moves before temperature is adjusted again)."));
114      Parameters.Add(new LookupParameter<IntValue>("Iterations", "The number of iterations."));
115      Parameters.Add(new ValueLookupParameter<IntValue>("MaximumIterations", "The maximum number of iterations which should be processed."));
116
117      Parameters.Add(new ValueLookupParameter<IOperator>("MoveGenerator", "The operator that generates the moves."));
118      Parameters.Add(new ValueLookupParameter<IOperator>("MoveEvaluator", "The operator that evaluates a move."));
119      Parameters.Add(new ValueLookupParameter<IOperator>("MoveMaker", "The operator that performs a move and updates the quality."));
120      Parameters.Add(new ValueLookupParameter<IOperator>("AnnealingOperator", "The operator that modifies the temperature."));
121
122      Parameters.Add(new ValueLookupParameter<IOperator>("Analyzer", "The operator used to analyze each generation."));
123      Parameters.Add(new ValueLookupParameter<VariableCollection>("Results", "The variable collection where results should be stored."));
124      Parameters.Add(new LookupParameter<IntValue>("EvaluatedMoves", "The number of evaluated moves."));
125      #endregion
126
127      #region Create operators
128      VariableCreator variableCreator = new VariableCreator();
129      ResultsCollector resultsCollector1 = new ResultsCollector();
130      SubScopesProcessor subScopesProcessor0 = new SubScopesProcessor();
131      Placeholder analyzer1 = new Placeholder();
132      SubScopesProcessor sssp = new SubScopesProcessor();
133      ResultsCollector resultsCollector = new ResultsCollector();
134      Placeholder annealingOperator = new Placeholder();
135      UniformSubScopesProcessor mainProcessor = new UniformSubScopesProcessor();
136      Placeholder moveGenerator = new Placeholder();
137      UniformSubScopesProcessor moveEvaluationProcessor = new UniformSubScopesProcessor();
138      Placeholder moveEvaluator = new Placeholder();
139      SubScopesCounter subScopesCounter = new SubScopesCounter();
140      ProbabilisticQualityComparator qualityComparator = new ProbabilisticQualityComparator();
141      ConditionalBranch improvesQualityBranch = new ConditionalBranch();
142      Placeholder moveMaker = new Placeholder();
143      SubScopesRemover subScopesRemover = new SubScopesRemover();
144      IntCounter iterationsCounter = new IntCounter();
145      Comparator iterationsComparator = new Comparator();
146      SubScopesProcessor subScopesProcessor1 = new SubScopesProcessor();
147      Placeholder analyzer2 = new Placeholder();
148      ConditionalBranch iterationsTermination = new ConditionalBranch();
149
150      variableCreator.CollectedValues.Add(new ValueParameter<DoubleValue>("Temperature", new DoubleValue(double.MaxValue)));
151
152      resultsCollector1.CollectedValues.Add(new LookupParameter<IntValue>(IterationsParameter.Name));
153      resultsCollector1.CollectedValues.Add(new LookupParameter<DoubleValue>("Temperature"));
154      resultsCollector1.ResultsParameter.ActualName = ResultsParameter.Name;
155
156      analyzer1.Name = "Analyzer (placeholder)";
157      analyzer1.OperatorParameter.ActualName = AnalyzerParameter.Name;
158
159      annealingOperator.Name = "Annealing operator (placeholder)";
160      annealingOperator.OperatorParameter.ActualName = AnnealingOperatorParameter.Name;
161
162      moveGenerator.Name = "Move generator (placeholder)";
163      moveGenerator.OperatorParameter.ActualName = MoveGeneratorParameter.Name;
164
165      moveEvaluator.Name = "Move evaluator (placeholder)";
166      moveEvaluator.OperatorParameter.ActualName = MoveEvaluatorParameter.Name;
167
168      subScopesCounter.Name = "Increment EvaluatedMoves";
169      subScopesCounter.ValueParameter.ActualName = EvaluatedMovesParameter.Name;
170
171      qualityComparator.LeftSideParameter.ActualName = MoveQualityParameter.Name;
172      qualityComparator.RightSideParameter.ActualName = QualityParameter.Name;
173      qualityComparator.ResultParameter.ActualName = "IsBetter";
174      qualityComparator.DampeningParameter.ActualName = "Temperature";
175
176      improvesQualityBranch.ConditionParameter.ActualName = "IsBetter";
177
178      moveMaker.Name = "Move maker (placeholder)";
179      moveMaker.OperatorParameter.ActualName = MoveMakerParameter.Name;
180
181      subScopesRemover.RemoveAllSubScopes = true;
182
183      iterationsCounter.Name = "Increment Iterations";
184      iterationsCounter.Increment = new IntValue(1);
185      iterationsCounter.ValueParameter.ActualName = IterationsParameter.Name;
186
187      iterationsComparator.Name = "Iterations >= MaximumIterations";
188      iterationsComparator.LeftSideParameter.ActualName = IterationsParameter.Name;
189      iterationsComparator.RightSideParameter.ActualName = MaximumIterationsParameter.Name;
190      iterationsComparator.ResultParameter.ActualName = "Terminate";
191      iterationsComparator.Comparison.Value = ComparisonType.GreaterOrEqual;
192
193      analyzer2.Name = "Analyzer (placeholder)";
194      analyzer2.OperatorParameter.ActualName = AnalyzerParameter.Name;
195
196      iterationsTermination.Name = "Iterations termination condition";
197      iterationsTermination.ConditionParameter.ActualName = "Terminate";
198      #endregion
199
200      #region Create operator graph
201      OperatorGraph.InitialOperator = variableCreator;
202      variableCreator.Successor = resultsCollector1;
203      resultsCollector1.Successor = subScopesProcessor0;
204      subScopesProcessor0.Operators.Add(analyzer1);
205      subScopesProcessor0.Successor = sssp;
206      analyzer1.Successor = null;
207      sssp.Operators.Add(resultsCollector);
208      sssp.Successor = annealingOperator;
209      resultsCollector.Successor = null;
210      annealingOperator.Successor = mainProcessor;
211      mainProcessor.Operator = moveGenerator;
212      mainProcessor.Successor = iterationsCounter;
213      moveGenerator.Successor = moveEvaluationProcessor;
214      moveEvaluationProcessor.Operator = moveEvaluator;
215      moveEvaluationProcessor.Successor = subScopesCounter;
216      moveEvaluator.Successor = qualityComparator;
217      qualityComparator.Successor = improvesQualityBranch;
218      improvesQualityBranch.TrueBranch = moveMaker;
219      improvesQualityBranch.FalseBranch = null;
220      improvesQualityBranch.Successor = null;
221      moveMaker.Successor = null;
222      subScopesCounter.Successor = subScopesRemover;
223      subScopesRemover.Successor = null;
224      iterationsCounter.Successor = iterationsComparator;
225      iterationsComparator.Successor = subScopesProcessor1;
226      subScopesProcessor1.Operators.Add(analyzer2);
227      subScopesProcessor1.Successor = iterationsTermination;
228      iterationsTermination.TrueBranch = null;
229      iterationsTermination.FalseBranch = annealingOperator;
230      #endregion
231    }
232
233    [StorableHook(HookType.AfterDeserialization)]
234    private void AfterDeserialization() {
235      // BackwardsCompatibility3.3
236      #region Backwards compatible code (remove with 3.4)
237      if (!Parameters.ContainsKey("Iterations"))
238        Parameters.Add(new LookupParameter<IntValue>("Iterations", "The number of iterations."));
239      #endregion
240    }
241
242    public override IOperation Apply() {
243      if (MoveGeneratorParameter.ActualValue == null || MoveEvaluatorParameter.ActualValue == null || MoveMakerParameter.ActualValue == null)
244        return null;
245      return base.Apply();
246    }
247  }
248}
Note: See TracBrowser for help on using the repository browser.