Changeset 12280 for stable/HeuristicLab.Optimization.Operators
- Timestamp:
- 04/01/15 17:06:17 (10 years ago)
- Location:
- stable
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
stable
- Property svn:mergeinfo changed
/trunk/sources merged: 12069-12070,12076,12085,12087,12102,12106,12113,12126,12129
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Optimization.Operators/3.3/NoSimilarityCalculator.cs
r12009 r12280 32 32 [Item("NoSimilarityCalculator", "An item that performs similarity calculation between two solutions. The item always considers two solutions to be distinct.")] 33 33 public sealed class NoSimilarityCalculator : SingleObjectiveSolutionSimilarityCalculator { 34 protected override bool IsCommutative { get { return true; } } 35 34 36 private NoSimilarityCalculator(bool deserializing) : base(deserializing) { } 35 37 private NoSimilarityCalculator(NoSimilarityCalculator original, Cloner cloner) : base(original, cloner) { } -
stable/HeuristicLab.Optimization.Operators/3.3/QualitySimilarityCalculator.cs
r12009 r12280 34 34 [Item("QualitySimilarityCalculator", "An item that performs similarity calculation between two solutions. The item only considers the qualities of the two solutions.")] 35 35 public sealed class QualitySimilarityCalculator : SingleObjectiveSolutionSimilarityCalculator { 36 protected override bool IsCommutative { get { return true; } } 37 36 38 private QualitySimilarityCalculator(bool deserializing) : base(deserializing) { } 37 39 private QualitySimilarityCalculator(QualitySimilarityCalculator original, Cloner cloner) : base(original, cloner) { } -
stable/HeuristicLab.Optimization.Operators/3.3/SingleObjectiveSolutionSimilarityCalculator.cs
r12009 r12280 31 31 [Item("SimilarityCalculator", "A base class for items that perform similarity calculation between two solutions.")] 32 32 [StorableClass] 33 #pragma warning disable 0618 33 34 public abstract class SingleObjectiveSolutionSimilarityCalculator : SolutionSimilarityCalculator, ISingleObjectiveSolutionSimilarityCalculator { 34 #region Properties 35 [Storable] 36 public string SolutionVariableName { get; set; } 37 [Storable] 38 public string QualityVariableName { get; set; } 39 #endregion 40 35 #pragma warning restore 0618 41 36 [StorableConstructor] 42 37 protected SingleObjectiveSolutionSimilarityCalculator(bool deserializing) : base(deserializing) { } 43 38 protected SingleObjectiveSolutionSimilarityCalculator(SingleObjectiveSolutionSimilarityCalculator original, Cloner cloner) 44 39 : base(original, cloner) { 45 this.SolutionVariableName = original.SolutionVariableName; 46 this.QualityVariableName = original.QualityVariableName; 40 47 41 } 48 42 protected SingleObjectiveSolutionSimilarityCalculator() : base() { } -
stable/HeuristicLab.Optimization.Operators/3.3/SolutionSimilarityCalculator.cs
r12009 r12280 24 24 using HeuristicLab.Common; 25 25 using HeuristicLab.Core; 26 using HeuristicLab.Data; 26 27 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 27 28 … … 33 34 [StorableClass] 34 35 public abstract class SolutionSimilarityCalculator : Item, ISolutionSimilarityCalculator { 36 protected abstract bool IsCommutative { get; } 37 38 #region Properties 39 [Storable] 40 public string SolutionVariableName { get; set; } 41 [Storable] 42 public string QualityVariableName { get; set; } 43 #endregion 44 35 45 [StorableConstructor] 36 46 protected SolutionSimilarityCalculator(bool deserializing) : base(deserializing) { } 37 protected SolutionSimilarityCalculator(SolutionSimilarityCalculator original, Cloner cloner) : base(original, cloner) { } 47 48 protected SolutionSimilarityCalculator(SolutionSimilarityCalculator original, Cloner cloner) 49 : base(original, cloner) { 50 this.SolutionVariableName = original.SolutionVariableName; 51 this.QualityVariableName = original.QualityVariableName; 52 } 38 53 protected SolutionSimilarityCalculator() : base() { } 39 54 … … 71 86 for (int i = 0; i < individuals.Count; i++) similarityMatrix[i] = new double[individuals.Count]; 72 87 73 for (int i = 0; i < individuals.Count; i++) { 74 for (int j = i; j < individuals.Count; j++) { 75 similarityMatrix[i][j] = similarityMatrix[j][i] = CalculateSolutionSimilarity(individuals[i], individuals[j]); 88 if (IsCommutative) { 89 for (int i = 0; i < individuals.Count; i++) { 90 for (int j = i; j < individuals.Count; j++) { 91 similarityMatrix[i][j] = similarityMatrix[j][i] = CalculateSolutionSimilarity(individuals[i], individuals[j]); 92 } 93 } 94 } else { 95 for (int i = 0; i < individuals.Count; i++) { 96 for (int j = i; j < individuals.Count; j++) { 97 similarityMatrix[i][j] = CalculateSolutionSimilarity(individuals[i], individuals[j]); 98 if (i == j) continue; 99 similarityMatrix[j][i] = CalculateSolutionSimilarity(individuals[j], individuals[i]); 100 } 76 101 } 77 102 } … … 81 106 82 107 public abstract double CalculateSolutionSimilarity(IScope leftSolution, IScope rightSolution); 83 public abstract bool Equals(IScope x, IScope y); 84 public abstract int GetHashCode(IScope obj); 108 109 public virtual bool Equals(IScope x, IScope y) { 110 if (ReferenceEquals(x, y)) return true; 111 if (x == null || y == null) return false; 112 113 var q1 = x.Variables[QualityVariableName].Value; 114 var q2 = y.Variables[QualityVariableName].Value; 115 116 return CheckQualityEquality(q1, q2) && CalculateSolutionSimilarity(x, y).IsAlmost(1.0); 117 } 118 119 public virtual int GetHashCode(IScope scope) { 120 var quality = scope.Variables[QualityVariableName].Value; 121 var dv = quality as DoubleValue; 122 if (dv != null) 123 return dv.Value.GetHashCode(); 124 125 var da = quality as DoubleArray; 126 if (da != null) { 127 int hash = 17; 128 unchecked { 129 for (int i = 0; i < da.Length; ++i) { 130 hash += hash * 23 + da[i].GetHashCode(); 131 } 132 return hash; 133 } 134 } 135 return 0; 136 } 137 138 private static bool CheckQualityEquality(IItem q1, IItem q2) { 139 var d1 = q1 as DoubleValue; 140 var d2 = q2 as DoubleValue; 141 142 if (d1 != null && d2 != null) 143 return d1.Value.IsAlmost(d2.Value); 144 145 var da1 = q1 as DoubleArray; 146 var da2 = q2 as DoubleArray; 147 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 } 159 160 throw new ArgumentException("Could not determine quality equality."); 161 } 85 162 } 86 163 }
Note: See TracChangeset
for help on using the changeset viewer.