1
#region License Information
3 * Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL)
5 * This file is part of HeuristicLab.
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
24 using HeuristicLab
.Common
;
25 using HeuristicLab
.Core
;
26 using HeuristicLab
.Data
;
28 namespace HeuristicLab
.Optimization
.Operators
{
30 /// An item that performs similarity calculation between two solutions.
33 /// The item always considers two solutions to be equal if they have the same quality.
35 [Item("QualitySimilarityCalculator", "An item that performs similarity calculation between two solutions. The item only considers the qualities of the two solutions.")]
36 [StorableType("b5ef2b97-4a4a-43cd-aeae-7f951b49cdc1")]
37 public sealed class QualitySimilarityCalculator
: SingleObjectiveSolutionSimilarityCalculator
{
38 protected override bool IsCommutative { get { return true; }
}
41 private QualitySimilarityCalculator(StorableConstructorFlag _
) : base(_
) { }
42 private QualitySimilarityCalculator(QualitySimilarityCalculator original
, Cloner cloner
) : base(original
, cloner
) { }
43 public QualitySimilarityCalculator() : base() { }
45 public override IDeepCloneable
Clone(Cloner cloner
) {
46 return new QualitySimilarityCalculator(this, cloner
);
49 public static double CalculateSimilarity(IScope left
, IScope right
, string qualityVariableName
) {
50 double leftQuality
= ((DoubleValue
)left
.Variables
[qualityVariableName
].Value
).Value
;
51 double rightQuality
= ((DoubleValue
)right
.Variables
[qualityVariableName
].Value
).Value
;
52 double delta
= leftQuality
.IsAlmost(rightQuality
) ? 0.0 : Math
.Abs(leftQuality
- rightQuality
);
53 return 1.0 - delta
/ Math
.Max(leftQuality
, rightQuality
);
56 public override double CalculateSolutionSimilarity(IScope leftSolution
, IScope rightSolution
) {
57 return CalculateSimilarity(leftSolution
, rightSolution
, QualityVariableName
);