Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/NonDominatedSelect.cs @ 13562

Last change on this file since 13562 was 13562, checked in by bwerth, 8 years ago

#1087 added more unittests and comments

File size: 5.3 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System.Collections.Generic;
23using HeuristicLab.Core;
24using HeuristicLab.Encodings.RealVectorEncoding;
25
26namespace HeuristicLab.Problems.MultiObjectiveTestFunction {
27
28  public class NonDominatedSelect {
29    private enum DominationResult { Dominates, IsDominated, IsNonDominated };
30
31
32    public static RealVector[] selectNonDominatedVectors(RealVector[] qualities, bool[] maximization, bool dominateOnEqualQualities) {
33      int populationSize = qualities.Length;
34
35      List<RealVector> front = new List<RealVector>();
36      foreach (RealVector row in qualities) {
37        bool insert = true;
38        for (int i = 0; i < front.Count; i++) {
39          DominationResult res = Dominates(front[i], row, maximization, dominateOnEqualQualities);
40          if (res == DominationResult.Dominates) { insert = false; break; }           //Vector domiates Row
41          else if (res == DominationResult.IsDominated) {   //Row dominates Vector
42            front.RemoveRange(i, 1);
43          }
44        }
45        if (insert) {
46          front.Add(new RealVector(row));
47        }
48      }
49
50      return front.ToArray();
51    }
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) {
100      //mkommend Caution: do not use LINQ.SequenceEqual for comparing the two quality arrays (left and right) due to performance reasons
101      if (dominateOnEqualQualities) {
102        var equal = true;
103        for (int i = 0; i < left.Length; i++) {
104          if (left[i] != right[i]) {
105            equal = false;
106            break;
107          }
108        }
109        if (equal) return DominationResult.Dominates;
110      }
111
112      bool leftIsBetter = false, rightIsBetter = false;
113      for (int i = 0; i < left.Length; i++) {
114        if (IsDominated(left[i], right[i], maximizations[i])) rightIsBetter = true;
115        else if (IsDominated(right[i], left[i], maximizations[i])) leftIsBetter = true;
116        if (leftIsBetter && rightIsBetter) break;
117      }
118
119      if (leftIsBetter && !rightIsBetter) return DominationResult.Dominates;
120      if (!leftIsBetter && rightIsBetter) return DominationResult.IsDominated;
121      return DominationResult.IsNonDominated;
122    }
123
124    private static bool IsDominated(double left, double right, bool maximization) {
125      return maximization && left < right
126        || !maximization && left > right;
127    }
128
129    private static void AddToFront(IScope p, List<ScopeList> fronts, int i) {
130      if (i == fronts.Count) fronts.Add(new ScopeList());
131      fronts[i].Add(p);
132    }
133
134  }
135}
Note: See TracBrowser for help on using the repository browser.