Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Analysis/3.3/PopulationDiversityAnalyzer.cs @ 4715

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

Worked on population diversity analysis (#1188)

File size: 12.5 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 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.Core;
24using HeuristicLab.Data;
25using HeuristicLab.Operators;
26using HeuristicLab.Optimization;
27using HeuristicLab.Parameters;
28using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
29
30namespace HeuristicLab.Analysis {
31  /// <summary>
32  /// An operator for analyzing the solution diversity in a population.
33  /// </summary>
34  [Item("PopulationDiversityAnalyzer", "An operator for analyzing the solution diversity in a population.")]
35  [StorableClass]
36  public abstract class PopulationDiversityAnalyzer<T> : SingleSuccessorOperator, IAnalyzer where T : class, IItem {
37    public LookupParameter<BoolValue> MaximizationParameter {
38      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
39    }
40    public ScopeTreeLookupParameter<T> SolutionParameter {
41      get { return (ScopeTreeLookupParameter<T>)Parameters["Solution"]; }
42    }
43    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
44      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
45    }
46    public ValueLookupParameter<ResultCollection> ResultsParameter {
47      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
48    }
49    public ValueParameter<BoolValue> StoreHistoryParameter {
50      get { return (ValueParameter<BoolValue>)Parameters["StoreHistory"]; }
51    }
52    public ValueParameter<IntValue> UpdateIntervalParameter {
53      get { return (ValueParameter<IntValue>)Parameters["UpdateInterval"]; }
54    }
55    public LookupParameter<IntValue> UpdateCounterParameter {
56      get { return (LookupParameter<IntValue>)Parameters["UpdateCounter"]; }
57    }
58
59    [StorableConstructor]
60    protected PopulationDiversityAnalyzer(bool deserializing) : base(deserializing) { }
61    public PopulationDiversityAnalyzer()
62      : base() {
63      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem."));
64      Parameters.Add(new ScopeTreeLookupParameter<T>("Solution", "The solutions whose diversity should be analyzed."));
65      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the solutions which should be analyzed."));
66      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the population diversity analysis results should be stored."));
67      Parameters.Add(new ValueParameter<BoolValue>("StoreHistory", "True if the history of the population diversity analysis should be stored.", new BoolValue(false)));
68      Parameters.Add(new ValueParameter<IntValue>("UpdateInterval", "The interval in which the population diversity analysis should be applied.", new IntValue(1)));
69      Parameters.Add(new LookupParameter<IntValue>("UpdateCounter", "The value which counts how many times the operator was called since the last update.", "PopulationDiversityAnalyzerUpdateCounter"));
70    }
71
72    public override IOperation Apply() {
73      int updateInterval = UpdateIntervalParameter.Value.Value;
74      IntValue updateCounter = UpdateCounterParameter.ActualValue;
75      if (updateCounter == null) {
76        updateCounter = new IntValue(updateInterval);
77        UpdateCounterParameter.ActualValue = updateCounter;
78      } else updateCounter.Value++;
79
80      if (updateCounter.Value == updateInterval) {
81        updateCounter.Value = 0;
82
83        bool max = MaximizationParameter.ActualValue.Value;
84        ItemArray<T> solutions = SolutionParameter.ActualValue;
85        ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
86        bool storeHistory = StoreHistoryParameter.Value.Value;
87
88        // sort solutions by quality
89        T[] sortedSolutions = null;
90        if (max)
91          sortedSolutions = solutions.Select((x, index) => new { Solution = x, Quality = qualities[index] }).OrderByDescending(x => x.Quality).Select(x => x.Solution).ToArray();
92        else
93          sortedSolutions = solutions.Select((x, index) => new { Solution = x, Quality = qualities[index] }).OrderBy(x => x.Quality).Select(x => x.Solution).ToArray();
94
95        // calculate solution similarities
96        double[,] similarities = CalculateSimilarities(sortedSolutions);
97
98        // calculate minimum, average and maximum similarities
99        double similarity;
100        int count = sortedSolutions.Length;
101        double[] minSimilarities = new double[sortedSolutions.Length];
102        double[] avgSimilarities = new double[sortedSolutions.Length];
103        double[] maxSimilarities = new double[sortedSolutions.Length];
104        double avgSimilarity = 0;
105        for (int i = 0; i < count; i++) {
106          minSimilarities[i] = 1;
107          avgSimilarities[i] = 0;
108          maxSimilarities[i] = 0;
109          for (int j = 0; j < count; j++) {
110            if (i != j) {
111              similarity = similarities[i, j];
112              avgSimilarity += similarity;
113              if (minSimilarities[i] > similarity) minSimilarities[i] = similarity;
114              avgSimilarities[i] += similarity;
115              if (maxSimilarities[i] < similarity) maxSimilarities[i] = similarity;
116            }
117          }
118          avgSimilarities[i] = avgSimilarities[i] / (count - 1);
119        }
120        double avgMinSimilarity = minSimilarities.Average();
121        double avgAvgSimilarity = avgSimilarities.Average();
122        double avgMaxSimilarity = maxSimilarities.Average();
123        avgSimilarity = avgSimilarity / (count * count - count);
124
125        // fetch results collection
126        ResultCollection results;
127        if (!ResultsParameter.ActualValue.ContainsKey("Population Diversity Analysis Results")) {
128          results = new ResultCollection();
129          ResultsParameter.ActualValue.Add(new Result("Population Diversity Analysis Results", results));
130        } else {
131          results = (ResultCollection)ResultsParameter.ActualValue["Population Diversity Analysis Results"].Value;
132        }
133
134        // store similarities
135        HeatMap similaritiesHeatMap = new HeatMap(similarities);
136        if (!results.ContainsKey("Solution Similarities"))
137          results.Add(new Result("Solution Similarities", similaritiesHeatMap));
138        else
139          results["Solution Similarities"].Value = similaritiesHeatMap;
140
141        // store similarities history
142        if (storeHistory) {
143          if (!results.ContainsKey("Solution Similarities History")) {
144            HeatMapHistory history = new HeatMapHistory();
145            history.Add(similaritiesHeatMap);
146            results.Add(new Result("Solution Similarities History", history));
147          } else {
148            ((HeatMapHistory)results["Solution Similarities History"].Value).Add(similaritiesHeatMap);
149          }
150        }
151
152        // store average similarity
153        if (!results.ContainsKey("Average Population Similarity"))
154          results.Add(new Result("Average Population Similarity", new DoubleValue(avgSimilarity)));
155        else
156          ((DoubleValue)results["Average Population Similarity"].Value).Value = avgSimilarity;
157
158        // store average minimum, average and maximum similarity
159        if (!results.ContainsKey("Average Minimum Solution Similarity"))
160          results.Add(new Result("Average Minimum Solution Similarity", new DoubleValue(avgMinSimilarity)));
161        else
162          ((DoubleValue)results["Average Minimum Solution Similarity"].Value).Value = avgMinSimilarity;
163
164        if (!results.ContainsKey("Average Average Solution Similarity"))
165          results.Add(new Result("Average Average Solution Similarity", new DoubleValue(avgAvgSimilarity)));
166        else
167          ((DoubleValue)results["Average Average Solution Similarity"].Value).Value = avgAvgSimilarity;
168
169        if (!results.ContainsKey("Average Maximum Solution Similarity"))
170          results.Add(new Result("Average Maximum Solution Similarity", new DoubleValue(avgMaxSimilarity)));
171        else
172          ((DoubleValue)results["Average Maximum Solution Similarity"].Value).Value = avgMaxSimilarity;
173
174        // store population similarity data table
175        DataTable similarityDataTable;
176        if (!results.ContainsKey("Average Solution Similarity")) {
177          similarityDataTable = new DataTable("Average Solution Similarity");
178          results.Add(new Result("Average Solution Similarity", similarityDataTable));
179          DataRowVisualProperties visualProperties = new DataRowVisualProperties();
180          visualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Line;
181          visualProperties.StartIndexZero = true;
182          similarityDataTable.Rows.Add(new DataRow("Average Population Similarity", null, visualProperties));
183          similarityDataTable.Rows.Add(new DataRow("Average Minimum Solution Similarity", null, visualProperties));
184          similarityDataTable.Rows.Add(new DataRow("Average Average Solution Similarity", null, visualProperties));
185          similarityDataTable.Rows.Add(new DataRow("Average Maximum Solution Similarity", null, visualProperties));
186        } else {
187          similarityDataTable = (DataTable)results["Average Solution Similarity"].Value;
188        }
189        similarityDataTable.Rows["Average Population Similarity"].Values.Add(avgSimilarity);
190        similarityDataTable.Rows["Average Minimum Solution Similarity"].Values.Add(avgMinSimilarity);
191        similarityDataTable.Rows["Average Average Solution Similarity"].Values.Add(avgAvgSimilarity);
192        similarityDataTable.Rows["Average Maximum Solution Similarity"].Values.Add(avgMaxSimilarity);
193
194        // store maximum similarities
195        DataTable minAvgMaxSimilaritiesDataTable = new DataTable("Minimum/Average/Maximum Solution Similarities");
196        minAvgMaxSimilaritiesDataTable.Rows.Add(new DataRow("Minimum Solution Similarity"));
197        minAvgMaxSimilaritiesDataTable.Rows["Minimum Solution Similarity"].VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Columns;
198        minAvgMaxSimilaritiesDataTable.Rows["Minimum Solution Similarity"].Values.AddRange(minSimilarities);
199        minAvgMaxSimilaritiesDataTable.Rows.Add(new DataRow("Average Solution Similarity"));
200        minAvgMaxSimilaritiesDataTable.Rows["Average Solution Similarity"].VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Columns;
201        minAvgMaxSimilaritiesDataTable.Rows["Average Solution Similarity"].Values.AddRange(avgSimilarities);
202        minAvgMaxSimilaritiesDataTable.Rows.Add(new DataRow("Maximum Solution Similarity"));
203        minAvgMaxSimilaritiesDataTable.Rows["Maximum Solution Similarity"].VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Columns;
204        minAvgMaxSimilaritiesDataTable.Rows["Maximum Solution Similarity"].Values.AddRange(maxSimilarities);
205        if (!results.ContainsKey("Minimum/Average/Maximum Solution Similarities")) {
206          results.Add(new Result("Minimum/Average/Maximum Solution Similarities", minAvgMaxSimilaritiesDataTable));
207        } else {
208          results["Minimum/Average/Maximum Solution Similarities"].Value = minAvgMaxSimilaritiesDataTable;
209        }
210
211        // store maximum similarities history
212        if (storeHistory) {
213          if (!results.ContainsKey("Minimum/Average/Maximum Solution Similarities History")) {
214            DataTableHistory history = new DataTableHistory();
215            history.Add(minAvgMaxSimilaritiesDataTable);
216            results.Add(new Result("Minimum/Average/Maximum Solution Similarities History", history));
217          } else {
218            ((DataTableHistory)results["Minimum/Average/Maximum Solution Similarities History"].Value).Add(minAvgMaxSimilaritiesDataTable);
219          }
220        }
221      }
222      return base.Apply();
223    }
224
225    protected abstract double[,] CalculateSimilarities(T[] solutions);
226  }
227}
Note: See TracBrowser for help on using the repository browser.