Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
04/17/11 18:22:28 (13 years ago)
Author:
cneumuel
Message:

#1215

  • support for maximization problems
  • made base level algorithms stoppable
  • optimization for multiple goals possible (AverageQuality, AverageDeviation, AverageEvaluatedSolutions)
  • lots of fixes
File:
1 edited

Legend:

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

    r5653 r6018  
    22using System.Collections.Generic;
    33using System.Linq;
    4 using System.Text;
     4using HeuristicLab.Common;
     5using HeuristicLab.Core;
     6using HeuristicLab.Data;
    57using HeuristicLab.Operators;
     8using HeuristicLab.Optimization;
     9using HeuristicLab.Parameters;
    610using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    7 using HeuristicLab.Core;
    8 using HeuristicLab.Common;
    9 using HeuristicLab.Parameters;
    10 using HeuristicLab.Data;
    11 using HeuristicLab.Optimization;
    1211
    1312namespace HeuristicLab.Problems.MetaOptimization {
     
    3231      get { return (ILookupParameter<IItemList<IProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
    3332    }
    34     public LookupParameter<DoubleArray> ProblemQualityReferencesParameter {
    35       get { return (LookupParameter<DoubleArray>)Parameters["ProblemQualityReferences"]; }
     33    public LookupParameter<DoubleArray> ReferenceQualityAveragesParameter {
     34      get { return (LookupParameter<DoubleArray>)Parameters["ReferenceQualityAverages"]; }
     35    }
     36    public LookupParameter<DoubleArray> ReferenceQualityDeviationsParameter {
     37      get { return (LookupParameter<DoubleArray>)Parameters["ReferenceQualityDeviations"]; }
     38    }
     39    public LookupParameter<DoubleArray> ReferenceEvaluatedSolutionAveragesParameter {
     40      get { return (LookupParameter<DoubleArray>)Parameters["ReferenceEvaluatedSolutionAverages"]; }
    3641    }
    3742    public LookupParameter<ResultCollection> ResultsParameter {
     
    4752      get { return (ScopeTreeLookupParameter<IntValue>)Parameters["RepetitionIndex"]; }
    4853    }
     54    public LookupParameter<BoolValue> MaximizationParameter {
     55      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
     56    }
    4957    #endregion
    5058
     
    5866      Parameters.Add(new LookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", ""));
    5967      Parameters.Add(new LookupParameter<IItemList<IProblem>>(MetaOptimizationProblem.ProblemsParameterName, ""));
    60       Parameters.Add(new LookupParameter<DoubleArray>("ProblemQualityReferences", ""));
     68      Parameters.Add(new LookupParameter<DoubleArray>("ReferenceQualityAverages", ""));
     69      Parameters.Add(new LookupParameter<DoubleArray>("ReferenceQualityDeviations", ""));
     70      Parameters.Add(new LookupParameter<DoubleArray>("ReferenceEvaluatedSolutionAverages", ""));
    6171      Parameters.Add(new LookupParameter<ResultCollection>("Results", ""));
    6272      Parameters.Add(new ScopeTreeLookupParameter<IAlgorithm>("Algorithm", "The finished algorithms containing Runs."));
    6373      Parameters.Add(new ScopeTreeLookupParameter<IntValue>("ProblemIndex", "The index of the problem an algorithm was executed with."));
    6474      Parameters.Add(new ScopeTreeLookupParameter<IntValue>("RepetitionIndex", "The index of the repetition"));
     75      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "Set to false if the problem should be minimized."));
    6576    }
    6677    protected AlgorithmRunsAnalyzer(AlgorithmRunsAnalyzer original, Cloner cloner)
     
    7889      IEnumerable<string> parameterNames = parameterConfiguration.GetOptimizedParameterNames();
    7990      IItemList<IProblem> problems = ProblemsParameter.ActualValue;
     91      bool maximization = MaximizationParameter.ActualValue.Value;
    8092      int repetitions = RepetitionsParameter.ActualValue.Value;
    81       var resultNames = new List<string> { "BestQuality", "Execution Time" };
     93      var resultNames = new List<string> { "BestQuality", "Execution Time", "EvaluatedSolutions" };
    8294      int currentGeneration = GenerationsParameter.ActualValue != null ? GenerationsParameter.ActualValue.Value : 0;
    83       double[] referenceQualities = GetReferenceQualities(problems.Count);
     95      double[] referenceQualityAverages;
     96      double[] referenceQualityDeviations;
     97      double[] referenceEvaluatedSolutionAverages;
     98      GetReferenceValues(problems.Count, out referenceQualityAverages, out referenceQualityDeviations, out referenceEvaluatedSolutionAverages);
     99
    84100      ResultCollection results = ResultsParameter.ActualValue;
    85101
     
    88104        var qualities = new double[problems.Count][];
    89105        var executionTimes = new TimeSpan[problems.Count][];
     106        var evaluatedSolutions = new int[problems.Count][];
    90107
    91108        for (int i = 0; i < problems.Count; i++) {
    92109          qualities[i] = new double[repetitions];
     110          evaluatedSolutions[i] = new int[repetitions];
    93111          executionTimes[i] = new TimeSpan[repetitions];
    94112        }
     
    98116          int repetitionIndex = repetitionIndices[i].Value;
    99117
    100           IRun run = algorithms[i].Runs.First();
     118          IRun run = algorithms[i].Runs.Single();
    101119          MetaOptimizationUtil.ClearResults(run, resultNames);
    102120          MetaOptimizationUtil.ClearParameters(run, parameterNames);
     
    107125          qualities[problemIndex][repetitionIndex] = (((DoubleValue)run.Results["BestQuality"]).Value);
    108126          executionTimes[problemIndex][repetitionIndex] = (((TimeSpanValue)run.Results["Execution Time"]).Value);
     127          evaluatedSolutions[problemIndex][repetitionIndex] = (((IntValue)run.Results["EvaluatedSolutions"]).Value);
    109128          runs.Add((IRun)run.Clone());
    110129        }
    111130
    112131        parameterConfiguration.AverageExecutionTimes = new ItemList<TimeSpanValue>(executionTimes.Select(t => new TimeSpanValue(TimeSpan.FromMilliseconds(t.Average(ts => ts.TotalMilliseconds)))));
     132        parameterConfiguration.AverageEvaluatedSolutions = new DoubleArray(evaluatedSolutions.Select(x => x.Average()).ToArray());
    113133        parameterConfiguration.Repetitions = new IntValue(repetitions);
    114         parameterConfiguration.BestQualities = new DoubleArray(qualities.Select(q => q.Min()).ToArray()); // todo: respect Maximization:true/false
    115134        parameterConfiguration.AverageQualities = new DoubleArray(qualities.Select(q => q.Average()).ToArray());
    116         parameterConfiguration.WorstQualities = new DoubleArray(qualities.Select(q => q.Max()).ToArray()); // todo: respect Maximization:true/false
     135
     136        if(maximization)
     137          parameterConfiguration.BestQualities = new DoubleArray(qualities.Select(q => q.Max()).ToArray());
     138        else
     139          parameterConfiguration.BestQualities = new DoubleArray(qualities.Select(q => q.Min()).ToArray());
     140       
     141        if (maximization)
     142          parameterConfiguration.WorstQualities = new DoubleArray(qualities.Select(q => q.Min()).ToArray());
     143        else
     144          parameterConfiguration.WorstQualities = new DoubleArray(qualities.Select(q => q.Max()).ToArray());
     145
    117146        parameterConfiguration.QualityVariances = new DoubleArray(qualities.Select(q => q.Variance()).ToArray());
    118147        parameterConfiguration.QualityStandardDeviations = new DoubleArray(qualities.Select(q => q.StandardDeviation()).ToArray());
    119148        parameterConfiguration.Runs = runs;
    120149
    121         this.QualityParameter.ActualValue = new DoubleValue(MetaOptimizationUtil.NormalizeQualities(parameterConfiguration, referenceQualities));
     150        this.QualityParameter.ActualValue = new DoubleValue(MetaOptimizationUtil.Normalize(parameterConfiguration, referenceQualityAverages, referenceQualityDeviations, referenceEvaluatedSolutionAverages, 1, 1, 1, maximization));
    122151      } else {
    123152        // something terrible happened -> most probably due to invalid parameters.
    124153        // penalty with worst quality from latest generation!
    125154
    126         double penaltyValue = results.ContainsKey("CurrentWorstQuality") ? ((DoubleValue)results["CurrentWorstQuality"]).Value : referenceQualities.Max(); // todo: respect min/max
     155        double penaltyValue = results.ContainsKey("CurrentWorstQuality") ? ((DoubleValue)results["CurrentWorstQuality"]).Value : referenceQualityAverages.Max(); // todo: respect min/max
    127156        this.QualityParameter.ActualValue = new DoubleValue(penaltyValue);
    128157      }
     
    131160    }
    132161
    133     private double[] GetReferenceQualities(int problemsCount) {
    134       double[] referenceQualities;
    135       if (ProblemQualityReferencesParameter.ActualValue == null) {
     162    private void GetReferenceValues(int problemsCount, out double[] referenceQualityAverages, out double[] referenceQualityDeviations, out double[] referenceEvaluatedSolutionAverages) {
     163      if (ReferenceQualityAveragesParameter.ActualValue == null) {
    136164        // this is generation zero. no reference qualities for normalization have been calculated yet. in this special case the ReferenceQualityAnalyzer will do the normalization
    137         referenceQualities = new double[problemsCount];
    138         for (int i = 0; i < referenceQualities.Length; i++) {
    139           referenceQualities[i] = 1;
     165        referenceQualityAverages = new double[problemsCount];
     166        referenceQualityDeviations = new double[problemsCount];
     167        referenceEvaluatedSolutionAverages = new double[problemsCount];
     168        for (int i = 0; i < referenceQualityAverages.Length; i++) {
     169          referenceQualityAverages[i] = 1;
     170          referenceQualityDeviations[i] = 1;
     171          referenceEvaluatedSolutionAverages[i] = 1;
    140172        }
    141173      } else {
    142         referenceQualities = ProblemQualityReferencesParameter.ActualValue.ToArray();
     174        referenceQualityAverages = ReferenceQualityAveragesParameter.ActualValue.ToArray();
     175        referenceQualityDeviations = ReferenceQualityDeviationsParameter.ActualValue.ToArray();
     176        referenceEvaluatedSolutionAverages = ReferenceEvaluatedSolutionAveragesParameter.ActualValue.ToArray();
    143177      }
    144       return referenceQualities;
    145178    }
    146179  }
Note: See TracChangeset for help on using the changeset viewer.