Changeset 13936 for branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Analyzers/HypervolumeAnalyzer.cs
- Timestamp:
- 06/24/16 15:03:51 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Analyzers/HypervolumeAnalyzer.cs
r13771 r13936 29 29 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 30 30 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() { 31 namespace 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 } 37 125 } 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 now92 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 }117 126 }
Note: See TracChangeset
for help on using the changeset viewer.