Changeset 7783 for branches/FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/NeutralSelector.cs
- Timestamp:
- 05/07/12 15:14:47 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/NeutralSelector.cs
r7128 r7783 56 56 get { return (ValueLookupParameter<DoubleValue>)Parameters["Epsilon"]; } 57 57 } 58 public ILookupParameter<DoubleValue> CurrentFractionOfNeutralNeighborsParameter { 59 get { return (LookupParameter<DoubleValue>) Parameters["CurrentFractionOfNeutralNeighbors"]; } 60 } 58 61 public LookupParameter<DoubleValue> CurrentNeutralDistanceParameter { 59 62 get { return (LookupParameter<DoubleValue>)Parameters["CurrentNeutralDistance"]; } … … 71 74 get { return CopySelectedParameter.Value; } 72 75 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 } 73 94 } 74 95 #endregion … … 91 112 Parameters.Add(new ConstrainedValueParameter<IItemDistanceCalculator>("SolutionDistanceCalculator", "Operator to calculate distances between the base item and the current item.")); 92 113 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)")); 93 115 Parameters.Add(new LookupParameter<IRandom>("Random", "Random number generator for breaking ties in the ordering.")); 94 116 CopySelectedParameter.Hidden = true; … … 112 134 return new NeutralSelector(this, cloner); 113 135 } 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 } 114 141 #endregion 115 142 … … 119 146 120 147 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); 132 164 } 133 165 … … 137 169 Idx=i, 138 170 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) 140 173 }) 174 .Where(n => n.BaseDist > 0) 141 175 .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; 155 202 } 156 203 return base.Apply();
Note: See TracChangeset
for help on using the changeset viewer.