Changeset 16171 for branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/NonDominatedSelect.cs
- Timestamp:
- 09/21/18 09:18:49 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/NonDominatedSelect.cs
r15583 r16171 25 25 26 26 public static class NonDominatedSelect { 27 public enum DominationResult { Dominates, IsDominated, IsNonDominated }; 28 29 public static IEnumerable<double[]> SelectNonDominatedVectors(IEnumerable<double[]> qualities, bool[] maximization, bool dominateOnEqualQualities) { 30 31 List<double[]> front = new List<double[]>(); 32 foreach (double[] row in qualities) { 33 bool insert = true; 34 for (int i = 0; i < front.Count; i++) { 35 DominationResult res = Dominates(front[i], row, maximization, dominateOnEqualQualities); 36 if (res == DominationResult.Dominates) { insert = false; break; } //Vector domiates Row 37 else if (res == DominationResult.IsDominated) { //Row dominates Vector 38 front.RemoveAt(i); 39 } 40 } 41 if (insert) { 42 front.Add(row); 43 } 44 } 45 46 return front; 47 } 48 49 public static IEnumerable<double[]> GetDominatingVectors(IEnumerable<double[]> qualities, double[] reference, bool[] maximization, bool dominateOnEqualQualities) { 50 List<double[]> front = new List<double[]>(); 51 foreach (double[] vec in qualities) { 52 if (Dominates(vec, reference, maximization, dominateOnEqualQualities) == DominationResult.Dominates) { 53 front.Add(vec); 54 } 55 } 56 return front; 57 } 58 59 public static DominationResult Dominates(double[] left, double[] right, bool[] maximizations, bool dominateOnEqualQualities) { 60 //mkommend Caution: do not use LINQ.SequenceEqual for comparing the two quality arrays (left and right) due to performance reasons 61 if (dominateOnEqualQualities) { 62 var equal = true; 63 for (int i = 0; i < left.Length; i++) { 64 if (left[i] != right[i]) { 65 equal = false; 66 break; 67 } 68 } 69 if (equal) return DominationResult.Dominates; 70 } 71 72 bool leftIsBetter = false, rightIsBetter = false; 73 for (int i = 0; i < left.Length; i++) { 74 if (IsDominated(left[i], right[i], maximizations[i])) rightIsBetter = true; 75 else if (IsDominated(right[i], left[i], maximizations[i])) leftIsBetter = true; 76 if (leftIsBetter && rightIsBetter) break; 77 } 78 79 if (leftIsBetter && !rightIsBetter) return DominationResult.Dominates; 80 if (!leftIsBetter && rightIsBetter) return DominationResult.IsDominated; 81 return DominationResult.IsNonDominated; 82 } 83 84 private static bool IsDominated(double left, double right, bool maximization) { 85 return maximization && left < right 86 || !maximization && left > right; 87 } 88 27 89 28 } 90 29 }
Note: See TracChangeset
for help on using the changeset viewer.