Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
08/29/19 13:53:26 (5 years ago)
Author:
mkommend
Message:

#2521: Integrated changes of #2943 into problem refactoring branch.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2521_ProblemRefactoring/HeuristicLab.Optimization.Operators/3.3/MultiObjective/CrowdingDistanceAssignment.cs

    r16723 r17225  
    3434  [StorableType("F7DF8B74-F1E6-45D6-A1A8-5D381F20B382")]
    3535  public class CrowdingDistanceAssignment : SingleSuccessorOperator, IMultiObjectiveOperator {
    36 
    3736    public ScopeTreeLookupParameter<DoubleArray> QualitiesParameter {
    3837      get { return (ScopeTreeLookupParameter<DoubleArray>)Parameters["Qualities"]; }
     
    6665
    6766    public static void Apply(DoubleArray[] qualities, DoubleValue[] distances) {
    68       int populationSize = qualities.Length;
    69       int objectiveCount = qualities[0].Length;
    70       for (int m = 0; m < objectiveCount; m++) {
    71         Array.Sort<DoubleArray, DoubleValue>(qualities, distances, new QualitiesComparer(m));
    72 
    73         distances[0].Value = double.MaxValue;
    74         distances[populationSize - 1].Value = double.MaxValue;
    75 
    76         double minQuality = qualities[0][m];
    77         double maxQuality = qualities[populationSize - 1][m];
    78         for (int i = 1; i < populationSize - 1; i++) {
    79           distances[i].Value += (qualities[i + 1][m] - qualities[i - 1][m]) / (maxQuality - minQuality);
    80         }
    81       }
     67      var dist = CrowdingCalculator.CalculateCrowdingDistances(qualities.Select(x => x.ToArray()).ToArray());
     68      for (var i = 0; i < distances.Length; i++) distances[i].Value = dist[i];
    8269    }
    8370
    8471    public override IOperation Apply() {
    85       DoubleArray[] qualities = QualitiesParameter.ActualValue.ToArray();
    86       int populationSize = qualities.Length;
    87       DoubleValue[] distances = new DoubleValue[populationSize];
    88       for (int i = 0; i < populationSize; i++)
    89         distances[i] = new DoubleValue(0);
    90 
    91       CrowdingDistanceParameter.ActualValue = new ItemArray<DoubleValue>(distances);
    92 
    93       Apply(qualities, distances);
    94 
     72      var dist = CrowdingCalculator.CalculateCrowdingDistances(QualitiesParameter.ActualValue.Select(x => x.ToArray()).ToArray());
     73      CrowdingDistanceParameter.ActualValue = new ItemArray<DoubleValue>(dist.Select(d => new DoubleValue(d)));
    9574      return base.Apply();
    96     }
    97 
    98     private void Initialize(ItemArray<DoubleValue> distances) {
    99       for (int i = 0; i < distances.Length; i++) {
    100         if (distances[i] == null) distances[i] = new DoubleValue(0);
    101         else distances[i].Value = 0;
    102       }
    103     }
    104 
    105     [StorableType("30fd1927-b268-4ce7-8960-b04bfa83f1e6")]
    106     private class QualitiesComparer : IComparer<DoubleArray> {
    107       private int index;
    108 
    109       public QualitiesComparer(int index) {
    110         this.index = index;
    111       }
    112 
    113       #region IComparer<DoubleArray> Members
    114 
    115       public int Compare(DoubleArray x, DoubleArray y) {
    116         if (x[index] < y[index]) return -1;
    117         else if (x[index] > y[index]) return +1;
    118         else return 0;
    119       }
    120 
    121       #endregion
    12275    }
    12376
Note: See TracChangeset for help on using the changeset viewer.