Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/04/15 14:26:35 (9 years ago)
Author:
mkommend
Message:

#2321: Merged all changes from the NSGA2 branch to the trunk.

Location:
trunk/sources
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources

  • trunk/sources/HeuristicLab.Optimization.Operators/3.3/MultiObjective/FastNonDominatedSort.cs

    r12012 r12123  
    2222using System;
    2323using System.Collections.Generic;
     24using System.Linq;
    2425using HeuristicLab.Common;
    2526using HeuristicLab.Core;
     
    4041    private enum DominationResult { Dominates, IsDominated, IsNonDominated };
    4142
     43    #region Parameter properties
    4244    public IValueLookupParameter<BoolArray> MaximizationParameter {
    4345      get { return (IValueLookupParameter<BoolArray>)Parameters["Maximization"]; }
    4446    }
    45 
     47    public IValueLookupParameter<BoolValue> DominateOnEqualQualitiesParameter {
     48      get { return (ValueLookupParameter<BoolValue>)Parameters["DominateOnEqualQualities "]; }
     49    }
    4650    public IScopeTreeLookupParameter<DoubleArray> QualitiesParameter {
    4751      get { return (IScopeTreeLookupParameter<DoubleArray>)Parameters["Qualities"]; }
    4852    }
    49 
    5053    public IScopeTreeLookupParameter<IntValue> RankParameter {
    5154      get { return (IScopeTreeLookupParameter<IntValue>)Parameters["Rank"]; }
    5255    }
     56    #endregion
    5357
    5458    [StorableConstructor]
     
    5761    public FastNonDominatedSort() {
    5862      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."));
    5964      Parameters.Add(new ScopeTreeLookupParameter<DoubleArray>("Qualities", "The qualities of a solution.", 1));
    6065      Parameters.Add(new ScopeTreeLookupParameter<IntValue>("Rank", "The rank of a solution.", 1));
     
    6267
    6368    public override IOperation Apply() {
     69      bool dominateOnEqualQualities = DominateOnEqualQualitiesParameter.ActualValue.Value;
    6470      BoolArray maximization = MaximizationParameter.ActualValue;
    6571      ItemArray<DoubleArray> qualities = QualitiesParameter.ActualValue;
     
    7985          dominatedScopes[p] = new List<int>();
    8086        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);
    8288          if (test == DominationResult.Dominates) {
    8389            dominatedScopes[p].Add(qI);
     
    134140    }
    135141
    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
    137145      bool leftIsBetter = false, rightIsBetter = false;
    138146      for (int i = 0; i < left.Length; i++) {
     
    141149        if (leftIsBetter && rightIsBetter) break;
    142150      }
     151
    143152      if (leftIsBetter && !rightIsBetter) return DominationResult.Dominates;
    144153      if (!leftIsBetter && rightIsBetter) return DominationResult.IsDominated;
     
    146155    }
    147156
    148     private bool IsDominated(double left, double right, bool maximization) {
     157    private static bool IsDominated(double left, double right, bool maximization) {
    149158      return maximization && left < right
    150159        || !maximization && left > right;
    151160    }
    152161
    153     private void AddToFront(IScope p, List<ScopeList> fronts, int i) {
     162    private static void AddToFront(IScope p, List<ScopeList> fronts, int i) {
    154163      if (i == fronts.Count) fronts.Add(new ScopeList());
    155164      fronts[i].Add(p);
     
    159168      return new FastNonDominatedSort(this, cloner);
    160169    }
     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    }
    161179  }
    162180}
Note: See TracChangeset for help on using the changeset viewer.