Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/SolutionToPopulationAnalyzer.cs @ 9196

Last change on this file since 9196 was 9196, checked in by ascheibe, 11 years ago

#1886

  • fixed a cloning bug
  • fixed forgotten event handler deregistration
  • added a run collection view for analyzing parameter influences
File size: 10.2 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2012 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
22
23using System;
24using System.Linq;
25using HeuristicLab.Common;
26using HeuristicLab.Core;
27using HeuristicLab.Data;
28using HeuristicLab.Optimization;
29using HeuristicLab.Parameters;
30using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
31
32namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers {
33  [Item("SolutionToPopulationAnalyzer", "An operator that analyzes the diversity of solutions compared to the population.")]
34  [StorableClass]
35  public class SolutionToPopulationAnalyzer : InitializableOperator, IStatefulItem {
36    private const string ResultsParameterName = "Results";
37    private const string GenerationsParameterName = "Generations";
38
39    #region Parameter properties
40    public IValueLookupParameter<BoolValue> MaximizationParameter {
41      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
42    }
43    public ILookupParameter<ResultCollection> ResultsParameter {
44      get { return (ILookupParameter<ResultCollection>)Parameters[ResultsParameterName]; }
45    }
46    public ILookupParameter<IntValue> GenerationsParameter {
47      get { return (ILookupParameter<IntValue>)Parameters[GenerationsParameterName]; }
48    }
49    public ILookupParameter<DoubleValue> QualityParameter {
50      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
51    }
52    public ILookupParameter<IItem> SolutionParameter {
53      get { return (ILookupParameter<IItem>)Parameters["Solution"]; }
54    }
55    public ILookupParameter<ItemCollection<IItem>> OperatorsParameter {
56      get { return (ILookupParameter<ItemCollection<IItem>>)Parameters["Operators"]; }
57    }
58    public IValueParameter<ISingleObjectiveSolutionSimilarityCalculator> SimilarityCalculatorParameter {
59      get { return (IValueParameter<ISingleObjectiveSolutionSimilarityCalculator>)Parameters["SimilarityCalculator"]; }
60    }
61    public IValueParameter<StringValue> ChartPostfixParameter {
62      get { return (IValueParameter<StringValue>)Parameters["ChartPostfix"]; }
63    }
64    public ILookupParameter<DoubleValue> BestKnownQualityParameter {
65      get { return (ILookupParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
66    }
67    public ILookupParameter<DoubleValue> WorstKnownQualityParameter {
68      get { return (ILookupParameter<DoubleValue>)Parameters["WorstKnownQuality"]; }
69    }
70    #endregion
71
72    #region Properties
73    public ResultCollection Results {
74      get { return ResultsParameter.ActualValue; }
75    }
76    [Storable]
77    private ScatterPlotHelper populationDiversityPlot, populationQualityPlot, qualityPlot;
78    [Storable]
79    private int cnt = 0;
80    [Storable]
81    private int lastGeneration = 0;
82    #endregion
83
84    [StorableConstructor]
85    private SolutionToPopulationAnalyzer(bool deserializing) : base(deserializing) { }
86    private SolutionToPopulationAnalyzer(SolutionToPopulationAnalyzer original, Cloner cloner)
87      : base(original, cloner) {
88      cnt = original.cnt;
89      lastGeneration = original.lastGeneration;
90      populationDiversityPlot = (ScatterPlotHelper)original.populationDiversityPlot.Clone(cloner);
91      populationQualityPlot = (ScatterPlotHelper)original.populationQualityPlot.Clone(cloner);
92      qualityPlot = (ScatterPlotHelper)original.qualityPlot.Clone(cloner);
93    }
94
95    public SolutionToPopulationAnalyzer()
96      : base() {
97      Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName, "The results collection where the analysis values should be stored."));
98      Parameters.Add(new LookupParameter<IntValue>(GenerationsParameterName, "Nr of generations."));
99      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The evaluated quality of the child solution."));
100      QualityParameter.ActualName = "TSPTourLength";
101      Parameters.Add(new LookupParameter<IItem>("Solution"));
102      SolutionParameter.ActualName = "TSPTour";
103      Parameters.Add(new ValueParameter<ISingleObjectiveSolutionSimilarityCalculator>("SimilarityCalculator"));
104      Parameters.Add(new ValueParameter<StringValue>("ChartPostfix", new StringValue(string.Empty)));
105      Parameters.Add(new LookupParameter<ItemCollection<IItem>>("Operators", "The operators and items that the problem provides to the algorithms."));
106      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, false otherwise"));
107      Parameters.Add(new LookupParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this problem."));
108      Parameters.Add(new LookupParameter<DoubleValue>("WorstKnownQuality", "The quality of the worst known solution of this problem."));
109
110      populationDiversityPlot = new ScatterPlotHelper(false, true);
111      populationQualityPlot = new ScatterPlotHelper(false, true, true);
112      qualityPlot = new ScatterPlotHelper(false, true, true);
113    }
114
115    public override IDeepCloneable Clone(Cloner cloner) {
116      return new SolutionToPopulationAnalyzer(this, cloner);
117    }
118
119    protected override void InitializeAction() {
120      if (SimilarityCalculatorParameter.Value == null) {
121        SimilarityCalculatorParameter.Value = OperatorsParameter.ActualValue.OfType<ISingleObjectiveSolutionSimilarityCalculator>().FirstOrDefault();
122      }
123
124      populationDiversityPlot.InitializePlot(Results, "Solution to Population Diversity " + ChartPostfixParameter.Value.Value, "Solution Index", "Diversity");
125      populationQualityPlot.InitializePlot(Results, "Solution Quality Difference to Population " + ChartPostfixParameter.Value.Value, "Solution Index", "Quality Difference");
126      qualityPlot.InitializePlot(Results, "Solution Quality " + ChartPostfixParameter.Value.Value, "Solution Index", "Quality");
127
128      Reset();
129    }
130
131    public override IOperation Apply() {
132      Initialize();
133
134      string curGenStr = GenerationsParameter.ActualValue.Value.ToString();
135      double quality = QualityParameter.ActualValue.Value;
136      IItem solution = SolutionParameter.ActualValue;
137      string qualityVariableName = QualityParameter.ActualName;
138      string solutionVariableName = SolutionParameter.ActualName;
139      ISingleObjectiveSolutionSimilarityCalculator simCalc = SimilarityCalculatorParameter.Value;
140      Scope artificialSolutionScope = new Scope();
141      artificialSolutionScope.Variables.Add(new Variable(solutionVariableName, solution));
142
143
144      IScope oldPop = ReverseScopeTreeLookup("Remaining");
145      if (oldPop == null)
146        throw new Exception("Couldn't find the remaining scope");
147
148      if (GenerationsParameter.ActualValue.Value != 0) {
149        if (GenerationsParameter.ActualValue.Value > lastGeneration) {
150          Reset();
151        }
152
153        double oldPopQuality = 0.0;
154        double solToPopDiversity = 0.0;
155        int popSize = 0;
156        foreach (IScope oldSolScope in oldPop.SubScopes) {
157          double curQuality = ((DoubleValue)oldSolScope.Variables[qualityVariableName].Value).Value;
158          IItem curSol = oldSolScope.Variables[solutionVariableName].Value;
159          oldPopQuality += curQuality;
160          solToPopDiversity += simCalc.CalculateSolutionSimilarity(artificialSolutionScope, oldSolScope);
161          popSize++;
162        }
163
164        if (GenerationsParameter.ActualValue.Value == 1) {
165          double bkQuality = BestKnownQualityParameter.ActualValue.Value;
166          double wkQuality = WorstKnownQualityParameter.ActualValue.Value;
167
168          if (MaximizationParameter.ActualValue.Value) {
169            if (populationQualityPlot.Max == double.MinValue) {
170              populationQualityPlot.Max = bkQuality - wkQuality;
171              qualityPlot.Max = bkQuality;
172              populationQualityPlot.Min = 0;
173              qualityPlot.Min = wkQuality;
174            }
175          } else {
176            if (populationQualityPlot.Min == double.MaxValue) {
177              populationQualityPlot.Max = wkQuality - bkQuality;
178              qualityPlot.Max = wkQuality;
179              populationQualityPlot.Min = 0;
180              qualityPlot.Min = bkQuality;
181            }
182          }
183        }
184
185        Point2D<double> popQualityPoint;
186        if (MaximizationParameter.ActualValue.Value) {
187          popQualityPoint = new Point2D<double>(cnt, quality - (oldPopQuality / popSize));
188        } else {
189          popQualityPoint = new Point2D<double>(cnt, (oldPopQuality / popSize) - quality);
190        }
191
192        Point2D<double> solQuality = new Point2D<double>(cnt, quality);
193        Point2D<double> diversityPoint = new Point2D<double>(cnt++, solToPopDiversity / popSize);
194
195        populationDiversityPlot.AddPoint(curGenStr, diversityPoint);
196        populationQualityPlot.AddPoint(curGenStr, popQualityPoint);
197        qualityPlot.AddPoint(curGenStr, solQuality);
198      }
199
200      return base.Apply();
201    }
202
203    private void Reset() {
204      cnt = 0;
205      lastGeneration = GenerationsParameter.ActualValue.Value;
206    }
207
208    public override void ClearState() {
209      populationQualityPlot.CleanUp();
210      populationDiversityPlot.CleanUp();
211      qualityPlot.CleanUp();
212    }
213
214    private IScope ReverseScopeTreeLookup(string scopeName) {
215      var currentScope = ExecutionContext.Scope;
216      while (currentScope != null) {
217        var scopes = currentScope.SubScopes.Where(x => x.Name == scopeName);
218        if (scopes.Count() > 0)
219          return scopes.First();
220
221        currentScope = currentScope.Parent;
222      }
223      return null;
224    }
225  }
226}
Note: See TracBrowser for help on using the repository browser.