Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
01/05/11 02:03:20 (14 years ago)
Author:
cneumuel
Message:

#1215

  • added normalization for quality values of individuals
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/ParameterConfigurationEvaluator.cs

    r5207 r5212  
    4040    }
    4141
     42    public LookupParameter<DoubleArray> ProblemQualityMediansParameter {
     43      get { return (LookupParameter<DoubleArray>)Parameters["ProblemQualityMedians"]; }
     44    }
     45
    4246    public IntValue Repetitions {
    4347      get { return RepetitionsParameter.ActualValue; }
     
    5155      Parameters.Add(new LookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", "Missing description."));
    5256      Parameters.Add(new LookupParameter<IntValue>(MetaOptimizationProblem.RepetitionsParameterName, "Number of evaluations on one problem."));
     57      Parameters.Add(new LookupParameter<DoubleArray>("ProblemQualityMedians", ""));
    5358    }
    5459
     
    6671      IItemList<ISingleObjectiveProblem> problems = ProblemsParameter.ActualValue;
    6772
     73      double[] medians;
     74      if (ProblemQualityMediansParameter.ActualValue == null) {
     75        // this is generation zero. no reference qualities for scaling have been calculated yet. calculate a random individuum to get reference values
     76        medians = new double[problems.Count]; // todo
     77        for (int i = 0; i < medians.Length; i++) {
     78          medians[i] = 10;
     79        }
     80      } else {
     81        medians = ProblemQualityMediansParameter.ActualValue.ToArray();
     82      }
     83
    6884      // set parameters
    6985      ParameterConfigurationParameter.ActualValue.Parameterize(algorithm);
    7086      algorithm.StoreAlgorithmInEachRun = false;
    7187
    72       List<double> qualities = new List<double>();
    73       List<TimeSpan> executionTimes = new List<TimeSpan>();
     88      List<List<double>> qualities = new List<List<double>>();
     89      List<List<TimeSpan>> executionTimes = new List<List<TimeSpan>>();
    7490      algorithm.Engine = new SequentialEngine.SequentialEngine();
    7591      algorithm.Prepare(true);
     
    7793      foreach (ISingleObjectiveProblem problem in problems) {
    7894        algorithm.Problem = (IProblem)problem.Clone();
     95        var problemQualities = new List<double>();
     96        var problemExecutionTimes = new List<TimeSpan>();
    7997
    8098        for (int i = 0; i < Repetitions.Value; i++) {
     
    86104          if (algorithm.ExecutionState == ExecutionState.Paused) {
    87105            // this parametercombination was bad. set penalty for this solution
    88             qualities.Add(PenaltyQuality); // todo: respect Maximization; problem: this messes up average value; solution: use currently worst quality*2
    89             executionTimes.Add(algorithm.ExecutionTime);
     106            problemQualities.Add(PenaltyQuality); // todo: respect Maximization; problem: this messes up average value; solution: use currently worst quality*2
     107            problemExecutionTimes.Add(algorithm.ExecutionTime);
    90108          } else {
    91             qualities.Add(((DoubleValue)algorithm.Results["BestQuality"].Value).Value);
    92             executionTimes.Add(algorithm.ExecutionTime);
     109            problemQualities.Add(((DoubleValue)algorithm.Results["BestQuality"].Value).Value);
     110            problemExecutionTimes.Add(algorithm.ExecutionTime);
    93111
    94112            // parameters will be stored in ParameterConfigurationTree anyway. they would be redundant in runs
     
    98116          }
    99117        }
     118        qualities.Add(problemQualities);
     119        executionTimes.Add(problemExecutionTimes);
    100120      }
    101121      algorithm.Prepare();
    102122
    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)));
     123      ParameterConfigurationParameter.ActualValue.AverageExecutionTimes = new ItemList<TimeSpanValue>(executionTimes.Select(t => new TimeSpanValue(TimeSpan.FromMilliseconds(t.Average(ts => ts.TotalMilliseconds)))));
    106124      ParameterConfigurationParameter.ActualValue.Repetitions = (IntValue)Repetitions.Clone();
    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());
     125      ParameterConfigurationParameter.ActualValue.BestQualities = new DoubleArray(qualities.Select(q => q.Min()).ToArray()); // todo: respect Maximization:true/false
     126      ParameterConfigurationParameter.ActualValue.AverageQualities = new DoubleArray(qualities.Select(q => q.Average()).ToArray());
     127      ParameterConfigurationParameter.ActualValue.WorstQualities = new DoubleArray(qualities.Select(q => q.Max()).ToArray()); // todo: respect Maximization:true/false
     128      ParameterConfigurationParameter.ActualValue.QualityVariances = new DoubleArray(qualities.Select(q => q.Variance()).ToArray());
     129      ParameterConfigurationParameter.ActualValue.QualityStandardDeviations = new DoubleArray(qualities.Select(q => q.StandardDeviation()).ToArray());
    112130      ParameterConfigurationParameter.ActualValue.Runs = (RunCollection)algorithm.Runs.Clone();
    113131
    114       double quality = ParameterConfigurationParameter.ActualValue.AverageQuality.Value; // todo: also include other measures (executiontime, variance)
    115       this.QualityParameter.ActualValue = new DoubleValue(quality);
     132      // normalize qualities
     133      double[] qualitiesNormalized = new double[problems.Count];
     134      for (int i = 0; i < problems.Count; i++) {
     135        qualitiesNormalized[i] = qualities[i].Average() / medians[i];
     136      }
     137      ParameterConfigurationParameter.ActualValue.QualitiesNormalized = new DoubleArray(qualitiesNormalized);
     138      ParameterConfigurationParameter.ActualValue.AverageQualityNormalized = new DoubleValue(qualitiesNormalized.Average());
     139
     140      this.QualityParameter.ActualValue = ParameterConfigurationParameter.ActualValue.AverageQualityNormalized;
    116141
    117142      return base.Apply();
     
    129154  }
    130155
     156  /// <summary>
     157  /// Can execute an algorithm synchronously
     158  /// </summary>
    131159  public class AlgorithmExecutor {
    132160    private EngineAlgorithm algorithm;
Note: See TracChangeset for help on using the changeset viewer.