Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
05/07/12 15:14:47 (12 years ago)
Author:
epitzer
Message:

#1696 add neutrality breadth analysis by including and analyzing the number of possible neutral neighbors both overall and inside neutral areas

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/NeutralSelector.cs

    r7128 r7783  
    5656      get { return (ValueLookupParameter<DoubleValue>)Parameters["Epsilon"]; }
    5757    }
     58    public ILookupParameter<DoubleValue> CurrentFractionOfNeutralNeighborsParameter {
     59      get { return (LookupParameter<DoubleValue>) Parameters["CurrentFractionOfNeutralNeighbors"]; }
     60    }
    5861    public LookupParameter<DoubleValue> CurrentNeutralDistanceParameter {
    5962      get { return (LookupParameter<DoubleValue>)Parameters["CurrentNeutralDistance"]; }
     
    7174      get { return CopySelectedParameter.Value; }
    7275      set { CopySelectedParameter.Value = value; }
     76    }
     77    protected double CurrentNeutralDistance {
     78      set {
     79        if (CurrentNeutralDistanceParameter.ActualValue == null)
     80          CurrentNeutralDistanceParameter.ActualValue= new DoubleValue(value);
     81        else
     82          CurrentNeutralDistanceParameter.ActualValue.Value = value;
     83      }
     84     
     85    }
     86    protected double CurrentFractionOfNeutralNeighbors {
     87      get { return CurrentFractionOfNeutralNeighborsParameter.ActualValue.Value; }
     88      set {
     89        if (CurrentFractionOfNeutralNeighborsParameter.ActualValue == null)
     90          CurrentFractionOfNeutralNeighborsParameter.ActualValue = new DoubleValue(value);
     91        else
     92          CurrentFractionOfNeutralNeighborsParameter.ActualValue.Value = value;
     93      }
    7394    }
    7495    #endregion
     
    91112      Parameters.Add(new ConstrainedValueParameter<IItemDistanceCalculator>("SolutionDistanceCalculator", "Operator to calculate distances between the base item and the current item."));
    92113      Parameters.Add(new LookupParameter<DoubleValue>("CurrentNeutralDistance", "The distance of the current item to the starting point of the neutral (portion of the) walk."));
     114      Parameters.Add(new LookupParameter<DoubleValue>("CurrentFractionOfNeutralNeighbors", "The fraction of examined neighbors that have the same fitness value (within epsilon)"));
    93115      Parameters.Add(new LookupParameter<IRandom>("Random", "Random number generator for breaking ties in the ordering."));
    94116      CopySelectedParameter.Hidden = true;
     
    112134      return new NeutralSelector(this, cloner);
    113135    }
     136    [StorableHook(HookType.AfterDeserialization)]
     137    private void AfterDeserialization() {
     138      if (!Parameters.ContainsKey("CurrentFractionOfNeutralNeighbors"))
     139        Parameters.Add(new LookupParameter<DoubleValue>("CurrentFractionOfNeutralNeighbors", "The fraction of examined neighbors that have the same fitness (within epsilon)"));
     140    }
    114141    #endregion
    115142
     
    119146
    120147    public sealed override IOperation Apply() {
    121       IItemDistanceCalculator calc = (IItemDistanceCalculator)SolutionDistanceCalculatorParameter.ActualValue;
    122       double baseQuality = BaseQualityParameter.ActualValue.Value;
    123       IItem startingPoint = StartingPointParameter.ActualValue;
    124       IItem baseSolution = BaseSolutionParameter.ActualValue;
    125       ItemArray<IItem> items = SolutionParameter.ActualValue;
    126       double eps = EpsilonParameter.ActualValue.Value;
    127       IRandom random = RandomParameter.ActualValue;
    128       double baseDistance = 0;
    129       if (startingPoint != null) {
    130         baseDistance = calc.Distance(baseSolution, startingPoint);
    131         baseSolution = startingPoint;
     148      var calc = (IItemDistanceCalculator)SolutionDistanceCalculatorParameter.ActualValue;
     149      var baseQuality = BaseQualityParameter.ActualValue.Value;
     150      var startingPoint = StartingPointParameter.ActualValue;
     151      var baseSolution = BaseSolutionParameter.ActualValue;
     152      var items = SolutionParameter.ActualValue;
     153      var eps = EpsilonParameter.ActualValue.Value;
     154      var random = RandomParameter.ActualValue;
     155      double currentNeutralDistance;
     156
     157      if (startingPoint == null) {
     158        currentNeutralDistance = 0;
     159        CurrentNeutralDistance = 0;
     160        startingPoint = baseSolution;
     161        StartingPointParameter.ActualValue = (IItem)baseSolution.Clone();
     162      } else {
     163        currentNeutralDistance = calc.Distance(startingPoint, baseSolution);
    132164      }
    133165
     
    137169          Idx=i,
    138170          Diff=Squash(Math.Abs(baseQuality-p.Quality), eps),
    139           Dist=calc.Distance(baseSolution, p.Item)
     171          StartDist=calc.Distance(startingPoint, p.Item),
     172          BaseDist=calc.Distance(baseSolution, p.Item)
    140173        })       
     174        .Where(n => n.BaseDist > 0)
    141175        .ToList();
    142       if (random != null)
    143         neighbors.Shuffle(random);
    144       var mostDistantNeutralNeighbor = neighbors.Where(n => n.Diff == 0).OrderByDescending(n => n.Dist).FirstOrDefault();
    145       if (mostDistantNeutralNeighbor != null && mostDistantNeutralNeighbor.Dist > baseDistance) {
    146         Select(mostDistantNeutralNeighbor.Idx);
    147         if (startingPoint == null)
    148           StartingPointParameter.ActualValue = (IItem)baseSolution.Clone();
    149         CurrentNeutralDistanceParameter.ActualValue = new DoubleValue(mostDistantNeutralNeighbor.Dist);
    150       } else {
    151         var mostDistantNeighbor = neighbors.OrderByDescending(n => n.Dist).FirstOrDefault();
    152         Select(mostDistantNeighbor.Idx);
    153         StartingPointParameter.ActualValue = (IItem)items[mostDistantNeighbor.Idx].Clone();
    154         CurrentNeutralDistanceParameter.ActualValue = new DoubleValue(0);
     176      if (neighbors.Count > 0) {
     177        if (random != null)
     178          neighbors.Shuffle(random);
     179        var mostDistantNeutralNeighbor =
     180          neighbors.Where(n => n.Diff == 0).OrderByDescending(n => n.StartDist).FirstOrDefault();
     181        if (mostDistantNeutralNeighbor != null && mostDistantNeutralNeighbor.StartDist > currentNeutralDistance) {
     182          if (currentNeutralDistance == 0) {
     183            StartingPointParameter.ActualValue = (IItem) baseSolution.Clone();
     184            CurrentNeutralDistance = mostDistantNeutralNeighbor.BaseDist;
     185          } else {
     186            CurrentNeutralDistance = mostDistantNeutralNeighbor.StartDist;
     187          }
     188          Select(mostDistantNeutralNeighbor.Idx);
     189        } else {
     190          var mostDistantNonNeutralNeighbor = neighbors.Where(n => n.Diff > 0).OrderByDescending(n => n.StartDist).FirstOrDefault();
     191          if (mostDistantNonNeutralNeighbor != null) {
     192            Select(mostDistantNonNeutralNeighbor.Idx);
     193          } else {
     194            var mostDistantNeighbor = neighbors.OrderByDescending(n => n.StartDist).FirstOrDefault();
     195            Select(mostDistantNeighbor.Idx);
     196          }
     197          if (currentNeutralDistance > 0)
     198            StartingPointParameter.ActualValue = (IItem)baseSolution.Clone();
     199          CurrentNeutralDistance = 0;
     200        }
     201        CurrentFractionOfNeutralNeighbors = 1.0*neighbors.Count(n => n.Diff == 0)/neighbors.Count;
    155202      }
    156203      return base.Apply();
Note: See TracChangeset for help on using the changeset viewer.