Changeset 12247 for branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators
- Timestamp:
- 03/24/15 11:17:08 (10 years ago)
- Location:
- branches/HeuristicLab.DatasetRefactor/sources
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.DatasetRefactor/sources
- Property svn:mergeinfo changed
-
branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/ExpressionCalculator.cs
r12031 r12247 74 74 variables (run parameters or results): 75 75 unquoted or in double quotes if they contain special characters or whitespace 76 mathematical functions :76 mathematical functions (resulting in double values): 77 77 +, -, *, /, ^ (power), log 78 78 predicates: 79 79 ==, <, >, isnull, not 80 conversions: 81 toint, todouble 82 array indexing: 83 [] 80 84 stack manipulation: 81 85 drop swap dup -
branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/MultiObjective/FastNonDominatedSort.cs
r12031 r12247 22 22 using System; 23 23 using System.Collections.Generic; 24 using System.Linq; 24 25 using HeuristicLab.Common; 25 26 using HeuristicLab.Core; … … 40 41 private enum DominationResult { Dominates, IsDominated, IsNonDominated }; 41 42 43 #region Parameter properties 42 44 public IValueLookupParameter<BoolArray> MaximizationParameter { 43 45 get { return (IValueLookupParameter<BoolArray>)Parameters["Maximization"]; } 44 46 } 45 47 public IValueLookupParameter<BoolValue> DominateOnEqualQualitiesParameter { 48 get { return (ValueLookupParameter<BoolValue>)Parameters["DominateOnEqualQualities"]; } 49 } 46 50 public IScopeTreeLookupParameter<DoubleArray> QualitiesParameter { 47 51 get { return (IScopeTreeLookupParameter<DoubleArray>)Parameters["Qualities"]; } 48 52 } 49 50 53 public IScopeTreeLookupParameter<IntValue> RankParameter { 51 54 get { return (IScopeTreeLookupParameter<IntValue>)Parameters["Rank"]; } 52 55 } 56 #endregion 53 57 54 58 [StorableConstructor] … … 57 61 public FastNonDominatedSort() { 58 62 Parameters.Add(new ValueLookupParameter<BoolArray>("Maximization", "Whether each objective is maximization or minimization.")); 63 Parameters.Add(new ValueLookupParameter<BoolValue>("DominateOnEqualQualities", "Flag which determines wether solutions with equal quality values should be treated as dominated.")); 59 64 Parameters.Add(new ScopeTreeLookupParameter<DoubleArray>("Qualities", "The qualities of a solution.", 1)); 60 65 Parameters.Add(new ScopeTreeLookupParameter<IntValue>("Rank", "The rank of a solution.", 1)); … … 62 67 63 68 public override IOperation Apply() { 69 bool dominateOnEqualQualities = DominateOnEqualQualitiesParameter.ActualValue.Value; 64 70 BoolArray maximization = MaximizationParameter.ActualValue; 65 71 ItemArray<DoubleArray> qualities = QualitiesParameter.ActualValue; … … 79 85 dominatedScopes[p] = new List<int>(); 80 86 for (int qI = pI + 1; qI < populationSize; qI++) { 81 DominationResult test = Dominates(qualities[pI], qualities[qI], maximization );87 DominationResult test = Dominates(qualities[pI], qualities[qI], maximization, dominateOnEqualQualities); 82 88 if (test == DominationResult.Dominates) { 83 89 dominatedScopes[p].Add(qI); … … 134 140 } 135 141 136 private DominationResult Dominates(DoubleArray left, DoubleArray right, BoolArray maximizations) { 142 private static DominationResult Dominates(DoubleArray left, DoubleArray right, BoolArray maximizations, bool dominateOnEqualQualities) { 143 if (dominateOnEqualQualities && left.SequenceEqual(right)) return DominationResult.Dominates; 144 137 145 bool leftIsBetter = false, rightIsBetter = false; 138 146 for (int i = 0; i < left.Length; i++) { … … 141 149 if (leftIsBetter && rightIsBetter) break; 142 150 } 151 143 152 if (leftIsBetter && !rightIsBetter) return DominationResult.Dominates; 144 153 if (!leftIsBetter && rightIsBetter) return DominationResult.IsDominated; … … 146 155 } 147 156 148 private bool IsDominated(double left, double right, bool maximization) {157 private static bool IsDominated(double left, double right, bool maximization) { 149 158 return maximization && left < right 150 159 || !maximization && left > right; 151 160 } 152 161 153 private void AddToFront(IScope p, List<ScopeList> fronts, int i) {162 private static void AddToFront(IScope p, List<ScopeList> fronts, int i) { 154 163 if (i == fronts.Count) fronts.Add(new ScopeList()); 155 164 fronts[i].Add(p); … … 159 168 return new FastNonDominatedSort(this, cloner); 160 169 } 170 171 [StorableHook(HookType.AfterDeserialization)] 172 private void AfterDeserialization() { 173 // BackwardsCompatibility3.3 174 #region Backwards compatible code, remove with 3.4 175 if (!Parameters.ContainsKey("DominateOnEqualQualities")) 176 Parameters.Add(new ValueLookupParameter<BoolValue>("DominateOnEqualQualities", "Flag which determines wether solutions with equal quality values should be treated as dominated.")); 177 #endregion 178 } 161 179 } 162 180 } -
branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/MultiObjective/RankAndCrowdingSorter.cs
r12031 r12247 30 30 namespace HeuristicLab.Optimization.Operators { 31 31 public class RankAndCrowdingSorter : AlgorithmOperator, IMultiObjectiveOperator { 32 #region Parameter properties 32 33 public ValueLookupParameter<BoolArray> MaximizationParameter { 33 34 get { return (ValueLookupParameter<BoolArray>)Parameters["Maximization"]; } … … 42 43 get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["CrowdingDistance"]; } 43 44 } 45 public IValueLookupParameter<BoolValue> DominateOnEqualQualitiesParameter { 46 get { return (ValueLookupParameter<BoolValue>)Parameters["DominateOnEqualQualities"]; } 47 } 48 #endregion 44 49 45 50 [StorableConstructor] … … 49 54 : base() { 50 55 Parameters.Add(new ValueLookupParameter<BoolArray>("Maximization", "For each objective a value that is true if that objective should be maximized, or false if it should be minimized.")); 56 Parameters.Add(new ValueLookupParameter<BoolValue>("DominateOnEqualQualities", "Flag which determines wether solutions with equal quality values should be treated as dominated.")); 51 57 Parameters.Add(new ScopeTreeLookupParameter<DoubleArray>("Qualities", "The vector of quality values.")); 52 58 Parameters.Add(new ScopeTreeLookupParameter<IntValue>("Rank", "The rank of a solution (to which front it belongs).")); … … 60 66 61 67 fastNonDominatedSort.MaximizationParameter.ActualName = MaximizationParameter.Name; 68 fastNonDominatedSort.DominateOnEqualQualitiesParameter.ActualName = DominateOnEqualQualitiesParameter.Name; 62 69 fastNonDominatedSort.QualitiesParameter.ActualName = QualitiesParameter.Name; 63 70 fastNonDominatedSort.RankParameter.ActualName = RankParameter.Name; … … 81 88 return new RankAndCrowdingSorter(this, cloner); 82 89 } 90 91 [StorableHook(HookType.AfterDeserialization)] 92 private void AfterDeserialization() { 93 // BackwardsCompatibility3.3 94 #region Backwards compatible code, remove with 3.4 95 if (!Parameters.ContainsKey("DominateOnEqualQualities")) 96 Parameters.Add(new ValueLookupParameter<BoolValue>("DominateOnEqualQualities", "Flag which determines wether solutions with equal quality values should be treated as dominated.")); 97 #endregion 98 } 83 99 } 84 100 } -
branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/SolutionSimilarityCalculator.cs
r12105 r12247 111 111 if (x == null || y == null) return false; 112 112 113 var q1 = x.Variables[QualityVariableName] ;114 var q2 = x.Variables[QualityVariableName];113 var q1 = x.Variables[QualityVariableName].Value; 114 var q2 = y.Variables[QualityVariableName].Value; 115 115 116 116 return CheckQualityEquality(q1, q2) && CalculateSolutionSimilarity(x, y).IsAlmost(1.0); … … 133 133 } 134 134 } 135 return 0; // throw exception?135 return 0; 136 136 } 137 137 … … 146 146 var da2 = q2 as DoubleArray; 147 147 148 if (da1 != null && da2 != null) 149 return da1.SequenceEqual(da2); 148 if (da1 != null && da2 != null) { 149 if (da1.Length != da2.Length) 150 throw new ArgumentException("The quality arrays must have the same length."); 151 152 for (int i = 0; i < da1.Length; ++i) { 153 if (!da1[i].IsAlmost(da2[i])) 154 return false; 155 } 156 157 return true; 158 } 150 159 151 160 throw new ArgumentException("Could not determine quality equality.");
Note: See TracChangeset
for help on using the changeset viewer.