Free cookie consent management tool by TermsFeed Policy Generator

source: addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Evolvability/EvolvabilityAnalyzer.cs @ 16573

Last change on this file since 16573 was 16573, checked in by gkronber, 5 years ago

#2520: changed HeuristicLab.FLA addon to compile with new HL.Persistence

File size: 8.1 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Drawing;
4using System.Linq;
5using HEAL.Attic;
6using HeuristicLab.Common;
7using HeuristicLab.Core;
8using HeuristicLab.Data;
9using HeuristicLab.Operators;
10using HeuristicLab.Optimization;
11using HeuristicLab.Optimization.Operators;
12using HeuristicLab.Parameters;
13using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
14
15namespace HeuristicLab.Analysis.FitnessLandscape.Evolvability {
16
17  [Item("Evolvability Analyzer", "Compares two sets of scopes containing the original population and the evolved population generating several evolvability measures.")]
18  [StorableType("6B05CC43-161A-45C6-9B08-A4CC2235A96B")]
19  public class EvolvabilityAnalyzer : AlgorithmOperator, IAnalyzer {
20
21    public bool EnabledByDefault
22    {
23      get { return false; }
24    }
25
26    #region Parameters
27    public LookupParameter<DoubleValue> QualityParameter
28    {
29      get { return (LookupParameter<DoubleValue>)Parameters["Quality"]; }
30    }
31    public LookupParameter<IntValue> SampleSizeParameter
32    {
33      get { return (LookupParameter<IntValue>)Parameters["SampleSize"]; }
34    }
35    public LookupParameter<HeatMap> EvolvabilityPlotParameter
36    {
37      get { return (LookupParameter<HeatMap>)Parameters["EvolvabilityPlot"]; }
38    }
39    public LookupParameter<VariableCollection> ResultsParameter
40    {
41      get { return (LookupParameter<VariableCollection>)Parameters["Results"]; }
42    }
43    public LookupParameter<ScatterPlot> FitnessCloudParameter
44    {
45      get { return (LookupParameter<ScatterPlot>)Parameters["FitnessCloud"]; }
46    }
47    public LookupParameter<DataTable> EvolvabilityPortraitParameter
48    {
49      get { return (LookupParameter<DataTable>)Parameters["EvolvabilityPortrait"]; }
50    }
51    public ValueLookupParameter<IntValue> NrOfBinsParameter
52    {
53      get { return (ValueLookupParameter<IntValue>)Parameters["NrOfBins"]; }
54    }
55    public ScopeParameter ScopeParameter
56    {
57      get { return (ScopeParameter)Parameters["Scope"]; }
58    }
59    #endregion
60
61    #region Constructors
62    public EvolvabilityAnalyzer() {
63      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The qualities of evolved and unevolved solution candidates"));
64      Parameters.Add(new LookupParameter<IntValue>("SampleSize", "The number of samples or population size for evolvability analysis"));
65      Parameters.Add(new LookupParameter<HeatMap>("EvolvabilityPlot", "Collected evolvability values"));
66      Parameters.Add(new LookupParameter<VariableCollection>("Results", "The collection of all results of this algorithm"));
67      Parameters.Add(new LookupParameter<ScatterPlot>("FitnessCloud", "A fitness cloud of the original vs. evolved sample."));
68      Parameters.Add(new LookupParameter<DataTable>("EvolvabilityPortrait", "Evolvability Portrait as described in Smith et. al (2002). Evol Comput 10:1–34"));
69      Parameters.Add(new ValueLookupParameter<IntValue>("NrOfBins", "Nr of bins for evolvability portrait analysis", new IntValue(25)));
70      Parameters.Add(new ScopeParameter("Scope", "The current scope"));
71
72      var resultsCollector = new ResultsCollector();
73      resultsCollector.CollectedValues.Add(new LookupParameter<HeatMap>(EvolvabilityPlotParameter.Name));
74      resultsCollector.CollectedValues.Add(new LookupParameter<ScatterPlot>(FitnessCloudParameter.Name));
75      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(EvolvabilityPortraitParameter.Name));
76
77      OperatorGraph.InitialOperator = resultsCollector;
78      resultsCollector.Successor = null;
79    }
80
81    [StorableConstructor]
82    protected EvolvabilityAnalyzer(StorableConstructorFlag _) : base(_) { }
83
84    protected EvolvabilityAnalyzer(EvolvabilityAnalyzer original, Cloner cloner)
85      : base(original, cloner) {
86    }
87    #endregion
88
89    public override IDeepCloneable Clone(Cloner cloner) {
90      return new EvolvabilityAnalyzer(this, cloner);
91    }
92
93    public override IOperation Apply() {
94      var points = GenerateQualityPairs(ScopeParameter.ActualValue);
95      GetOrCreateEvolvabilityPlot().Add(points);
96      GetOrCreateScatterPlot().Add(points);
97      CreateEvolvabilityPortrait(ScopeParameter.ActualValue);
98      return base.Apply();
99    }
100
101    private IEnumerable<PointF> GenerateQualityPairs(IScope globalScope) {
102      foreach (IScope sampleScope in globalScope.SubScopes) {
103        double originalQuality = ((DoubleValue)sampleScope.Variables[QualityParameter.ActualName].Value).Value;
104        foreach (IScope evolvedScope in sampleScope.SubScopes) {
105          double evolvedQuality = ((DoubleValue)evolvedScope.Variables[QualityParameter.ActualName].Value).Value;
106          yield return new PointF((float)originalQuality, (float)evolvedQuality);
107        }
108      }
109    }
110
111    private HeatMap GetOrCreateEvolvabilityPlot() {
112      HeatMap evolvabilityPlot = EvolvabilityPlotParameter.ActualValue as HeatMap;
113      if (evolvabilityPlot == null) {
114        evolvabilityPlot = new HeatMap();
115        evolvabilityPlot.Name = "Evolvability";
116        EvolvabilityPlotParameter.ActualValue = evolvabilityPlot;
117      }
118      return evolvabilityPlot;
119    }
120
121    private ScatterPlot GetOrCreateScatterPlot() {
122      ScatterPlot scatterPlot = FitnessCloudParameter.ActualValue as ScatterPlot;
123      if (scatterPlot == null) {
124        scatterPlot = new ScatterPlot();
125        scatterPlot.Name = "Fitness Cloud";
126        scatterPlot.XAxisName = "Parent Fitness";
127        scatterPlot.YAxisName = "Offspring Fitness";
128        FitnessCloudParameter.ActualValue = scatterPlot;
129      }
130      return scatterPlot;
131    }
132
133    private DataTable GetOrCreateEvolvabilityPortrait() {
134      DataTable evolvabilityPortrait = EvolvabilityPortraitParameter.ActualValue as DataTable;
135      if (evolvabilityPortrait == null) {
136        evolvabilityPortrait = new DataTable("Evolvability Portrait");
137        evolvabilityPortrait.Rows.Add(new DataRow("E_a", "Probability of non-deleterious mutation"));
138        evolvabilityPortrait.Rows.Add(new DataRow("E_b", "Average expected offspring fitness"));
139        evolvabilityPortrait.Rows.Add(new DataRow("E_c", "Top offspring fitness"));
140        evolvabilityPortrait.Rows.Add(new DataRow("E_d", "Bottom offspring fitness"));
141        EvolvabilityPortraitParameter.ActualValue = evolvabilityPortrait;
142      }
143      return evolvabilityPortrait;
144    }
145
146    private double GetQuality(IScope scope) {
147      return ((DoubleValue)scope.Variables[QualityParameter.ActualName].Value).Value;
148    }
149
150    private void CreateEvolvabilityPortrait(IScope globalScope) {
151      DataTable table = GetOrCreateEvolvabilityPortrait();
152      var e_a = table.Rows["E_a"].Values;
153      var e_b = table.Rows["E_b"].Values;
154      var e_c = table.Rows["E_c"].Values;
155      var e_d = table.Rows["E_d"].Values;
156      var qualities = globalScope.SubScopes.Select(s => GetQuality(s));
157      double min = qualities.Min();
158      double max = qualities.Max();
159      double range = max - min;
160      double stepSize = range / NrOfBinsParameter.ActualValue.Value;
161      double threshold = min + stepSize;
162
163      int n_not_worse = 0;
164      int n = 0;
165      double totalOffspringQuality = 0;
166      double best = double.MinValue;
167      double worst = double.MaxValue;
168      foreach (IScope sampleScope in globalScope.SubScopes) {
169        double originalQuality = GetQuality(sampleScope);
170        foreach (IScope evolvedScope in sampleScope.SubScopes) {
171          double evolvedQuality = GetQuality(evolvedScope);
172          if (evolvedQuality >= originalQuality)
173            n_not_worse++;
174          n++;
175          totalOffspringQuality += evolvedQuality;
176          best = Math.Max(best, evolvedQuality);
177          worst = Math.Min(worst, evolvedQuality);
178        }
179        if (originalQuality > threshold) {
180          threshold += stepSize;
181          e_a.Add(1.0 * n_not_worse / n);
182          e_b.Add(totalOffspringQuality / n);
183          e_c.Add(best);
184          e_d.Add(worst);
185          n_not_worse = 0;
186          n = 0;
187          totalOffspringQuality = 0;
188          best = double.MinValue;
189          worst = double.MaxValue;
190        }
191      }
192    }
193  }
194}
Note: See TracBrowser for help on using the repository browser.