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
Location:
branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/BestParameterConfigurationAnalyzer.cs

    r5576 r6018  
    77using HeuristicLab.Parameters;
    88using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    9 using System.Collections.Generic;
    10 using System;
    119
    1210namespace HeuristicLab.Problems.MetaOptimization {
     
    3937      get { return (LookupParameter<RunCollection>)Parameters["Population"]; }
    4038    }
    41     public LookupParameter<DoubleArray> ProblemQualityReferencesParameter {
    42       get { return (LookupParameter<DoubleArray>)Parameters["ProblemQualityReferences"]; }
    43     }
    4439    public LookupParameter<ConstrainedItemList<IProblem>> ProblemsParameter {
    4540      get { return (LookupParameter<ConstrainedItemList<IProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
     41    }
     42    public LookupParameter<BoolValue> MaximizationParameter {
     43      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
    4644    }
    4745
     
    5553      Parameters.Add(new LookupParameter<IRun>("BestKnownSolution", ""));
    5654      Parameters.Add(new LookupParameter<RunCollection>("Population", ""));
    57       Parameters.Add(new LookupParameter<DoubleArray>("ProblemQualityReferences", ""));
    5855      Parameters.Add(new LookupParameter<ConstrainedItemList<IProblem>>(MetaOptimizationProblem.ProblemsParameterName));
     56      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "Set to false if the problem should be minimized."));
    5957    }
    6058
     
    7169      DoubleValue bestKnownQuality = BestKnownQualityParameter.ActualValue;
    7270      ItemArray<ParameterConfigurationTree> parameterTrees = ParameterConfigurationParameter.ActualValue;
     71      bool maximization = MaximizationParameter.ActualValue.Value;
    7372
    74       int idxBest = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
     73      int idxBest;
     74      if (maximization)
     75        idxBest = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).Last().index;
     76      else
     77        idxBest = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
    7578
    7679      ParameterConfigurationTree best = (ParameterConfigurationTree)parameterTrees[idxBest];
     
    7982      best.CollectParameterValues(bestRun.Parameters);
    8083
    81       if (bestKnownQuality == null || qualities[idxBest].Value < bestKnownQuality.Value) { // todo: respect Maximization:true/false
     84      if (bestKnownQuality == null ||
     85        (!maximization && (qualities[idxBest].Value < bestKnownQuality.Value) ||
     86        (maximization && (qualities[idxBest].Value > bestKnownQuality.Value)))) {
    8287        BestKnownQualityParameter.ActualValue = new DoubleValue(qualities[idxBest].Value);
    8388
     
    96101      int i = 0;
    97102      RunCollection rc = new RunCollection();
    98       foreach (ParameterConfigurationTree pt in parameterTrees.OrderBy(x => x.AverageQualityNormalized)) { // todo: respect Maximization:true/false
     103      foreach (ParameterConfigurationTree pt in (maximization ? parameterTrees.OrderByDescending(x => x.Quality) : parameterTrees.OrderBy(x => x.Quality))) {
    99104        rc.Add(pt.ToRun(string.Format("Individual {0} ({1})", i, pt.ParameterInfoString)));
    100105        i++;
  • branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOBestSolutionHistoryAnalyzer.cs

    r5576 r6018  
    77using HeuristicLab.Parameters;
    88using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    9 using System.Collections.Generic;
    10 using System;
    11 using HeuristicLab.Analysis;
    129
    1310namespace HeuristicLab.Problems.MetaOptimization {
     
    3431      get { return (LookupParameter<IntValue>)Parameters["Generations"]; }
    3532    }
     33    public LookupParameter<BoolValue> MaximizationParameter {
     34      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
     35    }
    3636
    3737    public PMOBestSolutionHistoryAnalyzer()
     
    4242      Parameters.Add(new LookupParameter<ConstrainedItemList<IProblem>>(MetaOptimizationProblem.ProblemsParameterName));
    4343      Parameters.Add(new LookupParameter<IntValue>("Generations", ""));
     44      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "Set to false if the problem should be minimized."));
    4445    }
    4546
     
    5657      ItemArray<ParameterConfigurationTree> parameterTrees = ParameterConfigurationParameter.ActualValue;
    5758      int currentGeneration = GenerationsParameter.ActualValue.Value;
    58       int idxBest = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index; // todo: respect Min/Max
     59      bool maximization = MaximizationParameter.ActualValue.Value;
     60
     61      int idxBest;
     62      if (maximization)
     63        idxBest = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).Last().index;
     64      else
     65        idxBest = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
     66
    5967      ParameterConfigurationTree best = parameterTrees[idxBest];
    6068
  • branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOProblemQualitiesAnalyzer.cs

    r5576 r6018  
    11using System.Linq;
     2using HeuristicLab.Analysis;
    23using HeuristicLab.Common;
    34using HeuristicLab.Core;
     
    78using HeuristicLab.Parameters;
    89using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    9 using System.Collections.Generic;
    10 using System;
    11 using HeuristicLab.Analysis;
    1210
    1311namespace HeuristicLab.Problems.MetaOptimization {
     
    3129      get { return (LookupParameter<ConstrainedItemList<IProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
    3230    }
     31    public LookupParameter<BoolValue> MaximizationParameter {
     32      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
     33    }
    3334
    3435    public PMOProblemQualitiesAnalyzer()
     
    3839      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", ""));
    3940      Parameters.Add(new LookupParameter<ConstrainedItemList<IProblem>>(MetaOptimizationProblem.ProblemsParameterName));
     41      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "Set to false if the problem should be minimized."));
    4042    }
    4143
     
    5153      ResultCollection results = ResultsParameter.ActualValue;
    5254      ItemArray<ParameterConfigurationTree> parameterTrees = ParameterConfigurationParameter.ActualValue;
    53       int idxBest = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index; // todo: respect Min/Max
    54       int idxWorst = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).Last().index;
    55      
     55      bool maximization = MaximizationParameter.ActualValue.Value;
     56
     57      int idxBest ;
     58      int idxWorst;
     59      if (maximization) {
     60        idxBest = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).Last().index;
     61        idxWorst = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
     62      } else {
     63        idxBest = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
     64        idxWorst = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).Last().index;
     65      }
     66
    5667      int problemCount = ProblemsParameter.ActualValue.Count;
    5768
  • branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/ReferenceQualityAnalyzer.cs

    r5653 r6018  
    77using HeuristicLab.Parameters;
    88using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    9 using System.Collections.Generic;
    10 using System;
    119
    1210namespace HeuristicLab.Problems.MetaOptimization {
     
    1715  [StorableClass]
    1816  public sealed class ReferenceQualityAnalyzer : SingleSuccessorOperator, IAnalyzer {
    19    
     17
    2018    public ValueLookupParameter<ResultCollection> ResultsParameter {
    2119      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
     
    2725      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
    2826    }
    29     public LookupParameter<DoubleArray> ProblemQualityReferenceParameter {
    30       get { return (LookupParameter<DoubleArray>)Parameters["ProblemQualityReferences"]; }
     27    public LookupParameter<DoubleArray> ReferenceQualityAveragesParameter {
     28      get { return (LookupParameter<DoubleArray>)Parameters["ReferenceQualityAverages"]; }
     29    }
     30    public LookupParameter<DoubleArray> ReferenceQualityDeviationsParameter {
     31      get { return (LookupParameter<DoubleArray>)Parameters["ReferenceQualityDeviations"]; }
     32    }
     33    public LookupParameter<DoubleArray> ReferenceEvaluatedSolutionAveragesParameter {
     34      get { return (LookupParameter<DoubleArray>)Parameters["ReferenceEvaluatedSolutionAverages"]; }
    3135    }
    3236    public LookupParameter<ConstrainedItemList<IProblem>> ProblemsParameter {
    3337      get { return (LookupParameter<ConstrainedItemList<IProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
     38    }
     39    public LookupParameter<BoolValue> MaximizationParameter {
     40      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
    3441    }
    3542
     
    3946      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", ""));
    4047      Parameters.Add(new ScopeTreeLookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", ""));
    41       Parameters.Add(new LookupParameter<DoubleArray>("ProblemQualityReferences", ""));
     48      Parameters.Add(new LookupParameter<DoubleArray>("ReferenceQualityAverages", ""));
     49      Parameters.Add(new LookupParameter<DoubleArray>("ReferenceQualityDeviations", ""));
     50      Parameters.Add(new LookupParameter<DoubleArray>("ReferenceEvaluatedSolutionAverages", ""));
    4251      Parameters.Add(new LookupParameter<ConstrainedItemList<IProblem>>(MetaOptimizationProblem.ProblemsParameterName, ""));
     52      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "Set to false if the problem should be minimized."));
    4353    }
    4454
     
    5464      ItemArray<ParameterConfigurationTree> solutions = ParameterConfigurationParameter.ActualValue;
    5565      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
     66      bool maximization = MaximizationParameter.ActualValue.Value;
    5667
    57       if (ProblemQualityReferenceParameter.ActualValue == null) {
    58         DoubleArray referenceQualities = CalculateReferenceQualities(solutions);
    59         ProblemQualityReferenceParameter.ActualValue = referenceQualities;
    60         NormalizePopulation(solutions, qualities, referenceQualities);
    61         results.Add(new Result("QualityReferences", referenceQualities));
     68      if (ReferenceQualityAveragesParameter.ActualValue == null) {
     69        // this is generation zero. calculate the reference values and apply them on population. in future generations `AlgorithmRunsAnalyzer` will do the nomalization
     70        DoubleArray referenceQualityAverages = CalculateReferenceQualityAverages(solutions, maximization);
     71        DoubleArray referenceQualityDeviations = CalculateReferenceQualityDeviations(solutions, maximization);
     72        DoubleArray referenceEvaluatedSolutionAverages = CalculateReferenceEvaluatedSolutionAverages(solutions, maximization);
     73
     74        ReferenceQualityAveragesParameter.ActualValue = referenceQualityAverages;
     75        ReferenceQualityDeviationsParameter.ActualValue = referenceQualityDeviations;
     76        ReferenceEvaluatedSolutionAveragesParameter.ActualValue = referenceEvaluatedSolutionAverages;
     77
     78        NormalizePopulation(solutions, qualities, referenceQualityAverages, referenceQualityDeviations, referenceEvaluatedSolutionAverages, 1, 1, 1, maximization);
     79
     80        results.Add(new Result("ReferenceQualities", referenceQualityAverages));
     81        results.Add(new Result("ReferenceQualityDeviations", referenceQualityDeviations));
     82        results.Add(new Result("ReferenceEvaluatedSolutionAverages", referenceEvaluatedSolutionAverages));
    6283      }
    6384
     
    6586    }
    6687
    67     private DoubleArray CalculateReferenceQualities(ItemArray<ParameterConfigurationTree> solutions) {
    68       DoubleArray referenceQualities = new DoubleArray(ProblemsParameter.ActualValue.Count);
     88    private DoubleArray CalculateReferenceQualityAverages(ItemArray<ParameterConfigurationTree> solutions, bool maximization) {
     89      DoubleArray references = new DoubleArray(ProblemsParameter.ActualValue.Count);
    6990      for (int pi = 0; pi < ProblemsParameter.ActualValue.Count; pi++) {
    70         referenceQualities[pi] = solutions.Where(x => x.AverageQualities != null).Select(x => x.AverageQualities[pi]).Min(); // todo: respect minimization / maximization
     91        if (maximization)
     92          references[pi] = solutions.Where(x => x.AverageQualities != null).Select(x => x.AverageQualities[pi]).Max();
     93        else
     94          references[pi] = solutions.Where(x => x.AverageQualities != null).Select(x => x.AverageQualities[pi]).Min();
    7195      }
    72       return referenceQualities;
     96      return references;
    7397    }
    7498
    75     private void NormalizePopulation(ItemArray<ParameterConfigurationTree> solutions, ItemArray<DoubleValue> qualities, DoubleArray referenceQualities) {
     99    private DoubleArray CalculateReferenceQualityDeviations(ItemArray<ParameterConfigurationTree> solutions, bool maximization) {
     100      DoubleArray references = new DoubleArray(ProblemsParameter.ActualValue.Count);
     101      for (int pi = 0; pi < ProblemsParameter.ActualValue.Count; pi++) {
     102        if (maximization)
     103          references[pi] = solutions.Where(x => x.QualityStandardDeviations != null).Select(x => x.QualityStandardDeviations[pi]).Max();
     104        else
     105          references[pi] = solutions.Where(x => x.QualityStandardDeviations != null).Select(x => x.QualityStandardDeviations[pi]).Min();
     106      }
     107      return references;
     108    }
     109
     110    private DoubleArray CalculateReferenceEvaluatedSolutionAverages(ItemArray<ParameterConfigurationTree> solutions, bool maximization) {
     111      DoubleArray references = new DoubleArray(ProblemsParameter.ActualValue.Count);
     112      for (int pi = 0; pi < ProblemsParameter.ActualValue.Count; pi++) {
     113        if (maximization)
     114          references[pi] = solutions.Where(x => x.AverageEvaluatedSolutions != null).Select(x => x.AverageEvaluatedSolutions[pi]).Max();
     115        else
     116          references[pi] = solutions.Where(x => x.AverageEvaluatedSolutions != null).Select(x => x.AverageEvaluatedSolutions[pi]).Min();
     117      }
     118      return references;
     119    }
     120
     121    private void NormalizePopulation(ItemArray<ParameterConfigurationTree> solutions, ItemArray<DoubleValue> qualities,
     122          DoubleArray referenceQualityAverages,
     123          DoubleArray referenceQualityDeviations,
     124          DoubleArray referenceEvaluatedSolutionAverages,
     125          double qualityAveragesWeight,
     126          double qualityDeviationsWeight,
     127          double evaluatedSolutionsWeight,
     128          bool maximization) {
    76129      for (int i = 0; i < solutions.Length; i++) {
    77         qualities[i].Value = MetaOptimizationUtil.NormalizeQualities(solutions[i], referenceQualities.ToArray());
     130        if (solutions[i].AverageQualities == null || solutions[i].QualityStandardDeviations == null || solutions[i].AverageEvaluatedSolutions == null) {
     131          // this parameterConfigurationTree has not been evaluated correctly (due to a faulty configuration, which led to an exception)
     132          // since we are in generation zero, there is no WorstQuality available for a penalty value
     133          double penaltyValue = maximization ? double.MinValue : double.MaxValue;
     134          qualities[i].Value = penaltyValue;
     135        } else {
     136          qualities[i].Value = MetaOptimizationUtil.Normalize(solutions[i],
     137            referenceQualityAverages.ToArray(),
     138            referenceQualityDeviations.ToArray(),
     139            referenceEvaluatedSolutionAverages.ToArray(),
     140            qualityAveragesWeight,
     141            qualityDeviationsWeight,
     142            evaluatedSolutionsWeight,
     143            maximization);
     144        }
    78145      }
    79146    }
  • branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/SolutionCacheAnalyzer.cs

    r5359 r6018  
    77using HeuristicLab.Parameters;
    88using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    9 using System.Collections.Generic;
    10 using System;
    119
    1210namespace HeuristicLab.Problems.MetaOptimization {
     
    2725      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
    2826    }
    29     public LookupParameter<DoubleArray> ProblemQualityReferenceParameter {
    30       get { return (LookupParameter<DoubleArray>)Parameters["ProblemQualityReferences"]; }
    31     }
    3227    public LookupParameter<ConstrainedItemList<IProblem>> ProblemsParameter {
    3328      get { return (LookupParameter<ConstrainedItemList<IProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
     
    4540      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", ""));
    4641      Parameters.Add(new ScopeTreeLookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", ""));
    47       Parameters.Add(new LookupParameter<DoubleArray>("ProblemQualityReferences", ""));
    4842      Parameters.Add(new LookupParameter<ConstrainedItemList<IProblem>>(MetaOptimizationProblem.ProblemsParameterName, ""));
    4943      Parameters.Add(new LookupParameter<IntValue>("Generations", ""));
Note: See TracChangeset for help on using the changeset viewer.