Changeset 15109
- Timestamp:
- 07/03/17 09:40:13 (7 years ago)
- Location:
- stable
- Files:
-
- 8 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
stable
- Property svn:mergeinfo changed
/trunk/sources merged: 15051,15080,15086-15087
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Optimization
- Property svn:mergeinfo changed
/trunk/sources/HeuristicLab.Optimization merged: 15051,15080,15086
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Optimization.Operators/3.3/MultiObjective/FastNonDominatedSort.cs
r14186 r15109 39 39 [StorableClass] 40 40 public class FastNonDominatedSort : SingleSuccessorOperator, IMultiObjectiveOperator { 41 private enum DominationResult { Dominates, IsDominated, IsNonDominated };42 41 43 42 #region Parameter properties … … 75 74 int populationSize = scope.SubScopes.Count; 76 75 77 List<ScopeList> fronts = new List<ScopeList>(); 78 Dictionary<IScope, List<int>> dominatedScopes = new Dictionary<IScope, List<int>>(); 79 int[] dominationCounter = new int[populationSize]; 80 ItemArray<IntValue> rank = new ItemArray<IntValue>(populationSize); 76 int[] rank; 77 var fronts = DominationCalculator<IScope>.CalculateAllParetoFronts(scope.SubScopes.ToArray(), qualities, maximization, out rank, dominateOnEqualQualities); 81 78 82 for (int pI = 0; pI < populationSize - 1; pI++) { 83 IScope p = scope.SubScopes[pI]; 84 List<int> dominatedScopesByp; 85 if (!dominatedScopes.TryGetValue(p, out dominatedScopesByp)) 86 dominatedScopes[p] = dominatedScopesByp = new List<int>(); 87 for (int qI = pI + 1; qI < populationSize; qI++) { 88 DominationResult test = Dominates(qualities[pI], qualities[qI], maximization, dominateOnEqualQualities); 89 if (test == DominationResult.Dominates) { 90 dominatedScopesByp.Add(qI); 91 dominationCounter[qI] += 1; 92 } else if (test == DominationResult.IsDominated) { 93 dominationCounter[pI] += 1; 94 if (!dominatedScopes.ContainsKey(scope.SubScopes[qI])) 95 dominatedScopes.Add(scope.SubScopes[qI], new List<int>()); 96 dominatedScopes[scope.SubScopes[qI]].Add(pI); 97 } 98 if (pI == populationSize - 2 99 && qI == populationSize - 1 100 && dominationCounter[qI] == 0) { 101 rank[qI] = new IntValue(0); 102 AddToFront(scope.SubScopes[qI], fronts, 0); 103 } 104 } 105 if (dominationCounter[pI] == 0) { 106 rank[pI] = new IntValue(0); 107 AddToFront(p, fronts, 0); 108 } 109 } 110 int i = 0; 111 while (i < fronts.Count && fronts[i].Count > 0) { 112 ScopeList nextFront = new ScopeList(); 113 foreach (IScope p in fronts[i]) { 114 List<int> dominatedScopesByp; 115 if (dominatedScopes.TryGetValue(p, out dominatedScopesByp)) { 116 for (int k = 0; k < dominatedScopesByp.Count; k++) { 117 int dominatedScope = dominatedScopesByp[k]; 118 dominationCounter[dominatedScope] -= 1; 119 if (dominationCounter[dominatedScope] == 0) { 120 rank[dominatedScope] = new IntValue(i + 1); 121 nextFront.Add(scope.SubScopes[dominatedScope]); 122 } 123 } 124 } 125 } 126 i += 1; 127 fronts.Add(nextFront); 128 } 129 130 RankParameter.ActualValue = rank; 79 RankParameter.ActualValue = new ItemArray<IntValue>(rank.Select(x => new IntValue(x))); 131 80 132 81 scope.SubScopes.Clear(); 133 82 134 for ( i = 0; i < fronts.Count; i++) {83 for (var i = 0; i < fronts.Count; i++) { 135 84 Scope frontScope = new Scope("Front " + i); 136 85 foreach (var p in fronts[i]) 137 frontScope.SubScopes.Add(p );86 frontScope.SubScopes.Add(p.Item1); 138 87 if (frontScope.SubScopes.Count > 0) 139 88 scope.SubScopes.Add(frontScope); 140 89 } 141 90 return base.Apply(); 142 }143 144 private static DominationResult Dominates(double[] left, double[] right, bool[] maximizations, bool dominateOnEqualQualities) {145 //mkommend Caution: do not use LINQ.SequenceEqual for comparing the two quality arrays (left and right) due to performance reasons146 if (dominateOnEqualQualities) {147 var equal = true;148 for (int i = 0; i < left.Length; i++) {149 if (left[i] != right[i]) {150 equal = false;151 break;152 }153 }154 if (equal) return DominationResult.Dominates;155 }156 157 bool leftIsBetter = false, rightIsBetter = false;158 for (int i = 0; i < left.Length; i++) {159 if (IsDominated(left[i], right[i], maximizations[i])) rightIsBetter = true;160 else if (IsDominated(right[i], left[i], maximizations[i])) leftIsBetter = true;161 if (leftIsBetter && rightIsBetter) break;162 }163 164 if (leftIsBetter && !rightIsBetter) return DominationResult.Dominates;165 if (!leftIsBetter && rightIsBetter) return DominationResult.IsDominated;166 return DominationResult.IsNonDominated;167 }168 169 private static bool IsDominated(double left, double right, bool maximization) {170 return maximization && left < right171 || !maximization && left > right;172 }173 174 private static void AddToFront(IScope p, List<ScopeList> fronts, int i) {175 if (i == fronts.Count) fronts.Add(new ScopeList());176 fronts[i].Add(p);177 91 } 178 92 -
stable/HeuristicLab.Optimization/3.3/BasicProblems/MultiObjectiveBasicProblem.cs
r15108 r15109 20 20 #endregion 21 21 22 using System; 23 using System.Collections.Generic; 22 24 using System.Linq; 23 25 using HeuristicLab.Common; … … 57 59 public abstract double[] Evaluate(Individual individual, IRandom random); 58 60 public virtual void Analyze(Individual[] individuals, double[][] qualities, ResultCollection results, IRandom random) { } 59 61 60 62 protected override void OnOperatorsChanged() { 61 63 base.OnOperatorsChanged(); -
stable/HeuristicLab.Optimization/3.3/BasicProblems/SingleObjectiveBasicProblem.cs
r15108 r15109 20 20 #endregion 21 21 22 using System; 22 23 using System.Collections.Generic; 23 24 using System.Linq; … … 84 85 } 85 86 87 protected Tuple<Individual, double> GetBestIndividual(Individual[] individuals, double[] qualities) { 88 return GetBestIndividual(individuals, qualities, Maximization); 89 } 90 public static Tuple<Individual, double> GetBestIndividual(Individual[] individuals, double[] qualities, bool maximization) { 91 var zipped = individuals.Zip(qualities, (i, q) => new { Individual = i, Quality = q }); 92 var best = (maximization ? zipped.OrderByDescending(z => z.Quality) : zipped.OrderBy(z => z.Quality)).First(); 93 return Tuple.Create(best.Individual, best.Quality); 94 } 95 86 96 protected override void OnOperatorsChanged() { 87 97 base.OnOperatorsChanged(); -
stable/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj
r15081 r15109 156 156 <Compile Include="Interfaces\ILocalImprovementAlgorithmOperator.cs" /> 157 157 <Compile Include="Interfaces\IMultiObjectiveOperator.cs" /> 158 <Compile Include="MultiObjective\DominationCalculator.cs" /> 158 159 <Compile Include="Results\IResultParameter.cs" /> 159 160 <Compile Include="Interfaces\ISingleObjectiveOperator.cs" /> -
stable/HeuristicLab.Optimization/3.3/MultiObjective/DominationCalculator.cs
r15080 r15109 22 22 using System; 23 23 using System.Collections.Generic; 24 using HeuristicLab.Core;25 using HeuristicLab.Data;26 24 27 25 namespace HeuristicLab.Optimization { … … 100 98 } 101 99 102 private static List<Tuple<T, double[]>> CalculateBestFront(T[] individuals, double[][] qualities, bool[] maximization, bool dominateOnEqualQualities, int populationSize, out Dictionary<T, List<int>> dominatedIndividuals, out int[] dominationCounter, out int[] rank) {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) { 103 101 var front = new List<Tuple<T, double[]>>(); 104 102 dominatedIndividuals = new Dictionary<T, List<int>>(); … … 106 104 rank = new int[populationSize]; 107 105 for (int pI = 0; pI < populationSize - 1; pI++) { 108 var p = individuals[pI];106 var p = solutions[pI]; 109 107 List<int> dominatedIndividualsByp; 110 108 if (!dominatedIndividuals.TryGetValue(p, out dominatedIndividualsByp)) … … 117 115 } else if (test == DominationResult.IsDominated) { 118 116 dominationCounter[pI] += 1; 119 if (!dominatedIndividuals.ContainsKey( individuals[qI]))120 dominatedIndividuals.Add( individuals[qI], new List<int>());121 dominatedIndividuals[ individuals[qI]].Add(pI);117 if (!dominatedIndividuals.ContainsKey(solutions[qI])) 118 dominatedIndividuals.Add(solutions[qI], new List<int>()); 119 dominatedIndividuals[solutions[qI]].Add(pI); 122 120 } 123 121 if (pI == populationSize - 2 … … 125 123 && dominationCounter[qI] == 0) { 126 124 rank[qI] = 0; 127 front.Add(Tuple.Create( individuals[qI], qualities[qI]));125 front.Add(Tuple.Create(solutions[qI], qualities[qI])); 128 126 } 129 127 } -
stable/HeuristicLab.Optimization/3.3/Results/ResultCollection.cs
r14186 r15109 75 75 } 76 76 77 public void AddOrUpdateResult(string name, IItem value) { 78 IResult res; 79 if (!TryGetValue(name, out res)) { 80 res = new Result(name, value); 81 Add(res); 82 } else res.Value = value; 83 } 77 84 } 78 85 }
Note: See TracChangeset
for help on using the changeset viewer.