Changeset 11561 for branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/IntegerEncoding.cs
- Timestamp:
- 11/20/14 17:20:29 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/IntegerEncoding.cs
r11559 r11561 27 27 using HeuristicLab.Data; 28 28 using HeuristicLab.Encodings.IntegerVectorEncoding; 29 using HeuristicLab.Optimization; 29 30 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 31 using HeuristicLab.PluginInfrastructure; 30 32 31 33 namespace HeuristicLab.Problems.Programmable { … … 33 35 [StorableClass] 34 36 public class IntegerEncoding : Encoding<IIntegerVectorCreator> { 37 #region Encoding Parameters 35 38 [Storable] 36 private I ntValue length;37 public I ntValue Length{38 get { return length ; }39 private IFixedValueParameter<IntValue> lengthParameter; 40 public IFixedValueParameter<IntValue> LengthParameter { 41 get { return lengthParameter; } 39 42 set { 40 if (length == value) return; 41 length = value; 42 OnParameterConfigurationChanged(); 43 if (value == null) throw new ArgumentNullException("Length parameter must not be null."); 44 if (lengthParameter == value) return; 45 lengthParameter = value; 46 OnLengthParameterChanged(); 43 47 } 44 48 } 45 49 46 50 [Storable] 47 private IntMatrix bounds; 51 private IValueParameter<IntMatrix> boundsParameter; 52 public IValueParameter<IntMatrix> BoundsParameter { 53 get { return boundsParameter; } 54 set { 55 if (value == null) throw new ArgumentNullException("Bounds parameter must not be null."); 56 if (boundsParameter == value) return; 57 boundsParameter = value; 58 OnBoundsParameterChanged(); 59 } 60 } 61 62 public override IEnumerable<IValueParameter> Parameters { 63 get { return base.Parameters.Concat(new IValueParameter[] { LengthParameter, BoundsParameter }); } 64 } 65 #endregion 66 67 public int Length { 68 get { return LengthParameter.Value.Value; } 69 set { LengthParameter.Value.Value = value; } 70 } 48 71 public IntMatrix Bounds { 49 get { return bounds; } 50 set { 51 if (bounds == value) return; 52 bounds = value; 53 OnParameterConfigurationChanged(); 54 } 72 get { return BoundsParameter.Value; } 73 set { BoundsParameter.Value = value; } 55 74 } 56 75 57 76 [StorableConstructor] 58 77 protected IntegerEncoding(bool deserializing) : base(deserializing) { } 78 [StorableHook(HookType.AfterDeserialization)] 79 private void AfterDeserialization() { 80 RegisterParameterEvents(); 81 DiscoverOperators(); 82 } 83 59 84 protected IntegerEncoding(IntegerEncoding original, Cloner cloner) 60 85 : base(original, cloner) { 61 length = cloner.Clone(original.length); 62 bounds = cloner.Clone(original.bounds); 63 } 86 lengthParameter = cloner.Clone(original.lengthParameter); 87 boundsParameter = cloner.Clone(original.boundsParameter); 88 RegisterParameterEvents(); 89 DiscoverOperators(); 90 } 91 public override IDeepCloneable Clone(Cloner cloner) { return new IntegerEncoding(this, cloner); } 92 64 93 public IntegerEncoding(string name, int length, int min, int max, int? step = null) 65 94 : base(name) { 66 95 if (min >= max) throw new ArgumentException("min must be less than max", "min"); 67 96 if (step.HasValue && step.Value <= 0) throw new ArgumentException("step must be greater than zero or null", "step"); 68 this.length = new IntValue(length); 69 bounds = new IntMatrix(1, step.HasValue ? 3 : 2); 70 bounds[0, 0] = min; 71 bounds[0, 1] = max; 72 if (step.HasValue) bounds[0, 2] = step.Value; 97 Length = length; 98 Bounds = new IntMatrix(1, step.HasValue ? 3 : 2); 99 Bounds[0, 0] = min; 100 Bounds[0, 1] = max; 101 if (step.HasValue) Bounds[0, 2] = step.Value; 102 RegisterParameterEvents(); 103 DiscoverOperators(); 73 104 } 74 105 public IntegerEncoding(string name, int length, IList<int> min, IList<int> max, IList<int> step = null) … … 78 109 if (step != null && min.Count != step.Count) throw new ArgumentException("step must be of the same length as min or null", "step"); 79 110 if (min.Zip(max, (mi, ma) => mi >= ma).Any(x => x)) throw new ArgumentException("min must be less than max in each dimension", "min"); 80 this.length = new IntValue(length);81 bounds = new IntMatrix(min.Count, step != null ? 3 : 2);111 Length = length; 112 Bounds = new IntMatrix(min.Count, step != null ? 3 : 2); 82 113 for (int i = 0; i < min.Count; i++) { 83 bounds[i, 0] = min[i]; 84 bounds[i, 1] = max[i]; 85 if (step != null) bounds[i, 2] = step[i]; 86 } 87 } 88 89 public override IDeepCloneable Clone(Cloner cloner) { 90 return new IntegerEncoding(this, cloner); 91 } 92 114 Bounds[i, 0] = min[i]; 115 Bounds[i, 1] = max[i]; 116 if (step != null) Bounds[i, 2] = step[i]; 117 } 118 RegisterParameterEvents(); 119 DiscoverOperators(); 120 } 121 122 private void OnLengthParameterChanged() { 123 RegisterLengthParameterEvents(); 124 ConfigureOperators(Operators); 125 } 126 private void OnBoundsParameterChanged() { 127 RegisterBoundsParameterEvents(); 128 ConfigureOperators(Operators); 129 } 130 131 private void RegisterParameterEvents() { 132 RegisterLengthParameterEvents(); 133 RegisterBoundsParameterEvents(); 134 } 135 private void RegisterLengthParameterEvents() { 136 LengthParameter.ValueChanged += (o, s) => ConfigureOperators(Operators); 137 LengthParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators); 138 } 139 private void RegisterBoundsParameterEvents() { 140 BoundsParameter.ValueChanged += (o, s) => ConfigureOperators(Operators); 141 boundsParameter.Value.ToStringChanged += (o, s) => ConfigureOperators(Operators); 142 } 143 144 145 #region Operator Discovery 146 private static readonly IEnumerable<Type> encodingSpecificOperatorTypes; 147 static IntegerEncoding() { 148 encodingSpecificOperatorTypes = new List<Type>() { 149 typeof (IIntegerVectorOperator), 150 typeof (IIntegerVectorCreator), 151 typeof (IIntegerVectorCrossover), 152 typeof (IIntegerVectorManipulator), 153 typeof (IIntegerVectorStdDevStrategyParameterOperator), 154 typeof (IIntegerVectorMultiNeighborhoodShakingOperator), 155 }; 156 } 157 private void DiscoverOperators() { 158 var discoveredTypes = ApplicationManager.Manager.GetTypes(encodingSpecificOperatorTypes, true, false, false); 159 var operators = discoveredTypes.Select(t => (IOperator)Activator.CreateInstance(t)); 160 var newOperators = operators.Except(encodingOperators, new TypeEqualityComparer<IOperator>()).ToList(); 161 162 ConfigureOperators(newOperators); 163 encodingOperators.AddRange(newOperators); 164 } 165 #endregion 166 167 public override void ConfigureOperators(IEnumerable<IOperator> operators) { 168 ConfigureBoundedOperators(Operators.OfType<IBoundedIntegerVectorOperator>()); 169 ConfigureCreators(Operators.OfType<IIntegerVectorCreator>()); 170 ConfigureCrossovers(Operators.OfType<IIntegerVectorCrossover>()); 171 ConfigureManipulators(Operators.OfType<IIntegerVectorManipulator>()); 172 ConfigureShakingOperators(Operators.OfType<IIntegerVectorMultiNeighborhoodShakingOperator>()); 173 ConfigureStrategyVectorOperator(Operators.OfType<IIntegerVectorStdDevStrategyParameterOperator>()); 174 } 175 176 #region Specific Operator Wiring 177 private void ConfigureBoundedOperators(IEnumerable<IBoundedIntegerVectorOperator> boundedOperators) { 178 foreach (var boundedOperator in boundedOperators) { 179 boundedOperator.BoundsParameter.ActualName = BoundsParameter.Name; 180 } 181 } 182 183 private void ConfigureCreators(IEnumerable<IIntegerVectorCreator> creators) { 184 foreach (var creator in creators) { 185 creator.IntegerVectorParameter.ActualName = Name; 186 creator.BoundsParameter.ActualName = BoundsParameter.Name; 187 creator.LengthParameter.ActualName = LengthParameter.Name; 188 } 189 } 190 191 private void ConfigureCrossovers(IEnumerable<IIntegerVectorCrossover> crossovers) { 192 foreach (var crossover in crossovers) { 193 crossover.ChildParameter.ActualName = Name; 194 crossover.ParentsParameter.ActualName = Name; 195 } 196 } 197 198 private void ConfigureManipulators(IEnumerable<IIntegerVectorManipulator> manipulators) { 199 foreach (var manipulator in manipulators) { 200 manipulator.IntegerVectorParameter.ActualName = Name; 201 manipulator.IntegerVectorParameter.Hidden = true; 202 var sm = manipulator as ISelfAdaptiveManipulator; 203 if (sm != null) { 204 var p = sm.StrategyParameterParameter as ILookupParameter; 205 if (p != null) { 206 p.ActualName = Name + "Strategy"; 207 } 208 } 209 } 210 } 211 212 private void ConfigureShakingOperators(IEnumerable<IIntegerVectorMultiNeighborhoodShakingOperator> shakingOperators) { 213 foreach (var shakingOperator in shakingOperators) { 214 shakingOperator.IntegerVectorParameter.ActualName = Name; 215 } 216 } 217 218 private void ConfigureStrategyVectorOperator(IEnumerable<IIntegerVectorStdDevStrategyParameterOperator> strategyVectorOperators) { 219 var bounds = new DoubleMatrix(Bounds.Rows, Bounds.Columns); 220 for (var i = 0; i < bounds.Rows; i++) { 221 bounds[i, 1] = (int)Math.Ceiling(0.33 * (Bounds[i, 1] - Bounds[i, 0])); 222 bounds[i, 0] = 0; 223 if (bounds.Columns > 2) bounds[i, 2] = Bounds[i, 2]; 224 } 225 foreach (var s in strategyVectorOperators) { 226 var c = s as IIntegerVectorStdDevStrategyParameterCreator; 227 if (c != null) { 228 c.BoundsParameter.Value = (DoubleMatrix)bounds.Clone(); 229 c.LengthParameter.ActualName = Name; 230 c.StrategyParameterParameter.ActualName = Name + "Strategy"; 231 } 232 var m = s as IIntegerVectorStdDevStrategyParameterManipulator; 233 if (m != null) { 234 m.BoundsParameter.Value = (DoubleMatrix)bounds.Clone(); 235 m.StrategyParameterParameter.ActualName = Name + "Strategy"; 236 } 237 var mm = s as StdDevStrategyVectorManipulator; 238 if (mm != null) { 239 mm.GeneralLearningRateParameter.Value = new DoubleValue(1.0 / Math.Sqrt(2 * Length)); 240 mm.LearningRateParameter.Value = new DoubleValue(1.0 / Math.Sqrt(2 * Math.Sqrt(Length))); 241 } 242 var x = s as IIntegerVectorStdDevStrategyParameterCrossover; 243 if (x != null) { 244 x.ParentsParameter.ActualName = Name + "Strategy"; 245 x.StrategyParameterParameter.ActualName = Name + "Strategy"; 246 } 247 } 248 } 249 #endregion 93 250 } 94 251 }
Note: See TracChangeset
for help on using the changeset viewer.