Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
02/15/16 17:19:34 (8 years ago)
Author:
bwerth
Message:

#1087 regorganized testfunctions, added view for qualities

File:
1 edited

Legend:

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

    r13562 r13620  
    2121
    2222using System.Collections.Generic;
     23using System.Linq;
    2324using HeuristicLab.Core;
    24 using HeuristicLab.Encodings.RealVectorEncoding;
    2525
    26 namespace HeuristicLab.Problems.MultiObjectiveTestFunction {
     26namespace HeuristicLab.Problems.MultiObjectiveTestFunctions {
    2727
    2828  public class NonDominatedSelect {
     
    3030
    3131
    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();
    3434
    35       List<RealVector> front = new List<RealVector>();
    36       foreach (RealVector row in qualities) {
     35      List<double[]> front = new List<double[]>();
     36      foreach (double[] row in qualities) {
    3737        bool insert = true;
    3838        for (int i = 0; i < front.Count; i++) {
     
    4444        }
    4545        if (insert) {
    46           front.Add(new RealVector(row));
     46          front.Add(row);
    4747        }
    4848      }
    4949
    50       return front.ToArray();
     50      return front;
    5151    }
    5252
    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) {
    10054      //mkommend Caution: do not use LINQ.SequenceEqual for comparing the two quality arrays (left and right) due to performance reasons
    10155      if (dominateOnEqualQualities) {
Note: See TracChangeset for help on using the changeset viewer.