1  #region License Information


2  /* HeuristicLab


3  * Copyright (C) 20022015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)


4  *


5  * This file is part of HeuristicLab.


6  *


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.


11  *


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.


16  *


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/>.


19  */


20  #endregion


21 


22  using System;


23  using HeuristicLab.Common;


24  using HeuristicLab.Core;


25  using HeuristicLab.Data;


26  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;


27 


28  namespace HeuristicLab.Optimization.Operators {


29  /// <summary>


30  /// An item that performs similarity calculation between two solutions.


31  /// </summary>


32  /// <remarks>


33  /// The item always considers two solutions to be equal if they have the same quality.


34  /// </remarks>


35  [StorableType("64D9B8A0D3504B31B56B2EE7DAA8E970")]


36  [Item("QualitySimilarityCalculator", "An item that performs similarity calculation between two solutions. The item only considers the qualities of the two solutions.")]


37  public sealed class QualitySimilarityCalculator : SingleObjectiveSolutionSimilarityCalculator {


38  protected override bool IsCommutative { get { return true; } }


39 


40  private QualitySimilarityCalculator(bool deserializing) : base(deserializing) { }


41  private QualitySimilarityCalculator(QualitySimilarityCalculator original, Cloner cloner) : base(original, cloner) { }


42  public QualitySimilarityCalculator() : base() { }


43 


44  public override IDeepCloneable Clone(Cloner cloner) {


45  return new QualitySimilarityCalculator(this, cloner);


46  }


47 


48  public static double CalculateSimilarity(IScope left, IScope right, string qualityVariableName) {


49  double leftQuality = ((DoubleValue)left.Variables[qualityVariableName].Value).Value;


50  double rightQuality = ((DoubleValue)right.Variables[qualityVariableName].Value).Value;


51  double delta = leftQuality.IsAlmost(rightQuality) ? 0.0 : Math.Abs(leftQuality  rightQuality);


52  return 1.0  delta / Math.Max(leftQuality, rightQuality);


53  }


54 


55  public override double CalculateSolutionSimilarity(IScope leftSolution, IScope rightSolution) {


56  return CalculateSimilarity(leftSolution, rightSolution, QualityVariableName);


57  }


58  }


59  }

