Changeset 13620 for branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/NonDominatedSelect.cs
- Timestamp:
- 02/15/16 17:19:34 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/NonDominatedSelect.cs
r13562 r13620 21 21 22 22 using System.Collections.Generic; 23 using System.Linq; 23 24 using HeuristicLab.Core; 24 using HeuristicLab.Encodings.RealVectorEncoding;25 25 26 namespace HeuristicLab.Problems.MultiObjectiveTestFunction {26 namespace HeuristicLab.Problems.MultiObjectiveTestFunctions { 27 27 28 28 public class NonDominatedSelect { … … 30 30 31 31 32 public static RealVector[] selectNonDominatedVectors(RealVector[]qualities, bool[] maximization, bool dominateOnEqualQualities) {33 int populationSize = qualities. Length;32 public static IEnumerable<double[]> selectNonDominatedVectors(IEnumerable<double[]> qualities, bool[] maximization, bool dominateOnEqualQualities) { 33 int populationSize = qualities.Count(); 34 34 35 List< RealVector> front = new List<RealVector>();36 foreach ( RealVectorrow in qualities) {35 List<double[]> front = new List<double[]>(); 36 foreach (double[] row in qualities) { 37 37 bool insert = true; 38 38 for (int i = 0; i < front.Count; i++) { … … 44 44 } 45 45 if (insert) { 46 front.Add( new RealVector(row));46 front.Add(row); 47 47 } 48 48 } 49 49 50 return front .ToArray();50 return front; 51 51 } 52 52 53 public static RealVector[] selectNonDominatedRows(double[][] qualities, bool[] maximization, bool dominateOnEqualQualities) { 54 int populationSize = qualities.Length; 55 56 List<RealVector> front = new List<RealVector>(); 57 foreach (double[] row in qualities) { 58 bool insert = true; 59 for (int i = 0; i < front.Count; i++) { 60 DominationResult res = Dominates(front[i], row, maximization, dominateOnEqualQualities); 61 if (res == DominationResult.Dominates) { insert = false; break; } //Vector domiates Row 62 else if (res == DominationResult.IsDominated) { //Row dominates Vector 63 front.RemoveRange(i, 1); 64 } 65 } 66 if (insert) { 67 front.Add(new RealVector(row)); 68 } 69 } 70 71 return front.ToArray(); 72 } 73 74 private static DominationResult Dominates(RealVector left, double[] right, bool[] maximizations, bool dominateOnEqualQualities) { 75 //mkommend Caution: do not use LINQ.SequenceEqual for comparing the two quality arrays (left and right) due to performance reasons 76 if (dominateOnEqualQualities) { 77 var equal = true; 78 for (int i = 0; i < left.Length; i++) { 79 if (left[i] != right[i]) { 80 equal = false; 81 break; 82 } 83 } 84 if (equal) return DominationResult.Dominates; 85 } 86 87 bool leftIsBetter = false, rightIsBetter = false; 88 for (int i = 0; i < left.Length; i++) { 89 if (IsDominated(left[i], right[i], maximizations[i])) rightIsBetter = true; 90 else if (IsDominated(right[i], left[i], maximizations[i])) leftIsBetter = true; 91 if (leftIsBetter && rightIsBetter) break; 92 } 93 94 if (leftIsBetter && !rightIsBetter) return DominationResult.Dominates; 95 if (!leftIsBetter && rightIsBetter) return DominationResult.IsDominated; 96 return DominationResult.IsNonDominated; 97 } 98 99 private static DominationResult Dominates(RealVector left, RealVector right, bool[] maximizations, bool dominateOnEqualQualities) { 53 private static DominationResult Dominates(double[] left, double[] right, bool[] maximizations, bool dominateOnEqualQualities) { 100 54 //mkommend Caution: do not use LINQ.SequenceEqual for comparing the two quality arrays (left and right) due to performance reasons 101 55 if (dominateOnEqualQualities) {
Note: See TracChangeset
for help on using the changeset viewer.