- Timestamp:
- 11/20/14 17:20:29 (10 years ago)
- Location:
- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings
- Files:
-
- 2 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 } -
branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealEncoding.cs
r11559 r11561 148 148 static RealEncoding() { 149 149 encodingSpecificOperatorTypes = new List<Type>() { 150 typeof (IRealVectorOperator),151 typeof (IRealVectorCreator),152 typeof (IRealVectorCrossover),153 typeof (IRealVectorManipulator),154 typeof (IRealVectorStdDevStrategyParameterOperator),155 typeof (IRealVectorSwarmUpdater),156 typeof (IRealVectorParticleCreator),157 typeof (IRealVectorParticleUpdater),158 typeof (IRealVectorMultiNeighborhoodShakingOperator),159 typeof (IRealVectorBoundsChecker),160 typeof (IRealVectorMoveOperator),161 typeof (IRealVectorMoveGenerator)162 };150 typeof (IRealVectorOperator), 151 typeof (IRealVectorCreator), 152 typeof (IRealVectorCrossover), 153 typeof (IRealVectorManipulator), 154 typeof (IRealVectorStdDevStrategyParameterOperator), 155 typeof (IRealVectorSwarmUpdater), 156 typeof (IRealVectorParticleCreator), 157 typeof (IRealVectorParticleUpdater), 158 typeof (IRealVectorMultiNeighborhoodShakingOperator), 159 typeof (IRealVectorBoundsChecker), 160 typeof (IRealVectorMoveOperator), 161 typeof (IRealVectorMoveGenerator) 162 }; 163 163 } 164 164 private void DiscoverOperators() { … … 223 223 if (p != null) { 224 224 p.ActualName = Name + "Strategy"; 225 p.Hidden = true;226 225 } 227 226 }
Note: See TracChangeset
for help on using the changeset viewer.