Changeset 16171 for branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Optimization/3.3/MultiObjective/DominationCalculator.cs
- Timestamp:
- 09/21/18 09:18:49 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Optimization/3.3/MultiObjective/DominationCalculator.cs
r15583 r16171 24 24 25 25 namespace HeuristicLab.Optimization { 26 26 27 public enum DominationResult { Dominates, IsDominated, IsNonDominated }; 27 28 28 public static class DominationCalculator <T>{29 public static class DominationCalculator { 29 30 /// <summary> 30 31 /// Calculates the best pareto front only. The fast non-dominated sorting algorithm is used … … 43 44 /// <param name="dominateOnEqualQualities">Whether solutions of exactly equal quality should dominate one another.</param> 44 45 /// <returns>The pareto front containing the best solutions and their associated quality resp. fitness.</returns> 45 public static List<Tuple<T, double[]>> CalculateBestParetoFront (T[] solutions, double[][] qualities, bool[] maximization, bool dominateOnEqualQualities = true) {46 intpopulationSize = solutions.Length;46 public static List<Tuple<T, double[]>> CalculateBestParetoFront<T>(T[] solutions, double[][] qualities, bool[] maximization, bool dominateOnEqualQualities = true) { 47 var populationSize = solutions.Length; 47 48 48 49 Dictionary<T, List<int>> dominatedIndividuals; … … 69 70 /// <param name="dominateOnEqualQualities">Whether solutions of exactly equal quality should dominate one another.</param> 70 71 /// <returns>A sorted list of the pareto fronts from best to worst.</returns> 71 public static List<List<Tuple<T, double[]>>> CalculateAllParetoFronts (T[] solutions, double[][] qualities, bool[] maximization, out int[] rank, bool dominateOnEqualQualities = true) {72 intpopulationSize = solutions.Length;72 public static List<List<Tuple<T, double[]>>> CalculateAllParetoFronts<T>(T[] solutions, double[][] qualities, bool[] maximization, out int[] rank, bool dominateOnEqualQualities = true) { 73 var populationSize = solutions.Length; 73 74 74 75 Dictionary<T, List<int>> dominatedIndividuals; … … 76 77 var fronts = new List<List<Tuple<T, double[]>>>(); 77 78 fronts.Add(CalculateBestFront(solutions, qualities, maximization, dominateOnEqualQualities, populationSize, out dominatedIndividuals, out dominationCounter, out rank)); 78 inti = 0;79 var i = 0; 79 80 while (i < fronts.Count && fronts[i].Count > 0) { 80 81 var nextFront = new List<Tuple<T, double[]>>(); … … 82 83 List<int> dominatedIndividualsByp; 83 84 if (dominatedIndividuals.TryGetValue(p.Item1, out dominatedIndividualsByp)) { 84 for ( intk = 0; k < dominatedIndividualsByp.Count; k++) {85 intdominatedIndividual = dominatedIndividualsByp[k];85 for (var k = 0; k < dominatedIndividualsByp.Count; k++) { 86 var dominatedIndividual = dominatedIndividualsByp[k]; 86 87 dominationCounter[dominatedIndividual] -= 1; 87 88 if (dominationCounter[dominatedIndividual] == 0) { … … 98 99 } 99 100 100 private static List<Tuple<T, double[]>> CalculateBestFront (T[] solutions, double[][] qualities, bool[] maximization, bool dominateOnEqualQualities, int populationSize, out Dictionary<T, List<int>> dominatedIndividuals, out int[] dominationCounter, out int[] rank) {101 private static List<Tuple<T, double[]>> CalculateBestFront<T>(T[] solutions, double[][] qualities, bool[] maximization, bool dominateOnEqualQualities, int populationSize, out Dictionary<T, List<int>> dominatedIndividuals, out int[] dominationCounter, out int[] rank) { 101 102 var front = new List<Tuple<T, double[]>>(); 102 103 dominatedIndividuals = new Dictionary<T, List<int>>(); 103 104 dominationCounter = new int[populationSize]; 104 105 rank = new int[populationSize]; 105 for ( intpI = 0; pI < populationSize - 1; pI++) {106 for (var pI = 0; pI < populationSize - 1; pI++) { 106 107 var p = solutions[pI]; 107 108 List<int> dominatedIndividualsByp; 108 109 if (!dominatedIndividuals.TryGetValue(p, out dominatedIndividualsByp)) 109 110 dominatedIndividuals[p] = dominatedIndividualsByp = new List<int>(); 110 for ( intqI = pI + 1; qI < populationSize; qI++) {111 for (var qI = pI + 1; qI < populationSize; qI++) { 111 112 var test = Dominates(qualities[pI], qualities[qI], maximization, dominateOnEqualQualities); 112 113 if (test == DominationResult.Dominates) { … … 147 148 if (dominateOnEqualQualities) { 148 149 var equal = true; 149 for ( inti = 0; i < left.Length; i++) {150 for (var i = 0; i < left.Length; i++) { 150 151 if (left[i] != right[i]) { 151 152 equal = false; … … 157 158 158 159 bool leftIsBetter = false, rightIsBetter = false; 159 for ( inti = 0; i < left.Length; i++) {160 for (var i = 0; i < left.Length; i++) { 160 161 if (IsDominated(left[i], right[i], maximizations[i])) rightIsBetter = true; 161 162 else if (IsDominated(right[i], left[i], maximizations[i])) leftIsBetter = true;
Note: See TracChangeset
for help on using the changeset viewer.