Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/Analyzers/BestTSPSolutionAnalyzer.cs @ 6078

Last change on this file since 6078 was 6051, checked in by swagner, 14 years ago

Changed some more parameters to be hidden per default and corrected wrong layout in some parameter views (#1377)

File size: 6.4 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 System.Linq;
23using HeuristicLab.Common;
24using HeuristicLab.Core;
25using HeuristicLab.Data;
26using HeuristicLab.Encodings.PermutationEncoding;
27using HeuristicLab.Operators;
28using HeuristicLab.Optimization;
29using HeuristicLab.Parameters;
30using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
31
32namespace HeuristicLab.Problems.TravelingSalesman {
33  /// <summary>
34  /// An operator for analyzing the best solution of Traveling Salesman Problems given in path representation using city coordinates.
35  /// </summary>
36  [Item("BestTSPSolutionAnalyzer", "An operator for analyzing the best solution of Traveling Salesman Problems given in path representation using city coordinates.")]
37  [StorableClass]
38  public sealed class BestTSPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer {
39    public LookupParameter<BoolValue> MaximizationParameter {
40      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
41    }
42    public LookupParameter<DoubleMatrix> CoordinatesParameter {
43      get { return (LookupParameter<DoubleMatrix>)Parameters["Coordinates"]; }
44    }
45    public ScopeTreeLookupParameter<Permutation> PermutationParameter {
46      get { return (ScopeTreeLookupParameter<Permutation>)Parameters["Permutation"]; }
47    }
48    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
49      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
50    }
51    public LookupParameter<PathTSPTour> BestSolutionParameter {
52      get { return (LookupParameter<PathTSPTour>)Parameters["BestSolution"]; }
53    }
54    public ValueLookupParameter<ResultCollection> ResultsParameter {
55      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
56    }
57    public LookupParameter<DoubleValue> BestKnownQualityParameter {
58      get { return (LookupParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
59    }
60    public LookupParameter<Permutation> BestKnownSolutionParameter {
61      get { return (LookupParameter<Permutation>)Parameters["BestKnownSolution"]; }
62    }
63
64    [StorableConstructor]
65    private BestTSPSolutionAnalyzer(bool deserializing) : base(deserializing) { }
66    private BestTSPSolutionAnalyzer(BestTSPSolutionAnalyzer original, Cloner cloner) : base(original, cloner) { }
67    public override IDeepCloneable Clone(Cloner cloner) {
68      return new BestTSPSolutionAnalyzer(this, cloner);
69    }
70    public BestTSPSolutionAnalyzer()
71      : base() {
72      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem."));
73      Parameters.Add(new LookupParameter<DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the cities."));
74      Parameters.Add(new ScopeTreeLookupParameter<Permutation>("Permutation", "The TSP solutions given in path representation from which the best solution should be analyzed."));
75      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the TSP solutions which should be analyzed."));
76      Parameters.Add(new LookupParameter<PathTSPTour>("BestSolution", "The best TSP solution."));
77      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best TSP solution should be stored."));
78      Parameters.Add(new LookupParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this TSP instance."));
79      Parameters.Add(new LookupParameter<Permutation>("BestKnownSolution", "The best known solution of this TSP instance."));
80
81      MaximizationParameter.Hidden = true;
82      CoordinatesParameter.Hidden = true;
83      PermutationParameter.Hidden = true;
84      QualityParameter.Hidden = true;
85      BestSolutionParameter.Hidden = true;
86      ResultsParameter.Hidden = true;
87      BestKnownQualityParameter.Hidden = true;
88      BestKnownSolutionParameter.Hidden = true;
89    }
90
91    public override IOperation Apply() {
92      DoubleMatrix coordinates = CoordinatesParameter.ActualValue;
93      ItemArray<Permutation> permutations = PermutationParameter.ActualValue;
94      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
95      ResultCollection results = ResultsParameter.ActualValue;
96      bool max = MaximizationParameter.ActualValue.Value;
97      DoubleValue bestKnownQuality = BestKnownQualityParameter.ActualValue;
98
99      int i = -1;
100      if (!max)
101        i = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
102      else i = qualities.Select((x, index) => new { index, x.Value }).OrderByDescending(x => x.Value).First().index;
103
104      if (bestKnownQuality == null ||
105          max && qualities[i].Value > bestKnownQuality.Value ||
106          !max && qualities[i].Value < bestKnownQuality.Value) {
107        BestKnownQualityParameter.ActualValue = new DoubleValue(qualities[i].Value);
108        BestKnownSolutionParameter.ActualValue = (Permutation)permutations[i].Clone();
109      }
110
111      PathTSPTour tour = BestSolutionParameter.ActualValue;
112      if (tour == null) {
113        tour = new PathTSPTour(coordinates, (Permutation)permutations[i].Clone(), new DoubleValue(qualities[i].Value));
114        BestSolutionParameter.ActualValue = tour;
115        results.Add(new Result("Best TSP Solution", tour));
116      } else {
117        if (max && tour.Quality.Value < qualities[i].Value ||
118          !max && tour.Quality.Value > qualities[i].Value) {
119          tour.Coordinates = coordinates;
120          tour.Permutation = (Permutation)permutations[i].Clone();
121          tour.Quality.Value = qualities[i].Value;
122        }
123      }
124
125      return base.Apply();
126    }
127  }
128}
Note: See TracBrowser for help on using the repository browser.