Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
09/21/18 09:18:49 (6 years ago)
Author:
bwerth
Message:

#2943 worked on MOBasicProblem - added Interfaces;reworked MOCalculators; several minor changes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/NonDominatedSelect.cs

    r15583 r16171  
    2525
    2626  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   
    8928  }
    9029}
Note: See TracChangeset for help on using the changeset viewer.