Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
06/24/16 15:03:51 (8 years ago)
Author:
bwerth
Message:

#1087 added more functions (IHR1-4, IHR6, CIGTAB, ELLI)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Analyzers/HypervolumeAnalyzer.cs

    r13771 r13936  
    2929using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    3030
    31 namespace HeuristicLab.Problems.MultiObjectiveTestFunctions {
    32   [StorableClass]
    33   [Item("GenerationalDistanceAnalyzer", "Computes the enclosed Hypervolume between the current front and a given reference Point")]
    34   public class HypervolumeAnalyzer : MOTFAnalyzer {
    35     [StorableHook(HookType.AfterDeserialization)]
    36     private void AfterDeserialization() {
     31namespace HeuristicLab.Problems.MultiObjectiveTestFunctions
     32{
     33    [StorableClass]
     34    [Item("GenerationalDistanceAnalyzer", "Computes the enclosed Hypervolume between the current front and a given reference Point")]
     35    public class HypervolumeAnalyzer : MOTFAnalyzer
     36    {
     37        [StorableHook(HookType.AfterDeserialization)]
     38        private void AfterDeserialization()
     39        {
     40        }
     41        [StorableConstructor]
     42        protected HypervolumeAnalyzer(bool deserializing) : base(deserializing) { }
     43        public HypervolumeAnalyzer(HypervolumeAnalyzer original, Cloner cloner) : base(original, cloner) { }
     44        public override IDeepCloneable Clone(Cloner cloner)
     45        {
     46            return new HypervolumeAnalyzer(this, cloner);
     47        }
     48
     49        public IValueParameter<DoubleArray> ReferencePointParameter
     50        {
     51            get
     52            {
     53                return (IValueParameter<DoubleArray>)Parameters["ReferencePoint"];
     54            }
     55        }
     56
     57        public IValueParameter<DoubleValue> BestKnownHyperVolumeParameter
     58        {
     59            get
     60            {
     61                return (IValueParameter<DoubleValue>)Parameters["BestKnownHyperVolume"];
     62            }
     63            set
     64            {
     65                Parameters["BestKnownHyperVolume"].ActualValue = value;
     66            }
     67        }
     68
     69        public HypervolumeAnalyzer()
     70        {
     71            Parameters.Add(new ValueParameter<DoubleArray>("ReferencePoint", "The reference point for hypervolume calculation"));
     72            Parameters.Add(new ValueParameter<DoubleValue>("BestKnownHyperVolume", "The currently best known hypervolume"));
     73        }
     74
     75        private void RegisterEventHandlers()
     76        {
     77            ReferencePointParameter.ValueChanged += ReferencePointParameterOnValueChanged;
     78        }
     79
     80        private void ReferencePointParameterOnValueChanged(object sender, EventArgs e)
     81        {
     82            BestKnownHyperVolumeParameter.Value = new DoubleValue(0);
     83        }
     84
     85        public override void Analyze(Individual[] individuals, double[][] qualities, ResultCollection results)
     86        {
     87            if (qualities == null || qualities.Length < 1) return;
     88            int objectives = qualities[0].Length;
     89            double best = BestKnownHyperVolumeParameter.Value.Value;
     90
     91            double diff;
     92
     93            if (!results.ContainsKey("Hypervolume")) results.Add(new Result("Hypervolume", typeof(DoubleValue)));
     94            IEnumerable<double[]> front = NonDominatedSelect.selectNonDominatedVectors(qualities, TestFunctionParameter.ActualValue.Maximization(objectives), true);
     95            if (!results.ContainsKey("BestKnownHypervolume")) results.Add(new Result("BestKnownHypervolume", typeof(DoubleValue)));
     96            else
     97            {
     98                DoubleValue dv = (DoubleValue)(results["BestKnownHypervolume"].Value);
     99                best = dv.Value;
     100            }
     101            if (!results.ContainsKey("Absolute Distance to BestKnownHypervolume")) results.Add(new Result("Absolute Distance to BestKnownHypervolume", typeof(DoubleValue)));
     102
     103            double hv = Double.NaN;
     104
     105            hv = Hypervolume.Calculate(front, TestFunctionParameter.ActualValue.ReferencePoint(objectives), TestFunctionParameter.ActualValue.Maximization(objectives));
     106
     107
     108            if (best < 0)
     109            {
     110                best = hv;
     111            }
     112            diff = best - hv;
     113            if (!Double.IsNaN(hv) && (diff < 0 || best < 0))
     114            {
     115                best = hv;
     116                diff = 0;
     117                BestKnownFrontParameter.ActualValue = new DoubleMatrix(MultiObjectiveTestFunctionProblem.To2D(qualities));
     118            }
     119
     120            results["Hypervolume"].Value = new DoubleValue(hv);
     121            results["Absolute Distance to BestKnownHypervolume"].Value = new DoubleValue(diff);
     122            results["BestKnownHypervolume"].Value = new DoubleValue(best);
     123
     124        }
    37125    }
    38     [StorableConstructor]
    39     protected HypervolumeAnalyzer(bool deserializing) : base(deserializing) { }
    40     public HypervolumeAnalyzer(HypervolumeAnalyzer original, Cloner cloner) : base(original, cloner) { }
    41     public override IDeepCloneable Clone(Cloner cloner) {
    42       return new HypervolumeAnalyzer(this, cloner);
    43     }
    44 
    45     public IValueParameter<DoubleArray> ReferencePointParameter {
    46       get {
    47         return (IValueParameter<DoubleArray>)Parameters["ReferencePoint"];
    48       }
    49     }
    50 
    51     public IValueParameter<DoubleValue> BestKnownHyperVolumeParameter {
    52       get {
    53         return (IValueParameter<DoubleValue>)Parameters["BestKnownHyperVolume"];
    54       }
    55       set {
    56         Parameters["BestKnownHyperVolume"].ActualValue = value;
    57       }
    58     }
    59 
    60     public HypervolumeAnalyzer() {
    61       Parameters.Add(new ValueParameter<DoubleArray>("ReferencePoint", "The reference point for hypervolume calculation"));
    62       Parameters.Add(new ValueParameter<DoubleValue>("BestKnownHyperVolume", "The currently best known hypervolume"));
    63     }
    64 
    65     private void RegisterEventHandlers() {
    66       ReferencePointParameter.ValueChanged += ReferencePointParameterOnValueChanged;
    67     }
    68 
    69     private void ReferencePointParameterOnValueChanged(object sender, EventArgs e) {
    70       BestKnownHyperVolumeParameter.Value = new DoubleValue(0);
    71     }
    72 
    73     public override void Analyze(Individual[] individuals, double[][] qualities, ResultCollection results) {
    74       if (qualities == null || qualities.Length < 1) return;
    75       int objectives = qualities[0].Length;
    76       double best = BestKnownHyperVolumeParameter.Value.Value;
    77 
    78       double diff;
    79 
    80       if (!results.ContainsKey("Hypervolume")) results.Add(new Result("Hypervolume", typeof(DoubleValue)));
    81       IEnumerable<double[]> front = NonDominatedSelect.selectNonDominatedVectors(qualities, TestFunctionParameter.ActualValue.Maximization(objectives), true);
    82       if (!results.ContainsKey("BestKnownHypervolume")) results.Add(new Result("BestKnownHypervolume", typeof(DoubleValue)));
    83       else {
    84         DoubleValue dv = (DoubleValue)(results["BestKnownHypervolume"].Value);
    85         best = dv.Value;
    86       }
    87       if (!results.ContainsKey("Absolute Distance to BestKnownHypervolume")) results.Add(new Result("Absolute Distance to BestKnownHypervolume", typeof(DoubleValue)));
    88 
    89       double hv = Double.NaN;
    90       try {
    91         if (objectives == 2) { //Hypervolume analysis only with 2 objectives for now
    92           hv = Hypervolume.Calculate(front, ReferencePointParameter.Value, TestFunctionParameter.ActualValue.Maximization(objectives));
    93         } else if (Array.TrueForAll(TestFunctionParameter.ActualValue.Maximization(objectives), x => !x)) {
    94           hv = MultiDimensionalHypervolume.Calculate(front, ReferencePointParameter.Value);
    95         }
    96       }
    97       catch (ArgumentException) {
    98 
    99       }
    100 
    101       if (best < 0) {
    102         best = hv;
    103       }
    104       diff = best - hv;
    105       if (!Double.IsNaN(hv) && (diff < 0 || best < 0)) {
    106         best = hv;
    107         diff = 0;
    108         BestKnownFrontParameter.ActualValue = new DoubleMatrix(MultiObjectiveTestFunctionProblem.To2D(qualities));
    109       }
    110 
    111       results["Hypervolume"].Value = new DoubleValue(hv);
    112       results["Absolute Distance to BestKnownHypervolume"].Value = new DoubleValue(diff);
    113       results["BestKnownHypervolume"].Value = new DoubleValue(best);
    114 
    115     }
    116   }
    117126}
Note: See TracChangeset for help on using the changeset viewer.