Changeset 12105 for branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators
- Timestamp:
- 03/03/15 11:18:07 (10 years ago)
- Location:
- branches/HeuristicLab.DatasetRefactor/sources
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.DatasetRefactor/sources
- Property svn:mergeinfo changed
/trunk/sources merged: 12037,12041,12057,12059-12060,12067,12069-12070,12072,12074,12076-12078,12085,12087-12091,12093,12095-12096,12100-12104
- Property svn:mergeinfo changed
-
branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/NoSimilarityCalculator.cs
r12031 r12105 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) { } -
branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/QualitySimilarityCalculator.cs
r12031 r12105 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) { } -
branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/SingleObjectiveSolutionSimilarityCalculator.cs
r12031 r12105 32 32 [StorableClass] 33 33 public abstract class SingleObjectiveSolutionSimilarityCalculator : SolutionSimilarityCalculator, ISingleObjectiveSolutionSimilarityCalculator { 34 #region Properties35 [Storable]36 public string SolutionVariableName { get; set; }37 [Storable]38 public string QualityVariableName { get; set; }39 #endregion40 41 34 [StorableConstructor] 42 35 protected SingleObjectiveSolutionSimilarityCalculator(bool deserializing) : base(deserializing) { } 43 36 protected SingleObjectiveSolutionSimilarityCalculator(SingleObjectiveSolutionSimilarityCalculator original, Cloner cloner) 44 37 : base(original, cloner) { 45 this.SolutionVariableName = original.SolutionVariableName; 46 this.QualityVariableName = original.QualityVariableName; 38 47 39 } 48 40 protected SingleObjectiveSolutionSimilarityCalculator() : base() { } -
branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/SolutionSimilarityCalculator.cs
r12031 r12105 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]; 114 var q2 = x.Variables[QualityVariableName]; 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; // throw exception? 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 return da1.SequenceEqual(da2); 150 151 throw new ArgumentException("Could not determine quality equality."); 152 } 85 153 } 86 154 }
Note: See TracChangeset
for help on using the changeset viewer.