Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
08/22/15 14:27:37 (9 years ago)
Author:
bburlacu
Message:

#1772: Merge trunk changes. Remove dead code from the genealogy analyzer.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs

    r12265 r12891  
    1818 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
    1919 */
    20 #endregion
     20#endregion License Information
    2121
    2222using System.Collections.Generic;
     
    3535  [Item("GenealogyAnalyzer", "An analyzer which performs the necessary instrumentation to record the evolution of a genetic algorithm.")]
    3636  public class GenealogyAnalyzer<T> : SingleSuccessorOperator, IAnalyzer
    37   where T : class,IItem {
     37  where T : class, IItem {
    3838    #region parameter names
    3939    private const string GenerationsParameterName = "Generations";
     
    5656    private const string EnableManipulatorTrackingParameterName = "EnableManipulatorTracking";
    5757    private const string EnableSolutionCreatorTrackingParameterName = "EnableSolutionCreatorTracking"; // should always be enabled. maybe superfluous
    58     #endregion
     58    #endregion parameter names
    5959
    6060    #region parameter properties
     
    6262      get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters[QualityParameterName]; }
    6363    }
     64
    6465    public IScopeTreeLookupParameter<T> PopulationParameter {
    6566      get { return (IScopeTreeLookupParameter<T>)Parameters[PopulationParameterName]; }
    6667    }
     68
    6769    public IValueParameter<ICrossoverOperator<T>> BeforeCrossoverOperatorParameter {
    6870      get { return (IValueParameter<ICrossoverOperator<T>>)Parameters[BeforeCrossoverOperatorParameterName]; }
    6971    }
     72
    7073    public IValueParameter<ICrossoverOperator<T>> AfterCrossoverOperatorParameter {
    7174      get { return (IValueParameter<ICrossoverOperator<T>>)Parameters[AfterCrossoverOperatorParameterName]; }
    7275    }
     76
    7377    public IValueParameter<IManipulatorOperator<T>> BeforeManipulatorOperatorParameter {
    7478      get { return (IValueParameter<IManipulatorOperator<T>>)Parameters[BeforeManipulatorOperatorParameterName]; }
    7579    }
     80
    7681    public IValueParameter<IManipulatorOperator<T>> AfterManipulatorOperatorParameter {
    7782      get { return (IValueParameter<IManipulatorOperator<T>>)Parameters[AfterManipulatorOperatorParameterName]; }
    7883    }
     84
    7985    public ILookupParameter<ResultCollection> ResultsParameter {
    8086      get { return (ILookupParameter<ResultCollection>)Parameters[ResultsParameterName]; }
    8187    }
     88
    8289    public ILookupParameter<IntValue> GenerationsParameter {
    8390      get { return (ILookupParameter<IntValue>)Parameters[GenerationsParameterName]; }
    8491    }
     92
    8593    public IValueParameter<BoolValue> EnableCrossoverTrackingParameter {
    8694      get { return (IValueParameter<BoolValue>)Parameters[EnableCrossoverTrackingParameterName]; }
    8795    }
     96
    8897    public IValueParameter<BoolValue> EnableManipulatorTrackingParameter {
    8998      get { return (IValueParameter<BoolValue>)Parameters[EnableManipulatorTrackingParameterName]; }
    9099    }
     100
    91101    public IValueParameter<BoolValue> EnableSolutionCreatorTrackingParameter {
    92102      get { return (IValueParameter<BoolValue>)Parameters[EnableSolutionCreatorTrackingParameterName]; }
    93103    }
     104
    94105    public ILookupParameter<ICrossover> CrossoverParameter {
    95106      get { return (ILookupParameter<ICrossover>)Parameters[CrossoverParameterName]; }
    96107    }
     108
    97109    public ILookupParameter<IManipulator> ManipulatorParameter {
    98110      get { return (ILookupParameter<IManipulator>)Parameters[ManipulatorParameterName]; }
     
    102114      get { return (ILookupParameter<ISolutionCreator>)Parameters[SolutionCreatorParameterName]; }
    103115    }
    104     #endregion
     116    #endregion parameter properties
    105117
    106118    #region properties
     
    108120      get { return BeforeCrossoverOperatorParameter.Value; }
    109121    }
     122
    110123    public ICrossoverOperator<T> AfterCrossoverOperator {
    111124      get { return AfterCrossoverOperatorParameter.Value; }
    112125    }
     126
    113127    public IManipulatorOperator<T> BeforeManipulatorOperator {
    114128      get { return BeforeManipulatorOperatorParameter.Value; }
    115129    }
     130
    116131    public IManipulatorOperator<T> AfterManipulatorOperator {
    117132      get { return AfterManipulatorOperatorParameter.Value; }
    118133    }
     134
    119135    public BoolValue EnableCrossoverTracking {
    120136      get { return EnableCrossoverTrackingParameter.Value; }
    121137    }
     138
    122139    public BoolValue EnableManipulatorTracking {
    123140      get { return EnableManipulatorTrackingParameter.Value; }
    124141    }
     142
    125143    public BoolValue EnableSolutionCreatorTracking {
    126144      get { return EnableSolutionCreatorTrackingParameter.Value; }
    127145    }
    128     #endregion
     146    #endregion properties
    129147
    130148    public GenealogyAnalyzer() {
     
    147165      Parameters.Add(new ValueParameter<IManipulatorOperator<T>>(BeforeManipulatorOperatorParameterName));
    148166      Parameters.Add(new ValueParameter<IManipulatorOperator<T>>(AfterManipulatorOperatorParameterName));
    149       #endregion
    150     }
     167      #endregion add parameters
     168    }
     169
    151170    public override IDeepCloneable Clone(Cloner cloner) {
    152171      return new GenealogyAnalyzer<T>(this, cloner);
    153172    }
     173
    154174    protected GenealogyAnalyzer(GenealogyAnalyzer<T> original, Cloner cloner)
    155175      : base(original, cloner) {
     
    276296          ExecutionContext.Scope.SubScopes[index].Variables["Id"].Value = new StringValue(v.Id);
    277297        }
    278         #endregion
    279 
    280         //        ComputeSuccessRatios(genealogyGraph);
     298        #endregion add elite in the graph and connect it with the previous elite
    281299      }
    282300      // update qualities
     
    285303        vertex.Quality = qualities[i].Value;
    286304      }
    287 
    288305      // remove extra graph nodes (added by the instrumented operators in the case of offspring selection)
    289306      var pop = new HashSet<T>(population);
     
    294311          var p = v.Parents.First();
    295312          if (p.Rank.Equals(generation - 0.5))
    296             // the individual was a product of mutation. since it wasn't selected, we must remove both it and its parent 
     313            // the individual was a product of mutation. since it wasn't selected, we must remove both it and its parent
    297314            // ("intermediate" vertex result of crossover)
    298315            discarded.Add(v.Parents.First());
     
    303320      return base.Apply();
    304321    }
    305 
    306     // for accurate statistics this method should be called before the discarded offspring are removed from the genealogy graph
    307     private void ComputeSuccessRatios(IGenealogyGraph<T> genealogyGraph) {
    308       const string successfulOffspringRatioTableHistoryName = "Successful offspring ratios history";
    309       const string successfulOffspringAbsoluteValuesTableHistoryName = "Successful offspring values history";
    310       const string successfulOffspringRatioHeatMapName = "Successful offspring ratios heatmap";
    311       const string successfulOffspringValuesHeatMapName = "Successful offspring values heatmap";
    312 
    313       var population = PopulationParameter.ActualValue;
    314       var generation = GenerationsParameter.ActualValue.Value;
    315       // compute the weight of each genealogy graph node as the ratio (produced offspring) / (surviving offspring)
    316       foreach (var ind in population) {
    317         var v = genealogyGraph.GetByContent(ind);
    318         if (v.Parents.Count() == 1) {
    319           var p = v.Parents.First();
    320           foreach (var pp in p.Parents)
    321             pp.Weight++;
    322         } else {
    323           foreach (var p in v.Parents) {
    324             p.Weight++;
    325           }
    326         }
    327       }
    328 
    329       var results = ResultsParameter.ActualValue;
    330 
    331       DataTableHistory successfulOffspringRatioHistory;
    332       DataTableHistory successfulOffspringAbsoluteHistory;
    333       if (!results.ContainsKey(successfulOffspringRatioTableHistoryName)) {
    334         successfulOffspringRatioHistory = new DataTableHistory();
    335         successfulOffspringAbsoluteHistory = new DataTableHistory();
    336         results.Add(new Result(successfulOffspringRatioTableHistoryName, successfulOffspringRatioHistory));
    337         results.Add(new Result(successfulOffspringAbsoluteValuesTableHistoryName, successfulOffspringAbsoluteHistory));
    338       } else {
    339         successfulOffspringRatioHistory = (DataTableHistory)results[successfulOffspringRatioTableHistoryName].Value;
    340         successfulOffspringAbsoluteHistory = (DataTableHistory)results[successfulOffspringAbsoluteValuesTableHistoryName].Value;
    341       }
    342       var successfulOffspringRatioTable = new DataTable();
    343       var successfulOffspringRatioRow = new DataRow("Successful Offspring Ratio") {
    344         VisualProperties = { ChartType = DataRowVisualProperties.DataRowChartType.Columns, StartIndexZero = true }
    345       };
    346       successfulOffspringRatioRow.Values.Replace(genealogyGraph.GetByRank(generation).OrderByDescending(x => x.Quality).Select(x => x.OutDegree > 0 ? x.Weight / x.OutDegree : 0));
    347       successfulOffspringRatioTable.Rows.Add(successfulOffspringRatioRow);
    348       successfulOffspringRatioHistory.Add(successfulOffspringRatioTable);
    349       // create heatmap
    350       double[,] ratios = new double[population.Length, successfulOffspringRatioHistory.Count];
    351       var ratiosHistoryList = successfulOffspringRatioHistory.AsReadOnly().ToList();
    352       for (int i = 0; i < ratiosHistoryList.Count; ++i) {
    353         var values = ratiosHistoryList[i].Rows.First().Values;
    354         for (int j = 0; j < values.Count; ++j) {
    355           ratios[j, i] = values[j];
    356         }
    357       }
    358       var successfulOffspringRatios = new HeatMap(ratios);
    359       if (!results.ContainsKey(successfulOffspringRatioHeatMapName)) {
    360         results.Add(new Result(successfulOffspringRatioHeatMapName, successfulOffspringRatios));
    361       } else {
    362         results[successfulOffspringRatioHeatMapName].Value = successfulOffspringRatios;
    363       }
    364 
    365       var successfulOffspringValuesTable = new DataTable();
    366       var successfulOffspringValuesRow = new DataRow("Successful Offspring Values") {
    367         VisualProperties = { ChartType = DataRowVisualProperties.DataRowChartType.Columns, StartIndexZero = true }
    368       };
    369       successfulOffspringValuesRow.Values.Replace(genealogyGraph.GetByRank(generation).OrderByDescending(x => x.Quality).Select(x => x.Weight));
    370       successfulOffspringValuesTable.Rows.Add(successfulOffspringValuesRow);
    371       successfulOffspringAbsoluteHistory.Add(successfulOffspringValuesTable);
    372       // create heatmap
    373       double min = 0, max = 0;
    374       double[,] elements = new double[population.Length, successfulOffspringAbsoluteHistory.Count];
    375       var absoluteHistoryList = successfulOffspringAbsoluteHistory.AsReadOnly().ToList();
    376       for (int i = 0; i < absoluteHistoryList.Count; ++i) {
    377         var values = absoluteHistoryList[i].Rows.First().Values;
    378         for (int j = 0; j < values.Count; ++j) {
    379           elements[j, i] = values[j];
    380           if (max < values[j])
    381             max = values[j];
    382           if (min > values[j])
    383             min = values[j];
    384         }
    385       }
    386       var heatmap = new HeatMap(elements);
    387       heatmap.Maximum = max;
    388       heatmap.Minimum = min;
    389       if (!results.ContainsKey(successfulOffspringValuesHeatMapName)) {
    390         results.Add(new Result(successfulOffspringValuesHeatMapName, heatmap));
    391       } else {
    392         results[successfulOffspringValuesHeatMapName].Value = heatmap;
    393       }
    394     }
    395322  }
    396323}
Note: See TracChangeset for help on using the changeset viewer.