Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/ParameterConfigurationEvaluator.cs @ 5111

Last change on this file since 5111 was 5111, checked in by cneumuel, 13 years ago

#1215

  • improved exchangeability of crossover and mutation operators for parameter values
File size: 6.4 KB
Line 
1using System;
2using System.Linq;
3using System.Threading;
4using HeuristicLab.Common;
5using HeuristicLab.Core;
6using HeuristicLab.Data;
7using HeuristicLab.Operators;
8using HeuristicLab.Optimization;
9using HeuristicLab.Parameters;
10using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
11using System.Collections.Generic;
12
13namespace HeuristicLab.Problems.MetaOptimization {
14  /// <summary>
15  /// A base class for operators which evaluate TSP solutions.
16  /// </summary>
17  [Item("ParameterConfigurationEvaluator", "A base class for operators which evaluate Meta Optimization solutions.")]
18  [StorableClass]
19  public class ParameterConfigurationEvaluator : SingleSuccessorOperator, IParameterConfigurationEvaluator {
20    private bool algorithmStopped;
21
22    public ILookupParameter<DoubleValue> QualityParameter {
23      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
24    }
25    public ILookupParameter<EngineAlgorithm> AlgorithmParameter {
26      get { return (ILookupParameter<EngineAlgorithm>)Parameters[MetaOptimizationProblem.AlgorithmTypeParameterName]; }
27    }
28    public ILookupParameter<IItemList<ISingleObjectiveProblem>> ProblemsParameter {
29      get { return (ILookupParameter<IItemList<ISingleObjectiveProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
30    }
31    public ILookupParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
32      get { return (ILookupParameter<ParameterConfigurationTree>)Parameters["ParameterConfigurationTree"]; }
33    }
34    public LookupParameter<IntValue> RepetitionsParameter {
35      get { return (LookupParameter<IntValue>)Parameters[MetaOptimizationProblem.RepetitionsParameterName]; }
36    }
37
38    public IntValue Repetitions {
39      get { return RepetitionsParameter.ActualValue; }
40    }
41
42    public ParameterConfigurationEvaluator()
43      : base() {
44      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The evaluated quality of the ParameterVector."));
45      Parameters.Add(new LookupParameter<EngineAlgorithm>(MetaOptimizationProblem.AlgorithmTypeParameterName, "Missing description."));
46      Parameters.Add(new LookupParameter<IItemList<ISingleObjectiveProblem>>(MetaOptimizationProblem.ProblemsParameterName, "Missing description."));
47      Parameters.Add(new LookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", "Missing description."));
48      Parameters.Add(new LookupParameter<IntValue>(MetaOptimizationProblem.RepetitionsParameterName, "Number of evaluations on one problem."));
49    }
50
51    [StorableConstructor]
52    protected ParameterConfigurationEvaluator(bool deserializing) : base(deserializing) { }
53    protected ParameterConfigurationEvaluator(ParameterConfigurationEvaluator original, Cloner cloner)
54      : base(original, cloner) {
55      this.algorithmStopped = original.algorithmStopped;
56    }
57    public override IDeepCloneable Clone(Cloner cloner) {
58      return new ParameterConfigurationEvaluator(this, cloner);
59    }
60
61    public override IOperation Apply() {
62      EngineAlgorithm algorithm = AlgorithmParameter.ActualValue;
63      IItemList<ISingleObjectiveProblem> problems = ProblemsParameter.ActualValue;
64
65      // set parameters
66      ParameterConfigurationParameter.ActualValue.Parameterize(algorithm);
67      algorithm.Problem = problems.First();
68      algorithm.StoreAlgorithmInEachRun = false;
69
70      algorithmStopped = false;
71      algorithm.Stopped += new EventHandler(ActualValue_Stopped);
72
73      List<double> qualities = new List<double>();
74      List<TimeSpan> executionTimes = new List<TimeSpan>();
75      algorithm.Engine = new SequentialEngine.SequentialEngine();
76      algorithm.Prepare(true);
77
78      foreach (ISingleObjectiveProblem problem in problems) {
79        algorithm.Problem = problem;
80
81        for (int i = 0; i < Repetitions.Value; i++) {
82          algorithm.Prepare();
83          algorithm.Start();
84          while (!algorithmStopped) {
85            Thread.Sleep(200); // wait for algorithm to complete; do not rely on Algorithm.ExecutionState here, because change of ExecutionState happens before Run is added (which causes problems because Algorithm might get cloned when its started already)
86          }
87          qualities.Add(((DoubleValue)algorithm.Results["BestQuality"].Value).Value);
88          executionTimes.Add(algorithm.ExecutionTime);
89
90          // parameters will be stored in ParameterConfigurationTree anyway. they would be redundant in runs
91          algorithm.Runs.Last().Parameters.Clear();
92          // but keep the problem, since this differs in runs
93          algorithm.Runs.Last().Parameters.Add("Problem", problem);
94          algorithmStopped = false;
95        }
96
97      }
98
99
100      algorithm.Stopped -= new EventHandler(ActualValue_Stopped);
101      algorithm.Prepare();
102
103      qualities = qualities.OrderBy(x => x).ToList();  // todo: respect Maximization:true/false
104
105      ParameterConfigurationParameter.ActualValue.AverageExecutionTime = new TimeSpanValue(TimeSpan.FromMilliseconds(executionTimes.Average(t => t.TotalMilliseconds)));
106      ParameterConfigurationParameter.ActualValue.Repetitions = Repetitions;
107      ParameterConfigurationParameter.ActualValue.BestQuality = new DoubleValue(qualities.First());
108      ParameterConfigurationParameter.ActualValue.AverageQuality = new DoubleValue(qualities.Average());
109      ParameterConfigurationParameter.ActualValue.WorstQuality = new DoubleValue(qualities.Last());
110      ParameterConfigurationParameter.ActualValue.QualityVariance = new DoubleValue(qualities.Variance());
111      ParameterConfigurationParameter.ActualValue.QualityStandardDeviation = new DoubleValue(qualities.StandardDeviation());
112      ParameterConfigurationParameter.ActualValue.Runs = algorithm.Runs;
113
114      double quality = ParameterConfigurationParameter.ActualValue.AverageQuality.Value; // todo: also include other measures (executiontime, variance)
115      this.QualityParameter.ActualValue = new DoubleValue(quality);
116
117      return base.Apply();
118    }
119
120    public static double Variance(IEnumerable<double> source) {
121      double avg = source.Average();
122      double d = source.Aggregate(0.0, (total, next) => total += Math.Pow(next - avg, 2));
123      return d / (source.Count() - 1);
124    }
125
126    public static double StandardDeviation(IEnumerable<double> source) {
127      return Math.Sqrt(source.Variance());
128    }
129
130    void ActualValue_Stopped(object sender, EventArgs e) {
131      algorithmStopped = true;
132    }
133  }
134}
Note: See TracBrowser for help on using the repository browser.