Changeset 11484 for branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs
- Timestamp:
- 10/21/14 18:49:05 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs
r11400 r11484 54 54 } 55 55 56 public IValueParameter<IMultiObjectiveProblemDefinition Host> ProblemDefinitionParameter {57 get { return (IValueParameter<IMultiObjectiveProblemDefinition Host>)Parameters["ProblemDefinition"]; }58 } 59 60 protected IValueParameter< Configuration> ConfigurationParameter {61 get { return (IValueParameter< Configuration>)Parameters["Configuration"]; }62 } 63 64 public IMultiObjectiveProblemDefinition HostProblemDefinition {56 public IValueParameter<IMultiObjectiveProblemDefinition> ProblemDefinitionParameter { 57 get { return (IValueParameter<IMultiObjectiveProblemDefinition>)Parameters["ProblemDefinition"]; } 58 } 59 60 protected IValueParameter<Encoding> EncodingParameter { 61 get { return (IValueParameter<Encoding>)Parameters["Encoding"]; } 62 } 63 64 public IMultiObjectiveProblemDefinition ProblemDefinition { 65 65 get { return ProblemDefinitionParameter.Value; } 66 66 set { ProblemDefinitionParameter.Value = value; } … … 68 68 69 69 [Storable] 70 protected List<IParameter> Dynamic ConfigurationParameters;70 protected List<IParameter> DynamicEncodingParameters; 71 71 72 72 [StorableConstructor] … … 74 74 protected MultiObjectiveProgrammableProblem(MultiObjectiveProgrammableProblem original, Cloner cloner) 75 75 : base(original, cloner) { 76 Dynamic ConfigurationParameters = original.DynamicConfigurationParameters.Select(cloner.Clone).ToList();76 DynamicEncodingParameters = original.DynamicEncodingParameters.Select(cloner.Clone).ToList(); 77 77 RegisterEventHandlers(); 78 78 } 79 79 public MultiObjectiveProgrammableProblem() 80 : base(new MultiObjectiveEvaluator(), new ParameterVectorCreater()) {81 Parameters.Add(new ValueParameter<IMultiObjectiveProblemDefinition Host>("ProblemDefinition", "Defines the problem.", new MultiObjectiveProblemDefinitionScript() { Name = Name }));82 Parameters.Add(new ValueParameter< Configuration>("Configuration", "Describes which parameters exist, what they're called, what type they are and their bounds if any."));83 84 Dynamic ConfigurationParameters = new List<IParameter>();80 : base(new MultiObjectiveEvaluator(), new MultiEncodingCreator()) { 81 Parameters.Add(new ValueParameter<IMultiObjectiveProblemDefinition>("ProblemDefinition", "Defines the problem.", new MultiObjectiveProblemScript() { Name = Name })); 82 Parameters.Add(new ValueParameter<Encoding>("Encoding", "Describes which parameters exist, what they're called, what type they are and their bounds if any.")); 83 84 DynamicEncodingParameters = new List<IParameter>(); 85 85 86 86 Operators.Add(new MultiObjectiveAnalyzer()); … … 113 113 114 114 private void RegisterHostInstanceChanges() { 115 ProblemDefinitionParameter.Value. InstanceChanged += ProblemDefinitionHostOnInstanceChanged;115 ProblemDefinitionParameter.Value.ProblemDefinitionChanged += ProblemDefinitionChanged; 116 116 ProblemDefinitionParameter.Value.NameChanged += ProblemDefinitionHostOnNameChanged; 117 117 } … … 132 132 } 133 133 134 protected virtual void ProblemDefinition HostOnInstanceChanged(object sender, EventArgs eventArgs) {134 protected virtual void ProblemDefinitionChanged(object sender, EventArgs eventArgs) { 135 135 Parameterize(); 136 136 } 137 137 138 138 protected virtual void Parameterize() { 139 var instance = ProblemDefinitionParameter.Value.Instance;140 if ( instance== null) return;141 142 Configuration configuration;139 var definition = ProblemDefinitionParameter.Value; 140 if (definition == null) return; 141 142 Encoding encoding; 143 143 try { 144 configuration = instance.GetConfiguration();144 encoding = definition.Encoding; 145 145 } catch { return; } 146 ConfigurationParameter.Value = configuration;147 Maximization = new BoolArray( instance.Maximization);148 149 Evaluator. ConfigurationParameter.ActualName = ConfigurationParameter.Name;146 EncodingParameter.Value = encoding; 147 Maximization = new BoolArray(definition.Maximization); 148 149 Evaluator.EncodingParameter.ActualName = EncodingParameter.Name; 150 150 Evaluator.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name; 151 151 foreach (var evalOp in Operators.OfType<IMultiObjectiveProgrammableProblemEvaluator>()) { 152 evalOp. ConfigurationParameter.ActualName = ConfigurationParameter.Name;152 evalOp.EncodingParameter.ActualName = EncodingParameter.Name; 153 153 evalOp.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name; 154 154 } 155 155 foreach (var analyzeOp in Operators.OfType<IMultiObjectiveProgrammableProblemAnalyzer>()) { 156 analyzeOp. ConfigurationParameter.ActualName = ConfigurationParameter.Name;156 analyzeOp.EncodingParameter.ActualName = EncodingParameter.Name; 157 157 analyzeOp.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name; 158 158 analyzeOp.QualitiesParameter.ActualName = Evaluator.QualitiesParameter.ActualName; 159 159 } 160 160 161 var solutionCreators = UpdateDynamicConfigurationParameters(configuration); 162 163 if (solutionCreators.Count == 1) { 164 Operators.RemoveAll(x => x is ParameterVectorCrossover 165 || x is ParameterVectorManipulator); 166 UpdateSingleVectorEncodingOperators(solutionCreators, configuration); 167 } else { 168 UpdateMultiVectorEncodingOperators(solutionCreators, configuration); 169 } 170 UpdateMoveOperators(); 171 } 172 173 protected virtual List<ISolutionCreator> UpdateDynamicConfigurationParameters(Configuration configuration) { 174 foreach (var param in DynamicConfigurationParameters) 161 foreach (var param in DynamicEncodingParameters) 175 162 if (Parameters.Contains(param)) Parameters.Remove(param); 176 DynamicConfigurationParameters.Clear(); 177 178 var solutionCreators = new List<ISolutionCreator>(); 179 foreach (var param in configuration.Parameters) { 180 #region Configure BinaryVector Creator 181 var binConfig = param.Value as BinaryParameterConfiguration; 182 if (binConfig != null) { 183 var p = new ValueParameter<IntValue>(param.Key + "Length", binConfig.Length); 184 DynamicConfigurationParameters.Add(p); 185 186 var creator = new RandomBinaryVectorCreator(); 187 creator.BinaryVectorParameter.ActualName = param.Key; 188 creator.LengthParameter.ActualName = p.Name; 189 solutionCreators.Add(creator); 190 } 191 #endregion 192 #region Configure IntegerVector Creator 193 var intConfig = param.Value as IntegerParameterConfiguration; 194 if (intConfig != null) { 195 var l = new ValueParameter<IntValue>(param.Key + "Length", intConfig.Length); 196 var b = new ValueParameter<IntMatrix>(param.Key + "Bounds", intConfig.Bounds); 197 DynamicConfigurationParameters.Add(l); 198 DynamicConfigurationParameters.Add(b); 199 200 var creator = new UniformRandomIntegerVectorCreator(); 201 creator.IntegerVectorParameter.ActualName = param.Key; 202 creator.LengthParameter.ActualName = l.Name; 203 creator.BoundsParameter.ActualName = b.Name; 204 solutionCreators.Add(creator); 205 } 206 #endregion 207 #region Configure RealVector Creator 208 var realConfig = param.Value as RealParameterConfiguration; 209 if (realConfig != null) { 210 var l = new ValueParameter<IntValue>(param.Key + "Length", realConfig.Length); 211 var b = new ValueParameter<DoubleMatrix>(param.Key + "Bounds", realConfig.Bounds); 212 DynamicConfigurationParameters.Add(l); 213 DynamicConfigurationParameters.Add(b); 214 215 var creator = new UniformRandomRealVectorCreator(); 216 creator.RealVectorParameter.ActualName = param.Key; 217 creator.LengthParameter.ActualName = l.Name; 218 creator.BoundsParameter.ActualName = b.Name; 219 solutionCreators.Add(creator); 220 } 221 #endregion 222 #region Configure Permutation Creator 223 var permConfig = param.Value as PermutationParameterConfiguration; 224 if (permConfig != null) { 225 var l = new ValueParameter<IntValue>(param.Key + "Length", permConfig.Length); 226 DynamicConfigurationParameters.Add(l); 227 228 var creator = new RandomPermutationCreator(); 229 creator.PermutationParameter.ActualName = param.Key; 230 creator.LengthParameter.ActualName = l.Name; 231 creator.PermutationTypeParameter.Value = permConfig.Type; 232 solutionCreators.Add(creator); 233 } 234 #endregion 235 } 236 237 foreach (var param in DynamicConfigurationParameters) { 163 DynamicEncodingParameters.Clear(); 164 165 var creator = ConfigureCreator(encoding); 166 167 foreach (var param in DynamicEncodingParameters) { 238 168 param.Hidden = true; 239 169 Parameters.Add(param); 240 170 } 241 return solutionCreators; 242 } 243 244 protected virtual void UpdateSingleVectorEncodingOperators(List<ISolutionCreator> solutionCreators, Configuration configuration) { 245 var newCreator = solutionCreators.Single(); 171 172 var multiEncoding = encoding as MultiEncoding; 173 if (multiEncoding != null) { 174 ConfigureMultiVectorEncodingOperators((MultiEncodingCreator)creator, multiEncoding); 175 } else { 176 ConfigureSingleEncodingOperators(creator, encoding); 177 } 178 } 179 180 protected virtual ISolutionCreator ConfigureCreator(Encoding encoding) { 181 #region Configure MultiEncoding Creator 182 var multiEncoding = encoding as MultiEncoding; 183 if (multiEncoding != null) { 184 var creator = new MultiEncodingCreator(); 185 foreach (var enc in multiEncoding.Encodings) { 186 if (enc is MultiEncoding) throw new InvalidOperationException("MultiEncoding within a MultiEncoding is not supported."); 187 creator.Operators.Add(ConfigureCreator(enc)); 188 } 189 return creator; 190 } 191 #endregion 192 #region Configure BinaryVector Creator 193 var binEnc = encoding as BinaryEncoding; 194 if (binEnc != null) { 195 var p = new ValueParameter<IntValue>(binEnc.Name + "Length", binEnc.Length); 196 DynamicEncodingParameters.Add(p); 197 198 var creator = new RandomBinaryVectorCreator(); 199 creator.BinaryVectorParameter.ActualName = binEnc.Name; 200 creator.LengthParameter.ActualName = p.Name; 201 return creator; 202 } 203 #endregion 204 #region Configure IntegerVector Creator 205 var intEnc = encoding as IntegerEncoding; 206 if (intEnc != null) { 207 var l = new ValueParameter<IntValue>(intEnc.Name + "Length", intEnc.Length); 208 var b = new ValueParameter<IntMatrix>(intEnc.Name + "Bounds", intEnc.Bounds); 209 DynamicEncodingParameters.Add(l); 210 DynamicEncodingParameters.Add(b); 211 212 var creator = new UniformRandomIntegerVectorCreator(); 213 creator.IntegerVectorParameter.ActualName = intEnc.Name; 214 creator.LengthParameter.ActualName = l.Name; 215 creator.BoundsParameter.ActualName = b.Name; 216 return creator; 217 } 218 #endregion 219 #region Configure RealVector Creator 220 var realEnc = encoding as RealEncoding; 221 if (realEnc != null) { 222 var l = new ValueParameter<IntValue>(realEnc.Name + "Length", realEnc.Length); 223 var b = new ValueParameter<DoubleMatrix>(realEnc.Name + "Bounds", realEnc.Bounds); 224 DynamicEncodingParameters.Add(l); 225 DynamicEncodingParameters.Add(b); 226 227 var creator = new UniformRandomRealVectorCreator(); 228 creator.RealVectorParameter.ActualName = realEnc.Name; 229 creator.LengthParameter.ActualName = l.Name; 230 creator.BoundsParameter.ActualName = b.Name; 231 return creator; 232 } 233 #endregion 234 #region Configure Permutation Creator 235 var permEnc = encoding as PermutationEncoding; 236 if (permEnc != null) { 237 var l = new ValueParameter<IntValue>(permEnc.Name + "Length", permEnc.Length); 238 DynamicEncodingParameters.Add(l); 239 240 var creator = new RandomPermutationCreator(); 241 creator.PermutationParameter.ActualName = permEnc.Name; 242 creator.LengthParameter.ActualName = l.Name; 243 creator.PermutationTypeParameter.Value = permEnc.Type; 244 return creator; 245 } 246 #endregion 247 throw new ArgumentException(string.Format("Encoding {0} is unknown.", encoding != null ? encoding.GetType().FullName : "(null)")); 248 } 249 250 protected virtual void ConfigureSingleEncodingOperators(ISolutionCreator newCreator, Encoding encoding) { 251 // remove all multiencoding operators 252 Operators.RemoveAll(x => x is MultiEncodingCrossover 253 || x is MultiEncodingManipulator 254 || x is MultiEncodingCreator); 255 246 256 #region Configure Operators for BinaryVectorEncoding 247 257 var binCreator = newCreator as IBinaryVectorCreator; … … 256 266 257 267 #region Wire BinaryVector Crossovers 258 Operators.RemoveAll(x => x is IBinaryVectorCrossover && ((IBinaryVectorCrossover)x).ChildParameter.ActualName != paramName); 259 var crossovers = ApplicationManager.Manager.GetInstances<IBinaryVectorCrossover>().ToList(); 268 var crossovers = Operators.OfType<IBinaryVectorCrossover>() 269 .Union(ApplicationManager.Manager.GetInstances<IBinaryVectorCrossover>(), new TypeEqualityComparer<IBinaryVectorCrossover>()) 270 .ToList(); 260 271 foreach (var xo in crossovers) { 261 272 xo.ChildParameter.ActualName = binCreator.BinaryVectorParameter.ActualName; … … 264 275 xo.ParentsParameter.Hidden = true; 265 276 } 266 Operators.AddRange(crossovers. Where(x => Operators.All(y => x.GetType() != y.GetType())));277 Operators.AddRange(crossovers.Except(Operators.OfType<IBinaryVectorCrossover>())); 267 278 #endregion 268 279 #region Wire BinaryVector Manipulators 269 Operators.RemoveAll(x => x is IBinaryVectorManipulator && ((IBinaryVectorManipulator)x).BinaryVectorParameter.ActualName != paramName); 270 var manipulators = ApplicationManager.Manager.GetInstances<IBinaryVectorManipulator>().ToList(); 280 var manipulators = Operators.OfType<IBinaryVectorManipulator>() 281 .Union(ApplicationManager.Manager.GetInstances<IBinaryVectorManipulator>(), new TypeEqualityComparer<IBinaryVectorManipulator>()) 282 .ToList(); 271 283 foreach (var m in manipulators) { 272 284 m.BinaryVectorParameter.ActualName = binCreator.BinaryVectorParameter.ActualName; 273 285 m.BinaryVectorParameter.Hidden = true; 274 286 } 275 Operators.AddRange(manipulators. Where(x => Operators.All(y => x.GetType() != y.GetType())));287 Operators.AddRange(manipulators.Except(Operators.OfType<IBinaryVectorManipulator>())); 276 288 #endregion 277 289 #region Wire BinaryVector ShakingOperators 278 Operators.RemoveAll(x => x is IBinaryVectorMultiNeighborhoodShakingOperator && ((IBinaryVectorManipulator)x).BinaryVectorParameter.ActualName != paramName); 279 var shakingOperators = ApplicationManager.Manager.GetInstances<IBinaryVectorMultiNeighborhoodShakingOperator>().ToList(); 290 var shakingOperators = Operators.OfType<IBinaryVectorMultiNeighborhoodShakingOperator>() 291 .Union(ApplicationManager.Manager.GetInstances<IBinaryVectorMultiNeighborhoodShakingOperator>(), new TypeEqualityComparer<IBinaryVectorMultiNeighborhoodShakingOperator>()) 292 .ToList(); 280 293 foreach (var so in shakingOperators) { 281 294 so.BinaryVectorParameter.ActualName = paramName; 282 295 so.BinaryVectorParameter.Hidden = true; 283 296 } 284 Operators.AddRange(shakingOperators. Where(x => Operators.All(y => x.GetType() != y.GetType())));297 Operators.AddRange(shakingOperators.Except(Operators.OfType<IBinaryVectorMultiNeighborhoodShakingOperator>())); 285 298 #endregion 286 299 } else { … … 303 316 304 317 #region Wire IntegerVector Crossovers 305 Operators.RemoveAll(x => x is IIntegerVectorCrossover && ((IIntegerVectorCrossover)x).ChildParameter.ActualName != paramName); 306 var crossovers = ApplicationManager.Manager.GetInstances<IIntegerVectorCrossover>().ToList(); 318 var crossovers = Operators.OfType<IIntegerVectorCrossover>() 319 .Union(ApplicationManager.Manager.GetInstances<IIntegerVectorCrossover>(), new TypeEqualityComparer<IIntegerVectorCrossover>()) 320 .ToList(); 307 321 foreach (var xo in crossovers) { 308 322 xo.ChildParameter.ActualName = intCreator.IntegerVectorParameter.ActualName; … … 316 330 } 317 331 } 318 Operators.AddRange(crossovers. Where(x => Operators.All(y => x.GetType() != y.GetType())));332 Operators.AddRange(crossovers.Except(Operators.OfType<IIntegerVectorCrossover>())); 319 333 #endregion 320 334 #region Wire IntegerVector Manipulators 321 Operators.RemoveAll(x => x is IIntegerVectorManipulator && ((IIntegerVectorManipulator)x).IntegerVectorParameter.ActualName != paramName); 322 var manipulators = ApplicationManager.Manager.GetInstances<IIntegerVectorManipulator>().ToList(); 335 var manipulators = Operators.OfType<IIntegerVectorManipulator>() 336 .Union(ApplicationManager.Manager.GetInstances<IIntegerVectorManipulator>(), new TypeEqualityComparer<IIntegerVectorManipulator>()) 337 .ToList(); 323 338 foreach (var m in manipulators) { 324 339 m.IntegerVectorParameter.ActualName = intCreator.IntegerVectorParameter.ActualName; … … 338 353 } 339 354 } 340 Operators.AddRange(manipulators. Where(x => Operators.All(y => x.GetType() != y.GetType())));355 Operators.AddRange(manipulators.Except(Operators.OfType<IIntegerVectorManipulator>())); 341 356 #region Wire IntegerVector StrategyParameters for SelfAdaptiveManipulators 342 Operators.RemoveAll(x => x is IStrategyParameterCreator && !(x is IIntegerVectorStdDevStrategyParameterCreator) || x is IIntegerVectorStdDevStrategyParameterCreator && ((IIntegerVectorStdDevStrategyParameterCreator)x).StrategyParameterParameter.ActualName != paramName + "Strategy"); 343 Operators.RemoveAll(x => x is IStrategyParameterManipulator && !(x is IIntegerVectorStdDevStrategyParameterManipulator) || x is IIntegerVectorStdDevStrategyParameterManipulator && ((IIntegerVectorStdDevStrategyParameterManipulator)x).StrategyParameterParameter.ActualName != paramName + "Strategy"); 344 Operators.RemoveAll(x => x is IStrategyParameterCrossover && !(x is IIntegerVectorStdDevStrategyParameterCrossover) || x is IIntegerVectorStdDevStrategyParameterCrossover && ((IIntegerVectorStdDevStrategyParameterCrossover)x).StrategyParameterParameter.ActualName != paramName + "Strategy"); 345 var strategyOperators = ApplicationManager.Manager.GetInstances<IIntegerVectorStdDevStrategyParameterOperator>().ToList(); 346 if (!(configuration.Parameters.First().Value is IntegerParameterConfiguration)) throw new InvalidOperationException("Single-encoded problem with integervector creator that is not an integer-coded problem."); 347 var problemSize = ((IntegerParameterConfiguration)configuration.Parameters.First().Value).Length.Value; 348 var b = ((IntegerParameterConfiguration)configuration.Parameters.First().Value).Bounds; 357 var strategyOperators = Operators.OfType<IIntegerVectorStdDevStrategyParameterOperator>() 358 .Union(ApplicationManager.Manager.GetInstances<IIntegerVectorStdDevStrategyParameterOperator>(), new TypeEqualityComparer<IIntegerVectorStdDevStrategyParameterOperator>()) 359 .ToList(); 360 var problemSize = ((IntegerEncoding)encoding).Length.Value; 361 var b = ((IntegerEncoding)encoding).Bounds; 349 362 var bounds = new DoubleMatrix(b.Rows, b.Columns); 350 363 for (var i = 0; i < bounds.Rows; i++) { … … 376 389 } 377 390 } 378 Operators.AddRange(strategyOperators. Where(x => Operators.All(y => x.GetType() != y.GetType())));391 Operators.AddRange(strategyOperators.Except(Operators.OfType<IIntegerVectorStdDevStrategyParameterOperator>())); 379 392 #endregion 380 393 #endregion 381 394 #region Wire IntegerVector ShakingOperators 382 Operators.RemoveAll(x => x is IIntegerVectorMultiNeighborhoodShakingOperator && ((IIntegerVectorMultiNeighborhoodShakingOperator)x).IntegerVectorParameter.ActualName != paramName); 383 var shakingOperators = ApplicationManager.Manager.GetInstances<IIntegerVectorMultiNeighborhoodShakingOperator>().ToList(); 395 var shakingOperators = Operators.OfType<IIntegerVectorMultiNeighborhoodShakingOperator>() 396 .Union(ApplicationManager.Manager.GetInstances<IIntegerVectorMultiNeighborhoodShakingOperator>(), new TypeEqualityComparer<IIntegerVectorMultiNeighborhoodShakingOperator>()) 397 .ToList(); 384 398 foreach (var so in shakingOperators) { 385 399 so.IntegerVectorParameter.ActualName = paramName; 386 400 so.IntegerVectorParameter.Hidden = true; 387 401 } 388 Operators.AddRange(shakingOperators. Where(x => Operators.All(y => x.GetType() != y.GetType())));402 Operators.AddRange(shakingOperators.Except(Operators.OfType<IIntegerVectorMultiNeighborhoodShakingOperator>())); 389 403 #endregion 390 404 } else { … … 408 422 409 423 #region Wire RealVector Crossovers 410 Operators.RemoveAll(x => x is IRealVectorCrossover && ((IRealVectorCrossover)x).ChildParameter.ActualName != paramName); 411 var crossovers = ApplicationManager.Manager.GetInstances<IRealVectorCrossover>().ToList(); 424 var crossovers = Operators.OfType<IRealVectorCrossover>() 425 .Union(ApplicationManager.Manager.GetInstances<IRealVectorCrossover>(), new TypeEqualityComparer<IRealVectorCrossover>()) 426 .ToList(); 412 427 foreach (var xo in crossovers) { 413 428 xo.ChildParameter.ActualName = paramName; … … 418 433 xo.BoundsParameter.Hidden = true; 419 434 } 420 Operators.AddRange(crossovers. Where(x => Operators.All(y => x.GetType() != y.GetType())));435 Operators.AddRange(crossovers.Except(Operators.OfType<IRealVectorCrossover>())); 421 436 #endregion 422 437 #region Wire RealVector Manipulators 423 Operators.RemoveAll(x => x is IRealVectorManipulator && ((IRealVectorManipulator)x).RealVectorParameter.ActualName != paramName); 424 var manipulators = ApplicationManager.Manager.GetInstances<IRealVectorManipulator>().ToList(); 438 var manipulators = Operators.OfType<IRealVectorManipulator>() 439 .Union(ApplicationManager.Manager.GetInstances<IRealVectorManipulator>(), new TypeEqualityComparer<IRealVectorManipulator>()) 440 .ToList(); 425 441 foreach (var m in manipulators) { 426 442 m.RealVectorParameter.ActualName = paramName; … … 437 453 } 438 454 } 439 Operators.AddRange(manipulators. Where(x => Operators.All(y => x.GetType() != y.GetType())));455 Operators.AddRange(manipulators.Except(Operators.OfType<IRealVectorManipulator>())); 440 456 #region Wire RealVector Strategy Parameters for SelfAdaptiveManipulators 441 442 Operators.RemoveAll(x => x is IStrategyParameterCreator && !(x is IRealVectorStdDevStrategyParameterCreator) || x is IRealVectorStdDevStrategyParameterCreator && ((IRealVectorStdDevStrategyParameterCreator)x).StrategyParameterParameter.ActualName != paramName + "Strategy"); 443 Operators.RemoveAll(x => x is IStrategyParameterManipulator && !(x is IRealVectorStdDevStrategyParameterManipulator) || x is IRealVectorStdDevStrategyParameterManipulator && ((IRealVectorStdDevStrategyParameterManipulator)x).StrategyParameterParameter.ActualName != paramName + "Strategy"); 444 Operators.RemoveAll(x => x is IStrategyParameterCrossover && !(x is IRealVectorStdDevStrategyParameterCrossover) || x is IRealVectorStdDevStrategyParameterCrossover && ((IRealVectorStdDevStrategyParameterCrossover)x).StrategyParameterParameter.ActualName != paramName + "Strategy"); 445 var strategyOperators = ApplicationManager.Manager.GetInstances<IRealVectorStdDevStrategyParameterOperator>().ToList(); 446 if (!(configuration.Parameters.First().Value is RealParameterConfiguration)) throw new InvalidOperationException("Single-encoded problem with realvector creator that is not a real-coded problem."); 447 var problemSize = ((RealParameterConfiguration)configuration.Parameters.First().Value).Length.Value; 448 var bounds = (DoubleMatrix)((RealParameterConfiguration)configuration.Parameters.First().Value).Bounds.Clone(); 457 var strategyOperators = Operators.OfType<IRealVectorStdDevStrategyParameterOperator>() 458 .Union(ApplicationManager.Manager.GetInstances<IRealVectorStdDevStrategyParameterOperator>(), new TypeEqualityComparer<IRealVectorStdDevStrategyParameterOperator>()) 459 .ToList(); 460 var problemSize = ((RealEncoding)encoding).Length.Value; 461 var bounds = (DoubleMatrix)((RealEncoding)encoding).Bounds.Clone(); 449 462 for (var i = 0; i < bounds.Rows; i++) { 450 463 bounds[i, 1] = 0.1 * (bounds[i, 1] - bounds[i, 0]); … … 474 487 } 475 488 } 476 Operators.AddRange(strategyOperators. Where(x => Operators.All(y => x.GetType() != y.GetType())));489 Operators.AddRange(strategyOperators.Except(Operators.OfType<IRealVectorStdDevStrategyParameterOperator>())); 477 490 #endregion 478 491 #endregion 479 492 #region Wire RealVector ParticleCreators 480 Operators.RemoveAll(x => x is IRealVectorParticleCreator && ((IRealVectorParticleCreator)x).RealVectorParameter.ActualName != paramName); 481 var particleCreators = ApplicationManager.Manager.GetInstances<IRealVectorParticleCreator>().ToList(); 493 var particleCreators = Operators.OfType<IRealVectorParticleCreator>() 494 .Union(ApplicationManager.Manager.GetInstances<IRealVectorParticleCreator>(), new TypeEqualityComparer<IRealVectorParticleCreator>()) 495 .ToList(); 482 496 foreach (var pc in particleCreators) { 483 497 pc.RealVectorParameter.ActualName = paramName; … … 488 502 pc.ProblemSizeParameter.Hidden = true; 489 503 } 490 Operators.AddRange(particleCreators. Where(x => Operators.All(y => x.GetType() != y.GetType())));504 Operators.AddRange(particleCreators.Except(Operators.OfType<IRealVectorParticleCreator>())); 491 505 #endregion 492 506 #region Wire RealVector ParticleUpdaters 493 Operators.RemoveAll(x => x is IRealVectorParticleUpdater && ((IRealVectorParticleUpdater)x).RealVectorParameter.ActualName != paramName); 494 var particleUpdaters = ApplicationManager.Manager.GetInstances<IRealVectorParticleUpdater>().ToList(); 507 var particleUpdaters = Operators.OfType<IRealVectorParticleUpdater>() 508 .Union(ApplicationManager.Manager.GetInstances<IRealVectorParticleUpdater>(), new TypeEqualityComparer<IRealVectorParticleUpdater>()) 509 .ToList(); 495 510 foreach (var pu in particleUpdaters) { 496 511 pu.RealVectorParameter.ActualName = paramName; … … 499 514 pu.BoundsParameter.Hidden = true; 500 515 } 501 Operators.AddRange(particleUpdaters. Where(x => Operators.All(y => x.GetType() != y.GetType())));516 Operators.AddRange(particleUpdaters.Except(Operators.OfType<IRealVectorParticleUpdater>())); 502 517 #endregion 503 518 #region Wire RealVector SwarmUpdaters 504 Operators.RemoveAll(x => x is IRealVectorSwarmUpdater && ((IRealVectorSwarmUpdater)x).RealVectorParameter.ActualName != paramName); 505 var swarmUpdaters = ApplicationManager.Manager.GetInstances<IRealVectorSwarmUpdater>().ToList(); 519 var swarmUpdaters = Operators.OfType<IRealVectorSwarmUpdater>() 520 .Union(ApplicationManager.Manager.GetInstances<IRealVectorSwarmUpdater>(), new TypeEqualityComparer<IRealVectorSwarmUpdater>()) 521 .ToList(); 506 522 foreach (var su in swarmUpdaters) { 507 523 su.RealVectorParameter.ActualName = paramName; … … 510 526 su.MaximizationParameter.Hidden = true; 511 527 } 512 Operators.AddRange(swarmUpdaters. Where(x => Operators.All(y => x.GetType() != y.GetType())));528 Operators.AddRange(swarmUpdaters.Except(Operators.OfType<IRealVectorSwarmUpdater>())); 513 529 #endregion 514 530 #region Wire RealVector ShakingOperators 515 Operators.RemoveAll(x => x is IRealVectorMultiNeighborhoodShakingOperator && ((IRealVectorMultiNeighborhoodShakingOperator)x).RealVectorParameter.ActualName != paramName); 516 var shakingOperators = ApplicationManager.Manager.GetInstances<IRealVectorMultiNeighborhoodShakingOperator>().ToList(); 531 var shakingOperators = Operators.OfType<IRealVectorMultiNeighborhoodShakingOperator>() 532 .Union(ApplicationManager.Manager.GetInstances<IRealVectorMultiNeighborhoodShakingOperator>(), new TypeEqualityComparer<IRealVectorMultiNeighborhoodShakingOperator>()) 533 .ToList(); 517 534 foreach (var so in shakingOperators) { 518 535 so.RealVectorParameter.ActualName = paramName; 519 536 so.RealVectorParameter.Hidden = true; 520 537 } 521 Operators.AddRange(shakingOperators. Where(x => Operators.All(y => x.GetType() != y.GetType())));538 Operators.AddRange(shakingOperators.Except(Operators.OfType<IRealVectorMultiNeighborhoodShakingOperator>())); 522 539 #endregion 523 540 } else { … … 544 561 545 562 #region Wire Permutation Crossovers 546 Operators.RemoveAll(x => x is IPermutationCrossover && ((IPermutationCrossover)x).ChildParameter.ActualName != paramName); 547 var crossovers = ApplicationManager.Manager.GetInstances<IPermutationCrossover>().ToList(); 563 var crossovers = Operators.OfType<IPermutationCrossover>() 564 .Union(ApplicationManager.Manager.GetInstances<IPermutationCrossover>(), new TypeEqualityComparer<IPermutationCrossover>()) 565 .ToList(); 548 566 foreach (var xo in crossovers) { 549 567 xo.ChildParameter.ActualName = permCreator.PermutationParameter.ActualName; … … 552 570 xo.ParentsParameter.Hidden = true; 553 571 } 554 Operators.AddRange(crossovers. Where(x => Operators.All(y => x.GetType() != y.GetType())));572 Operators.AddRange(crossovers.Except(Operators.OfType<IPermutationCrossover>())); 555 573 #endregion 556 574 #region Wire Permutation Manipulators 557 Operators.RemoveAll(x => x is IPermutationManipulator && ((IPermutationManipulator)x).PermutationParameter.ActualName != paramName); 558 var manipulators = ApplicationManager.Manager.GetInstances<IPermutationManipulator>().ToList(); 575 var manipulators = Operators.OfType<IPermutationManipulator>() 576 .Union(ApplicationManager.Manager.GetInstances<IPermutationManipulator>(), new TypeEqualityComparer<IPermutationManipulator>()) 577 .ToList(); 559 578 foreach (var m in manipulators) { 560 579 m.PermutationParameter.ActualName = permCreator.PermutationParameter.ActualName; 561 580 m.PermutationParameter.Hidden = true; 562 581 } 563 Operators.AddRange(manipulators.Where(x => Operators.All(y => x.GetType() != y.GetType()))); 564 #endregion 565 #region Wire ShakingOperators 566 Operators.RemoveAll(x => x is IPermutationMultiNeighborhoodShakingOperator && ((IPermutationMultiNeighborhoodShakingOperator)x).PermutationParameter.ActualName != paramName); 567 var shakingOperators = ApplicationManager.Manager.GetInstances<IPermutationMultiNeighborhoodShakingOperator>().ToList(); 582 Operators.AddRange(manipulators.Except(Operators.OfType<IPermutationManipulator>())); 583 #endregion 584 #region Wire Permutation ShakingOperators 585 var shakingOperators = Operators.OfType<IPermutationMultiNeighborhoodShakingOperator>() 586 .Union(ApplicationManager.Manager.GetInstances<IPermutationMultiNeighborhoodShakingOperator>(), new TypeEqualityComparer<IPermutationMultiNeighborhoodShakingOperator>()) 587 .ToList(); 568 588 foreach (var op in shakingOperators) { 569 589 op.PermutationParameter.ActualName = paramName; 570 590 op.PermutationParameter.Hidden = true; 571 591 } 572 Operators.AddRange(shakingOperators. Where(x => Operators.All(y => x.GetType() != y.GetType())));592 Operators.AddRange(shakingOperators.Except(Operators.OfType<IPermutationMultiNeighborhoodShakingOperator>())); 573 593 #endregion 574 594 } else { … … 580 600 } 581 601 582 protected virtual void UpdateMultiVectorEncodingOperators(List<ISolutionCreator> solutionCreators, Configuration configuration) { 583 var oldCreator = SolutionCreator as ParameterVectorCreater; 584 var newCreator = new ParameterVectorCreater(); 585 586 #region Configure BinaryVector Creator 587 var newBinParams = new HashSet<string>(solutionCreators.OfType<IBinaryVectorCreator>().Select(x => x.BinaryVectorParameter.ActualName)); 588 if (oldCreator != null) { 589 // we want to reuse the old creator 590 var oldParams = new HashSet<string>(oldCreator.Operators.OfType<IBinaryVectorCreator>() 591 .Select(x => x.BinaryVectorParameter.ActualName)); 592 foreach (var toAdd in newBinParams.Except(oldParams)) { 593 var paramName = toAdd; 594 oldCreator.Operators.Add( 595 solutionCreators.OfType<IBinaryVectorCreator>().Single(x => x.BinaryVectorParameter.ActualName == paramName)); 596 } 597 foreach (var toRemove in oldParams.Except(newBinParams)) { 598 var paramName = toRemove; 599 var op = 600 oldCreator.Operators.OfType<IBinaryVectorCreator>() 601 .SingleOrDefault(x => x.BinaryVectorParameter.ActualName == paramName); 602 protected virtual void ConfigureMultiVectorEncodingOperators(MultiEncodingCreator newCreator, MultiEncoding encoding) { 603 var newBinParams = new HashSet<string>(newCreator.Operators.OfType<IBinaryVectorCreator>().Select(x => x.BinaryVectorParameter.ActualName)); 604 var newIntParams = new HashSet<string>(newCreator.Operators.OfType<IIntegerVectorCreator>().Select(x => x.IntegerVectorParameter.ActualName)); 605 var newRealParams = new HashSet<string>(newCreator.Operators.OfType<IRealVectorCreator>().Select(x => x.RealVectorParameter.ActualName)); 606 var newPermParams = new HashSet<string>(newCreator.Operators.OfType<IPermutationCreator>().Select(x => x.PermutationParameter.ActualName)); 607 608 var oldCreator = SolutionCreator as MultiEncodingCreator; 609 if (oldCreator == null) SolutionCreator = newCreator; 610 else { 611 #region Configure BinaryVector Creator 612 var oldBinParams = new HashSet<string>(oldCreator.Operators.OfType<IBinaryVectorCreator>().Select(x => x.BinaryVectorParameter.ActualName)); 613 foreach (var toAdd in newBinParams.Except(oldBinParams)) { 614 oldCreator.Operators.Add(newCreator.Operators.OfType<IBinaryVectorCreator>().Single(x => x.BinaryVectorParameter.ActualName == toAdd)); 615 } 616 foreach (var toRemove in oldBinParams.Except(newBinParams)) { 617 var op = oldCreator.Operators.OfType<IBinaryVectorCreator>().SingleOrDefault(x => x.BinaryVectorParameter.ActualName == toRemove); 602 618 if (op != null) oldCreator.Operators.Remove(op); 603 619 } 604 } else { 605 // we will use the new creator 606 foreach (var binCreator in solutionCreators.OfType<IBinaryVectorCreator>()) { 607 newCreator.Operators.Add(binCreator); 608 } 609 } 610 #endregion 611 #region Configure IntegerVector Creator 612 var newIntParams = new HashSet<string>(solutionCreators.OfType<IIntegerVectorCreator>().Select(x => x.IntegerVectorParameter.ActualName)); 613 if (oldCreator != null) { 614 // we want to reuse the old creator 615 var oldParams = new HashSet<string>(oldCreator 616 .Operators.OfType<IIntegerVectorCreator>() 617 .Select(x => x.IntegerVectorParameter.ActualName)); 618 foreach (var toAdd in newIntParams.Except(oldParams)) { 619 var paramName = toAdd; 620 oldCreator.Operators.Add( 621 solutionCreators.OfType<IIntegerVectorCreator>().Single(x => x.IntegerVectorParameter.ActualName == paramName)); 622 } 623 foreach (var toRemove in oldParams.Except(newIntParams)) { 624 var paramName = toRemove; 625 var op = 626 oldCreator.Operators.OfType<IIntegerVectorCreator>() 627 .SingleOrDefault(x => x.IntegerVectorParameter.ActualName == paramName); 620 #endregion 621 622 #region Configure IntegerVector Creator 623 var oldIntParams = new HashSet<string>(oldCreator.Operators.OfType<IIntegerVectorCreator>().Select(x => x.IntegerVectorParameter.ActualName)); 624 foreach (var toAdd in newIntParams.Except(oldIntParams)) { 625 oldCreator.Operators.Add(newCreator.Operators.OfType<IIntegerVectorCreator>().Single(x => x.IntegerVectorParameter.ActualName == toAdd)); 626 } 627 foreach (var toRemove in oldIntParams.Except(newIntParams)) { 628 var op = oldCreator.Operators.OfType<IIntegerVectorCreator>().SingleOrDefault(x => x.IntegerVectorParameter.ActualName == toRemove); 628 629 if (op != null) oldCreator.Operators.Remove(op); 629 630 } 630 } else { 631 // we will use the new creator 632 foreach (var intCreator in solutionCreators.OfType<IIntegerVectorCreator>()) { 633 newCreator.Operators.Add(intCreator); 634 } 635 } 636 #endregion 637 #region Configure RealVector Creator 638 var newRealParams = new HashSet<string>(solutionCreators.OfType<IRealVectorCreator>().Select(x => x.RealVectorParameter.ActualName)); 639 if (oldCreator != null) { 640 // we want to reuse the old creator 641 var oldParams = new HashSet<string>(oldCreator 642 .Operators.OfType<IRealVectorCreator>() 643 .Select(x => x.RealVectorParameter.ActualName)); 644 foreach (var toAdd in newRealParams.Except(oldParams)) { 645 var paramName = toAdd; 646 oldCreator.Operators.Add( 647 solutionCreators.OfType<IRealVectorCreator>().Single(x => x.RealVectorParameter.ActualName == paramName)); 648 } 649 foreach (var toRemove in oldParams.Except(newRealParams)) { 650 var paramName = toRemove; 651 var op = 652 oldCreator.Operators.OfType<IRealVectorCreator>() 653 .SingleOrDefault(x => x.RealVectorParameter.ActualName == paramName); 631 #endregion 632 633 #region Configure RealVector Creator 634 var oldRealParams = new HashSet<string>(oldCreator.Operators.OfType<IRealVectorCreator>().Select(x => x.RealVectorParameter.ActualName)); 635 foreach (var toAdd in newRealParams.Except(oldRealParams)) { 636 oldCreator.Operators.Add(newCreator.Operators.OfType<IRealVectorCreator>().Single(x => x.RealVectorParameter.ActualName == toAdd)); 637 } 638 foreach (var toRemove in oldRealParams.Except(newRealParams)) { 639 var op = oldCreator.Operators.OfType<IRealVectorCreator>().SingleOrDefault(x => x.RealVectorParameter.ActualName == toRemove); 654 640 if (op != null) oldCreator.Operators.Remove(op); 655 641 } 656 } else { 657 // we will use the new creator 658 foreach (var realCreator in solutionCreators.OfType<IRealVectorCreator>()) { 659 newCreator.Operators.Add(realCreator); 660 } 661 } 662 #endregion 663 #region Configure Permutation Creator 664 var newPermParams = new HashSet<string>(solutionCreators.OfType<IPermutationCreator>().Select(x => x.PermutationParameter.ActualName)); 665 if (oldCreator != null) { 666 // we want to reuse the old creator 667 var oldParams = new HashSet<string>(oldCreator 668 .Operators.OfType<IPermutationCreator>() 669 .Select(x => x.PermutationParameter.ActualName)); 670 foreach (var toAdd in newPermParams.Except(oldParams)) { 671 var paramName = toAdd; 672 oldCreator.Operators.Add( 673 solutionCreators.OfType<IPermutationCreator>().Single(x => x.PermutationParameter.ActualName == paramName)); 674 } 675 foreach (var toRemove in oldParams.Except(newPermParams)) { 676 var paramName = toRemove; 677 var op = 678 oldCreator.Operators.OfType<IPermutationCreator>() 679 .SingleOrDefault(x => x.PermutationParameter.ActualName == paramName); 642 #endregion 643 644 #region Configure Permutation Creator 645 var oldPermParams = new HashSet<string>(oldCreator.Operators.OfType<IPermutationCreator>().Select(x => x.PermutationParameter.ActualName)); 646 foreach (var toAdd in newPermParams.Except(oldPermParams)) { 647 oldCreator.Operators.Add(newCreator.Operators.OfType<IPermutationCreator>().Single(x => x.PermutationParameter.ActualName == toAdd)); 648 } 649 foreach (var toRemove in oldPermParams.Except(newPermParams)) { 650 var op = oldCreator.Operators.OfType<IPermutationCreator>().SingleOrDefault(x => x.PermutationParameter.ActualName == toRemove); 680 651 if (op != null) oldCreator.Operators.Remove(op); 681 652 } 682 653 // we also have to sync the permutation type (in case this changes, as it is a value parameter) 683 foreach (var intersect in newPermParams.Intersect(oldParams)) { 684 var paramName = intersect; 685 var oldPermCreator = oldCreator.Operators.OfType<IPermutationCreator>() 686 .Single(x => x.PermutationParameter.ActualName == paramName); 687 var newPermCreator = solutionCreators.OfType<IPermutationCreator>() 688 .Single(x => x.PermutationParameter.ActualName == paramName); 654 foreach (var intersect in newPermParams.Intersect(oldPermParams)) { 655 var oldPermCreator = oldCreator.Operators.OfType<IPermutationCreator>().Single(x => x.PermutationParameter.ActualName == intersect); 656 var newPermCreator = newCreator.Operators.OfType<IPermutationCreator>().Single(x => x.PermutationParameter.ActualName == intersect); 689 657 oldPermCreator.PermutationTypeParameter.Value = newPermCreator.PermutationTypeParameter.Value; 690 658 } 691 } else { 692 // we will use the new creator 693 foreach (var permCreator in solutionCreators.OfType<IPermutationCreator>()) { 694 newCreator.Operators.Add(permCreator); 695 } 696 } 697 #endregion 698 699 if (oldCreator == null) SolutionCreator = newCreator; 659 #endregion 660 661 } 700 662 701 663 // crossover and manipulator for multi-vector encoding 702 664 // the condition checks if a multi-vector encoding is to be updated (there already exists ParameterVectorCrossover and ParameterVectorManipulator) 703 if (Operators.OfType< ParameterVectorCrossover>().Any() && Operators.OfType<ParameterVectorManipulator>().Any()) {665 if (Operators.OfType<MultiEncodingCrossover>().Any() && Operators.OfType<MultiEncodingManipulator>().Any()) { 704 666 #region Update existing multi-vector encoding 705 667 #region Update ParameterVector Crossover ... 706 foreach (var oldXo in Operators.OfType< ParameterVectorCrossover>()) {668 foreach (var oldXo in Operators.OfType<MultiEncodingCrossover>()) { 707 669 #region ... for binary parameters 708 var oldBinParams = new HashSet<string>(oldXo.Operators.OfType<IBinaryVectorCrossover>() 709 .Select(x => x.ChildParameter.ActualName)); 670 var oldBinParams = new HashSet<string>(oldXo.Operators.OfType<IBinaryVectorCrossover>().Select(x => x.ChildParameter.ActualName)); 710 671 foreach (var toAdd in newBinParams.Except(oldBinParams)) 711 oldXo.Operators.Add(GetDefaultBinaryCrossover(toAdd, configuration));672 oldXo.Operators.Add(GetDefaultBinaryCrossover(toAdd, encoding)); 712 673 foreach (var toRemove in oldBinParams.Except(newBinParams)) { 713 var op = 714 oldXo.Operators.OfType<IBinaryVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove); 674 var op = oldXo.Operators.OfType<IBinaryVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove); 715 675 if (op != null) oldXo.Operators.Remove(op); 716 676 } 717 677 #endregion 718 678 #region ... for integer parameters 719 var oldIntParams = new HashSet<string>(oldXo.Operators.OfType<IIntegerVectorCrossover>() 720 .Select(x => x.ChildParameter.ActualName)); 679 var oldIntParams = new HashSet<string>(oldXo.Operators.OfType<IIntegerVectorCrossover>().Select(x => x.ChildParameter.ActualName)); 721 680 foreach (var toAdd in newIntParams.Except(oldIntParams)) 722 oldXo.Operators.Add(GetDefaultIntegerCrossover(toAdd, configuration));681 oldXo.Operators.Add(GetDefaultIntegerCrossover(toAdd, encoding)); 723 682 foreach (var toRemove in oldIntParams.Except(newIntParams)) { 724 var op = 725 oldXo.Operators.OfType<IIntegerVectorCrossover>() 726 .SingleOrDefault(x => x.ChildParameter.ActualName == toRemove); 683 var op = oldXo.Operators.OfType<IIntegerVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove); 727 684 if (op != null) oldXo.Operators.Remove(op); 728 685 } 729 686 #endregion 730 687 #region ... for real parameters 731 var oldRealParams = new HashSet<string>(oldXo.Operators.OfType<IRealVectorCrossover>() 732 .Select(x => x.ChildParameter.ActualName)); 688 var oldRealParams = new HashSet<string>(oldXo.Operators.OfType<IRealVectorCrossover>().Select(x => x.ChildParameter.ActualName)); 733 689 foreach (var toAdd in newRealParams.Except(oldRealParams)) 734 oldXo.Operators.Add(GetDefaultRealCrossover(toAdd, configuration));690 oldXo.Operators.Add(GetDefaultRealCrossover(toAdd, encoding)); 735 691 foreach (var toRemove in oldRealParams.Except(newRealParams)) { 736 var op = 737 oldXo.Operators.OfType<IRealVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove); 692 var op = oldXo.Operators.OfType<IRealVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove); 738 693 if (op != null) oldXo.Operators.Remove(op); 739 694 } 740 695 #endregion 741 696 #region ... for permutation parameters 742 var oldPermParams = new HashSet<string>(oldXo.Operators.OfType<IPermutationCrossover>() 743 .Select(x => x.ChildParameter.ActualName)); 697 var oldPermParams = new HashSet<string>(oldXo.Operators.OfType<IPermutationCrossover>().Select(x => x.ChildParameter.ActualName)); 744 698 foreach (var toAdd in newPermParams.Except(oldPermParams)) 745 oldXo.Operators.Add(GetDefaultPermutationCrossover(toAdd, configuration));699 oldXo.Operators.Add(GetDefaultPermutationCrossover(toAdd, encoding)); 746 700 foreach (var toRemove in oldPermParams.Except(newPermParams)) { 747 var op = 748 oldXo.Operators.OfType<IPermutationCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove); 701 var op = oldXo.Operators.OfType<IPermutationCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove); 749 702 if (op != null) oldXo.Operators.Remove(op); 750 703 } … … 753 706 #endregion 754 707 #region Update ParameterVector Manipulator ... 755 foreach (var oldM in Operators.OfType< ParameterVectorManipulator>()) {708 foreach (var oldM in Operators.OfType<MultiEncodingManipulator>()) { 756 709 #region ... for binary parameters 757 var oldBinParams = new HashSet<string>(oldM.Operators.OfType<IBinaryVectorManipulator>() 758 .Select(x => x.BinaryVectorParameter.ActualName)); 710 var oldBinParams = new HashSet<string>(oldM.Operators.OfType<IBinaryVectorManipulator>().Select(x => x.BinaryVectorParameter.ActualName)); 759 711 foreach (var toAdd in newBinParams.Except(oldBinParams)) 760 oldM.Operators.Add(GetDefaultBinaryManipulator(toAdd, configuration));712 oldM.Operators.Add(GetDefaultBinaryManipulator(toAdd, encoding)); 761 713 foreach (var toRemove in oldBinParams.Except(newBinParams)) { 762 var op = 763 oldM.Operators.OfType<IBinaryVectorManipulator>() 764 .SingleOrDefault(x => x.BinaryVectorParameter.ActualName == toRemove); 714 var op = oldM.Operators.OfType<IBinaryVectorManipulator>().SingleOrDefault(x => x.BinaryVectorParameter.ActualName == toRemove); 765 715 if (op != null) oldM.Operators.Remove(op); 766 716 } 767 717 #endregion 768 718 #region ... for integer parameters 769 var oldIntParams = new HashSet<string>(oldM.Operators.OfType<IIntegerVectorManipulator>() 770 .Select(x => x.IntegerVectorParameter.ActualName)); 719 var oldIntParams = new HashSet<string>(oldM.Operators.OfType<IIntegerVectorManipulator>().Select(x => x.IntegerVectorParameter.ActualName)); 771 720 foreach (var toAdd in newIntParams.Except(oldIntParams)) 772 oldM.Operators.Add(GetDefaultIntegerManipulator(toAdd, configuration));721 oldM.Operators.Add(GetDefaultIntegerManipulator(toAdd, encoding)); 773 722 foreach (var toRemove in oldIntParams.Except(newIntParams)) { 774 var op = 775 oldM.Operators.OfType<IIntegerVectorManipulator>() 776 .SingleOrDefault(x => x.IntegerVectorParameter.ActualName == toRemove); 723 var op = oldM.Operators.OfType<IIntegerVectorManipulator>().SingleOrDefault(x => x.IntegerVectorParameter.ActualName == toRemove); 777 724 if (op != null) oldM.Operators.Remove(op); 778 725 } 779 726 #endregion 780 727 #region ... for real parameters 781 var oldRealParams = new HashSet<string>(oldM.Operators.OfType<IRealVectorManipulator>() 782 .Select(x => x.RealVectorParameter.ActualName)); 728 var oldRealParams = new HashSet<string>(oldM.Operators.OfType<IRealVectorManipulator>().Select(x => x.RealVectorParameter.ActualName)); 783 729 foreach (var toAdd in newRealParams.Except(oldRealParams)) 784 oldM.Operators.Add(GetDefaultRealManipulator(toAdd, configuration));730 oldM.Operators.Add(GetDefaultRealManipulator(toAdd, encoding)); 785 731 foreach (var toRemove in oldRealParams.Except(newRealParams)) { 786 var op = 787 oldM.Operators.OfType<IRealVectorManipulator>() 788 .SingleOrDefault(x => x.RealVectorParameter.ActualName == toRemove); 732 var op = oldM.Operators.OfType<IRealVectorManipulator>().SingleOrDefault(x => x.RealVectorParameter.ActualName == toRemove); 789 733 if (op != null) oldM.Operators.Remove(op); 790 734 } 791 735 #endregion 792 736 #region ... for permutation parameters 793 var oldPermParams = new HashSet<string>(oldM.Operators.OfType<IPermutationManipulator>() 794 .Select(x => x.PermutationParameter.ActualName)); 737 var oldPermParams = new HashSet<string>(oldM.Operators.OfType<IPermutationManipulator>().Select(x => x.PermutationParameter.ActualName)); 795 738 foreach (var toAdd in newPermParams.Except(oldPermParams)) 796 oldM.Operators.Add(GetDefaultPermutationManipulator(toAdd, configuration));739 oldM.Operators.Add(GetDefaultPermutationManipulator(toAdd, encoding)); 797 740 foreach (var toRemove in oldPermParams.Except(newPermParams)) { 798 var op = 799 oldM.Operators.OfType<IPermutationManipulator>() 800 .SingleOrDefault(x => x.PermutationParameter.ActualName == toRemove); 741 var op = oldM.Operators.OfType<IPermutationManipulator>().SingleOrDefault(x => x.PermutationParameter.ActualName == toRemove); 801 742 if (op != null) oldM.Operators.Remove(op); 802 743 } … … 815 756 Operators.RemoveAll(x => x is IMultiNeighborhoodShakingOperator); 816 757 817 var crossover = new ParameterVectorCrossover();818 var manipulator = new ParameterVectorManipulator();819 foreach (var param in configuration.Parameters) {820 if ( param.Value is BinaryParameterConfiguration) {821 crossover.Operators.Add(GetDefaultBinaryCrossover( param.Key, configuration));822 manipulator.Operators.Add(GetDefaultBinaryManipulator( param.Key, configuration));758 var crossover = new MultiEncodingCrossover(); 759 var manipulator = new MultiEncodingManipulator(); 760 foreach (var enc in encoding.Encodings) { 761 if (enc is BinaryEncoding) { 762 crossover.Operators.Add(GetDefaultBinaryCrossover(enc.Name, encoding)); 763 manipulator.Operators.Add(GetDefaultBinaryManipulator(enc.Name, encoding)); 823 764 continue; 824 765 } 825 var intConfig = param.Value as IntegerParameterConfiguration;766 var intConfig = enc as IntegerEncoding; 826 767 if (intConfig != null) { 827 crossover.Operators.Add(GetDefaultIntegerCrossover( param.Key, configuration));828 manipulator.Operators.Add(GetDefaultIntegerManipulator( param.Key, configuration));768 crossover.Operators.Add(GetDefaultIntegerCrossover(enc.Name, encoding)); 769 manipulator.Operators.Add(GetDefaultIntegerManipulator(enc.Name, encoding)); 829 770 continue; 830 771 } 831 var realConfig = param.Value as RealParameterConfiguration;772 var realConfig = enc as RealEncoding; 832 773 if (realConfig != null) { 833 crossover.Operators.Add(GetDefaultRealCrossover( param.Key, configuration));834 manipulator.Operators.Add(GetDefaultRealManipulator( param.Key, configuration));774 crossover.Operators.Add(GetDefaultRealCrossover(enc.Name, encoding)); 775 manipulator.Operators.Add(GetDefaultRealManipulator(enc.Name, encoding)); 835 776 continue; 836 777 } 837 var permConfig = param.Value as PermutationParameterConfiguration;778 var permConfig = enc as PermutationEncoding; 838 779 if (permConfig != null) { 839 crossover.Operators.Add(GetDefaultPermutationCrossover( param.Key, configuration));840 manipulator.Operators.Add(GetDefaultPermutationManipulator( param.Key, configuration));780 crossover.Operators.Add(GetDefaultPermutationCrossover(enc.Name, encoding)); 781 manipulator.Operators.Add(GetDefaultPermutationManipulator(enc.Name, encoding)); 841 782 continue; 842 783 } 843 throw new InvalidOperationException("Unknown type for parameter " + param.Key);784 throw new InvalidOperationException("Unknown type for parameter " + enc.Name); 844 785 } 845 786 Operators.Add(crossover); … … 849 790 } 850 791 851 protected virtual void UpdateMoveOperators() {852 Operators.RemoveAll(x => x is IParameterVectorMoveOperator);853 var generator = new ParameterVectorMoveGenerator();854 generator.ConfigurationParameter.ActualName = ConfigurationParameter.Name;855 generator.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;856 857 var evaluator = new ParameterVectorMoveEvaluator();858 evaluator.ConfigurationParameter.ActualName = ConfigurationParameter.Name;859 evaluator.QualityParameter.ActualName = Evaluator.QualitiesParameter.ActualName;860 evaluator.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;861 862 var maker = new ParameterVectorMoveMaker();863 maker.ConfigurationParameter.ActualName = ConfigurationParameter.Name;864 maker.MoveQualityParameter.ActualName = evaluator.MoveQualityParameter.ActualName;865 maker.QualityParameter.ActualName = Evaluator.QualitiesParameter.ActualName;866 867 Operators.AddRange(new IItem[] { generator, evaluator, maker });868 }869 870 792 #region GetDefaultOperators for Crossovers and Manipulators 871 793 // ReSharper disable RedundantNameQualifier 872 protected virtual IBinaryVectorCrossover GetDefaultBinaryCrossover(string paramName, Configurationconfig) {873 var binConfig = (Binary ParameterConfiguration)config.Parameters[paramName];794 protected virtual IBinaryVectorCrossover GetDefaultBinaryCrossover(string paramName, MultiEncoding config) { 795 var binConfig = (BinaryEncoding)config.Encodings[paramName]; 874 796 IBinaryVectorCrossover binXo; 875 797 if (binConfig.Length.Value > 3) binXo = new Encodings.BinaryVectorEncoding.SinglePointCrossover(); … … 880 802 } 881 803 882 protected virtual IBinaryVectorManipulator GetDefaultBinaryManipulator(string paramName, Configurationconfig) {804 protected virtual IBinaryVectorManipulator GetDefaultBinaryManipulator(string paramName, MultiEncoding config) { 883 805 var binM = new Encodings.BinaryVectorEncoding.SomePositionsBitflipManipulator(); 884 806 binM.BinaryVectorParameter.ActualName = paramName; … … 887 809 } 888 810 889 protected virtual IIntegerVectorCrossover GetDefaultIntegerCrossover(string paramName, Configurationconfig) {811 protected virtual IIntegerVectorCrossover GetDefaultIntegerCrossover(string paramName, MultiEncoding config) { 890 812 var intXo = new Encodings.IntegerVectorEncoding.RoundedBlendAlphaCrossover(); 891 813 intXo.ChildParameter.ActualName = paramName; … … 895 817 } 896 818 897 protected virtual IIntegerVectorManipulator GetDefaultIntegerManipulator(string paramName, Configurationconfiguration) {819 protected virtual IIntegerVectorManipulator GetDefaultIntegerManipulator(string paramName, MultiEncoding configuration) { 898 820 var intM = new Encodings.IntegerVectorEncoding.UniformSomePositionsManipulator(); 899 821 intM.IntegerVectorParameter.ActualName = paramName; … … 903 825 } 904 826 905 protected virtual IRealVectorCrossover GetDefaultRealCrossover(string paramName, Configurationconfiguration) {827 protected virtual IRealVectorCrossover GetDefaultRealCrossover(string paramName, MultiEncoding configuration) { 906 828 var realXo = new Encodings.RealVectorEncoding.BlendAlphaCrossover(); 907 829 realXo.ChildParameter.ActualName = paramName; … … 911 833 } 912 834 913 protected virtual IRealVectorManipulator GetDefaultRealManipulator(string paramName, Configurationconfiguration) {835 protected virtual IRealVectorManipulator GetDefaultRealManipulator(string paramName, MultiEncoding configuration) { 914 836 var realM = new Encodings.RealVectorEncoding.BreederGeneticAlgorithmManipulator(); 915 837 realM.RealVectorParameter.ActualName = paramName; … … 918 840 } 919 841 920 protected virtual IPermutationCrossover GetDefaultPermutationCrossover(string paramName, Configurationconfiguration) {842 protected virtual IPermutationCrossover GetDefaultPermutationCrossover(string paramName, MultiEncoding configuration) { 921 843 var permXo = new Encodings.PermutationEncoding.PartiallyMatchedCrossover(); 922 844 permXo.ChildParameter.ActualName = paramName; … … 925 847 } 926 848 927 protected virtual IPermutationManipulator GetDefaultPermutationManipulator(string paramName, Configurationconfiguration) {849 protected virtual IPermutationManipulator GetDefaultPermutationManipulator(string paramName, MultiEncoding configuration) { 928 850 var permM = new Encodings.PermutationEncoding.Swap2Manipulator(); 929 851 permM.PermutationParameter.ActualName = paramName;
Note: See TracChangeset
for help on using the changeset viewer.