Changeset 11553
- Timestamp:
- 11/15/14 17:30:02 (10 years ago)
- Location:
- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/BinaryEncoding.cs
r11484 r11553 20 20 #endregion 21 21 22 using System; 23 using System.Collections.Generic; 24 using System.Linq; 22 25 using HeuristicLab.Common; 23 26 using HeuristicLab.Core; 24 27 using HeuristicLab.Data; 28 using HeuristicLab.Encodings.BinaryVectorEncoding; 29 using HeuristicLab.Optimization; 30 using HeuristicLab.Parameters; 25 31 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 32 using HeuristicLab.PluginInfrastructure; 26 33 27 34 namespace HeuristicLab.Problems.Programmable { 28 35 [Item("BinaryEncoding", "Describes a binary vector encoding.")] 29 36 [StorableClass] 30 public class BinaryEncoding : Encoding { 37 public sealed class BinaryEncoding : Encoding { 38 #region Encoding Parameters 31 39 [Storable] 32 private I ntValue length;33 public I ntValue Length{34 get { return length ; }40 private IFixedValueParameter<IntValue> lengthParameter; 41 public IFixedValueParameter<IntValue> LengthParameter { 42 get { return lengthParameter; } 35 43 set { 36 if (length == value) return; 37 length = value; 38 OnParameterConfigurationChanged(); 44 if (value == null) throw new ArgumentNullException("Length parameter must not be null."); 45 if (lengthParameter == value) return; 46 lengthParameter = value; 47 OnLengthParameterChanged(); 39 48 } 49 } 50 public override IEnumerable<IValueParameter> Parameters { 51 get { return base.Parameters.Concat(new IValueParameter[] { LengthParameter }); } 52 } 53 #endregion 54 55 private List<IOperator> encodingOperators = new List<IOperator>(); 56 [Storable] 57 public override IEnumerable<IOperator> Operators { 58 get { return encodingOperators; } 59 protected set { encodingOperators = new List<IOperator>(value); } 60 } 61 62 public override ISolutionCreator DefaultSolutionCreator { 63 get { return Operators.OfType<RandomBinaryVectorCreator>().First(); } 64 } 65 66 public int Length { 67 get { return LengthParameter.Value.Value; } 68 set { LengthParameter.Value.Value = value; } 40 69 } 41 70 42 71 [StorableConstructor] 43 protected BinaryEncoding(bool deserializing) : base(deserializing) { } 44 protected BinaryEncoding(BinaryEncoding original, Cloner cloner) 72 private BinaryEncoding(bool deserializing) : base(deserializing) { } 73 [StorableHook(HookType.AfterDeserialization)] 74 private void AfterDeserialization() { 75 RegisterParameterEvents(); 76 DiscoverOperators(); 77 } 78 public override IDeepCloneable Clone(Cloner cloner) { return new BinaryEncoding(this, cloner); } 79 private BinaryEncoding(BinaryEncoding original, Cloner cloner) 45 80 : base(original, cloner) { 46 length = cloner.Clone(original.length); 81 lengthParameter = cloner.Clone(original.lengthParameter); 82 encodingOperators = original.Operators.Select(cloner.Clone).ToList(); 83 RegisterParameterEvents(); 47 84 } 48 85 public BinaryEncoding(string name, int length) 49 86 : base(name) { 50 this.length = new IntValue(length);87 lengthParameter = new FixedValueParameter<IntValue>(Name + "Length", new IntValue(length)); 51 88 } 52 89 53 public override IDeepCloneable Clone(Cloner cloner) { 54 return new BinaryEncoding(this, cloner); 90 private void OnLengthParameterChanged() { 91 RegisterLengthParameterEvents(); 92 ConfigureOperators(Operators); 93 } 94 private void RegisterParameterEvents() { 95 RegisterLengthParameterEvents(); 96 } 97 private void RegisterLengthParameterEvents() { 98 LengthParameter.ValueChanged += (o, s) => ConfigureOperators(Operators); 99 LengthParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators); 55 100 } 56 101 102 #region Operator Discovery 103 private static readonly IEnumerable<Type> encodingSpecificOperatorTypes; 104 static BinaryEncoding() { 105 encodingSpecificOperatorTypes = new List<Type>() { 106 typeof (IBinaryVectorOperator), 107 typeof (IBinaryVectorCreator), 108 typeof (IBinaryVectorCrossover), 109 typeof (IBinaryVectorManipulator), 110 typeof (IBinaryVectorMoveOperator), 111 typeof (IBinaryVectorMultiNeighborhoodShakingOperator), 112 }; 113 } 114 private void DiscoverOperators() { 115 var pluginDescription = ApplicationManager.Manager.GetDeclaringPlugin(typeof(IBinaryVectorOperator)); 116 var discoveredTypes = ApplicationManager.Manager.GetTypes(encodingSpecificOperatorTypes, pluginDescription, true, false, false); 117 var operators = discoveredTypes.Select(t => (IOperator)Activator.CreateInstance(t)); 118 var newOperators = operators.Except(encodingOperators, new TypeEqualityComparer<IOperator>()).ToList(); 119 120 ConfigureOperators(newOperators); 121 encodingOperators.AddRange(newOperators); 122 } 123 #endregion 124 125 public void ConfigureOperators(IEnumerable<IOperator> operators) { 126 ConfigureCreators(operators.OfType<IBinaryVectorCreator>()); 127 ConfigureCrossovers(operators.OfType<IBinaryVectorCrossover>()); 128 ConfigureManipulators(operators.OfType<IBinaryVectorManipulator>()); 129 ConfigureMoveOperators(operators.OfType<IBinaryVectorMoveOperator>()); 130 ConfigureShakingOperators(operators.OfType<IBinaryVectorMultiNeighborhoodShakingOperator>()); 131 } 132 133 #region Specific Operator Wiring 134 private void ConfigureCreators(IEnumerable<IBinaryVectorCreator> creators) { 135 foreach (var creator in creators) { 136 creator.BinaryVectorParameter.ActualName = Name; 137 creator.LengthParameter.ActualName = LengthParameter.Name; 138 } 139 } 140 private void ConfigureCrossovers(IEnumerable<IBinaryVectorCrossover> crossovers) { 141 foreach (var crossover in crossovers) { 142 crossover.ParentsParameter.ActualName = Name; 143 crossover.ChildParameter.ActualName = Name; 144 } 145 } 146 private void ConfigureManipulators(IEnumerable<IBinaryVectorManipulator> manipulators) { 147 foreach (var manipulator in manipulators) { 148 manipulator.BinaryVectorParameter.ActualName = Name; 149 } 150 } 151 private void ConfigureMoveOperators(IEnumerable<IBinaryVectorMoveOperator> moveOperators) { 152 foreach (var moveOperator in moveOperators) { 153 moveOperator.BinaryVectorParameter.ActualName = Name; 154 } 155 } 156 private void ConfigureShakingOperators(IEnumerable<IBinaryVectorMultiNeighborhoodShakingOperator> shakingOperators) { 157 foreach (var shakingOperator in shakingOperators) { 158 shakingOperator.BinaryVectorParameter.ActualName = Name; 159 } 160 } 161 #endregion 57 162 } 58 163 } -
branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/Encoding.cs
r11550 r11553 25 25 using HeuristicLab.Common; 26 26 using HeuristicLab.Core; 27 using HeuristicLab.Optimization; 27 28 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 28 29 … … 35 36 } 36 37 37 [StorableConstructor]38 protected Encoding(bool deserializing) : base(deserializing) { }39 protected Encoding(Encoding original, Cloner cloner)40 : base(original, cloner) { }41 protected Encoding(string name) : base(name) { }42 43 38 public virtual IEnumerable<IValueParameter> Parameters { 44 39 get { return Enumerable.Empty<IValueParameter>(); } … … 50 45 } 51 46 47 public virtual ISolutionCreator DefaultSolutionCreator { 48 get { return null; } 49 } 50 51 [StorableConstructor] 52 protected Encoding(bool deserializing) : base(deserializing) { } 53 protected Encoding(Encoding original, Cloner cloner) 54 : base(original, cloner) { } 55 protected Encoding(string name) : base(name) { } 56 52 57 public event EventHandler ParameterConfigurationChanged; 53 58 protected virtual void OnParameterConfigurationChanged() { -
branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealEncoding.cs
r11550 r11553 76 76 } 77 77 78 public IRealVectorCreator DefaultSolutionCreator {78 public override ISolutionCreator DefaultSolutionCreator { 79 79 get { return Operators.OfType<UniformRandomRealVectorCreator>().First(); } 80 80 } … … 166 166 static RealEncoding() { 167 167 encodingSpecificOperatorTypes = new List<Type>() { 168 typeof (IRealVectorOperator), 168 169 typeof (IRealVectorCreator), 169 170 typeof (IRealVectorCrossover), -
branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/IEncoding.cs
r11550 r11553 25 25 using System.Text; 26 26 using HeuristicLab.Core; 27 using HeuristicLab.Optimization; 27 28 28 29 namespace HeuristicLab.Problems.Programmable { 29 public interface IEncoding : INamedItem { 30 30 public interface IEncoding : INamedItem 31 { 32 ISolutionCreator DefaultSolutionCreator { get; } 31 33 IEnumerable<IValueParameter> Parameters { get; } 32 34 IEnumerable<IOperator> Operators { get; } -
branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs
r11550 r11553 176 176 177 177 protected virtual ISolutionCreator ConfigureCreator(IEncoding encoding) { 178 #region Configure RealVector Creator 179 var realEnc = encoding as RealEncoding; 180 if (realEnc != null) { 181 DynamicEncodingParameters.AddRange(realEnc.Parameters); 182 return realEnc.DefaultSolutionCreator; 183 } 184 #endregion 185 #region Configure BinaryVector Creator 186 var binEnc = encoding as BinaryEncoding; 187 if (binEnc != null) { 188 DynamicEncodingParameters.AddRange(binEnc.Parameters); 189 return binEnc.DefaultSolutionCreator; 190 } 191 #endregion 178 192 #region Configure MultiEncoding Creator 179 193 var multiEncoding = encoding as MultiEncoding; … … 184 198 creator.Operators.Add(ConfigureCreator(enc)); 185 199 } 186 return creator;187 }188 #endregion189 #region Configure BinaryVector Creator190 var binEnc = encoding as BinaryEncoding;191 if (binEnc != null) {192 var p = new ValueParameter<IntValue>(binEnc.Name + "Length", binEnc.Length);193 DynamicEncodingParameters.Add(p);194 195 var creator = new RandomBinaryVectorCreator();196 creator.BinaryVectorParameter.ActualName = binEnc.Name;197 creator.LengthParameter.ActualName = p.Name;198 200 return creator; 199 201 } … … 212 214 creator.BoundsParameter.ActualName = b.Name; 213 215 return creator; 214 }215 #endregion216 #region Configure RealVector Creator217 var realEnc = encoding as RealEncoding;218 if (realEnc != null) {219 DynamicEncodingParameters.AddRange(realEnc.Parameters);220 return realEnc.DefaultSolutionCreator;221 216 } 222 217 #endregion … … 784 779 var binConfig = (BinaryEncoding)config.Encodings[paramName]; 785 780 IBinaryVectorCrossover binXo; 786 if (binConfig.Length .Value> 3) binXo = new Encodings.BinaryVectorEncoding.SinglePointCrossover();781 if (binConfig.Length > 3) binXo = new Encodings.BinaryVectorEncoding.SinglePointCrossover(); 787 782 else binXo = new Encodings.BinaryVectorEncoding.UniformCrossover(); 788 783 binXo.ChildParameter.ActualName = paramName; -
branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs
r11550 r11553 76 76 } 77 77 78 79 78 [StorableConstructor] 80 79 protected SingleObjectiveProgrammableProblem(bool deserializing) : base(deserializing) { } … … 193 192 DynamicEncodingParameters.AddRange(realEnc.Parameters); 194 193 return realEnc.DefaultSolutionCreator; 194 } 195 #endregion 196 #region Configure BinaryVector Creator 197 var binEnc = encoding as BinaryEncoding; 198 if (binEnc != null) { 199 DynamicEncodingParameters.AddRange(binEnc.Parameters); 200 return binEnc.DefaultSolutionCreator; 195 201 } 196 202 #endregion … … 206 212 } 207 213 #endregion 208 #region Configure BinaryVector Creator209 var binEnc = encoding as BinaryEncoding;210 if (binEnc != null) {211 var p = new ValueParameter<IntValue>(binEnc.Name + "Length", binEnc.Length);212 DynamicEncodingParameters.Add(p);213 214 var creator = new RandomBinaryVectorCreator();215 creator.BinaryVectorParameter.ActualName = binEnc.Name;216 creator.LengthParameter.ActualName = p.Name;217 return creator;218 }219 #endregion220 214 #region Configure IntegerVector Creator 221 215 var intEnc = encoding as IntegerEncoding; … … 261 255 262 256 #region Configure Operators for RealVectorEncoding 263 var realCreator = newCreator as IRealVectorCreator;264 257 var realEncoding = encoding as RealEncoding; 265 258 if (realEncoding != null) { 266 259 // do not replace a real vector creator that was manually set 267 260 if (!(SolutionCreator is IRealVectorCreator) 268 || 269 ((IRealVectorCreator)SolutionCreator).RealVectorParameter.ActualName != 270 realCreator.RealVectorParameter.ActualName) { 261 || ((IRealVectorCreator)SolutionCreator).RealVectorParameter.ActualName != realEncoding.Name) { 271 262 Operators.Remove(SolutionCreator); 272 263 SolutionCreator = newCreator; … … 276 267 su.MaximizationParameter.ActualName = MaximizationParameter.Name; 277 268 } 278 } 269 } 279 270 #endregion 280 271 #region Configure Operators for BinaryVectorEncoding 281 var binCreator = newCreator as IBinaryVectorCreator; 282 if (binCreator != null) { 283 var paramName = binCreator.BinaryVectorParameter.ActualName; 272 var binEncoding = encoding as BinaryEncoding; 273 if (binEncoding != null) { 284 274 // do not replace a binary vector creator that was manually set 285 if (!(SolutionCreator is IBinaryVectorCreator) || ((IBinaryVectorCreator)SolutionCreator).BinaryVectorParameter.ActualName != paramName) {275 if (!(SolutionCreator is IBinaryVectorCreator) || ((IBinaryVectorCreator)SolutionCreator).BinaryVectorParameter.ActualName != binEncoding.Name) { 286 276 Operators.Remove(SolutionCreator); 287 277 SolutionCreator = newCreator; 288 Operators.Add(SolutionCreator); 289 } 290 291 #region Wire BinaryVector Crossovers 292 var crossovers = Operators.OfType<IBinaryVectorCrossover>() 293 .Union(ApplicationManager.Manager.GetInstances<IBinaryVectorCrossover>(), new TypeEqualityComparer<IBinaryVectorCrossover>()) 294 .ToList(); 295 foreach (var xo in crossovers) { 296 xo.ChildParameter.ActualName = binCreator.BinaryVectorParameter.ActualName; 297 xo.ChildParameter.Hidden = true; 298 xo.ParentsParameter.ActualName = binCreator.BinaryVectorParameter.ActualName; 299 xo.ParentsParameter.Hidden = true; 300 } 301 Operators.AddRange(crossovers.Except(Operators.OfType<IBinaryVectorCrossover>())); 302 #endregion 303 #region Wire BinaryVector Manipulators 304 var manipulators = Operators.OfType<IBinaryVectorManipulator>() 305 .Union(ApplicationManager.Manager.GetInstances<IBinaryVectorManipulator>(), new TypeEqualityComparer<IBinaryVectorManipulator>()) 306 .ToList(); 307 foreach (var m in manipulators) { 308 m.BinaryVectorParameter.ActualName = binCreator.BinaryVectorParameter.ActualName; 309 m.BinaryVectorParameter.Hidden = true; 310 } 311 Operators.AddRange(manipulators.Except(Operators.OfType<IBinaryVectorManipulator>())); 312 #endregion 313 #region Wire BinaryVector ShakingOperators 314 var shakingOperators = Operators.OfType<IBinaryVectorMultiNeighborhoodShakingOperator>() 315 .Union(ApplicationManager.Manager.GetInstances<IBinaryVectorMultiNeighborhoodShakingOperator>(), new TypeEqualityComparer<IBinaryVectorMultiNeighborhoodShakingOperator>()) 316 .ToList(); 317 foreach (var so in shakingOperators) { 318 so.BinaryVectorParameter.ActualName = paramName; 319 so.BinaryVectorParameter.Hidden = true; 320 } 321 Operators.AddRange(shakingOperators.Except(Operators.OfType<IBinaryVectorMultiNeighborhoodShakingOperator>())); 322 #endregion 323 } else { 324 Operators.RemoveAll(x => x is IBinaryVectorCrossover 325 || x is IBinaryVectorManipulator 326 || x is IBinaryVectorMultiNeighborhoodShakingOperator); 278 } 327 279 } 328 280 #endregion … … 714 666 var binConfig = (BinaryEncoding)config.Encodings[paramName]; 715 667 IBinaryVectorCrossover binXo; 716 if (binConfig.Length .Value> 3) binXo = new Encodings.BinaryVectorEncoding.SinglePointCrossover();668 if (binConfig.Length > 3) binXo = new Encodings.BinaryVectorEncoding.SinglePointCrossover(); 717 669 else binXo = new Encodings.BinaryVectorEncoding.UniformCrossover(); 718 670 binXo.ChildParameter.ActualName = paramName;
Note: See TracChangeset
for help on using the changeset viewer.