Changeset 15299
- Timestamp:
- 07/30/17 10:11:13 (7 years ago)
- Location:
- trunk/sources/HeuristicLab.Algorithms.SimulatedAnnealing/3.3
- Files:
-
- 9 deleted
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealing.cs
r15295 r15299 1 1 #region License Information 2 2 /* HeuristicLab 3 * Copyright (C) 2002-201 2Heuristic and Evolutionary Algorithms Laboratory (HEAL)3 * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 4 * 5 5 * This file is part of HeuristicLab. … … 21 21 22 22 using System; 23 using System.Collections.Generic; 23 24 using System.Linq; 24 25 using HeuristicLab.Analysis; … … 34 35 using HeuristicLab.Random; 35 36 36 namespace HeuristicLab.Algorithms.SimulatedAnnealing 37 { 38 [Item("Simulated Annealing", "An advanced simulated annealing algorithm.")] 39 [Creatable("Algorithms")] 40 [StorableClass] 41 public sealed class SimulatedAnnealing : HeuristicOptimizationEngineAlgorithm, IStorableContent 42 { 43 #region Strings 44 private const string SeedName = "Seed"; 45 private const string SetSeedRandomlyName = "SetSeedRandomly"; 46 private const string MoveGeneratorName = "MoveGenerator"; 47 private const string MoveEvaluatorName = "MoveEvaluator"; 48 private const string MoveMakerName = "MoveMaker"; 49 private const string AnnealingOperatorName = "AnnealingOperator"; 50 private const string ReheatingOperatorName = "ReheatingOperator"; 51 private const string MaximumIterationsName = "MaximumIterations"; 52 private const string InitialTemperatureName = "InitialTemperature"; 53 private const string LowerTemperatureName = "LowerTemperature"; 54 private const string AnalyzerName = "Analyzer"; 55 private const string RandomName = "Random"; 56 private const string EvaluatedMovesName = "EvaluatedMoves"; 57 private const string IterationsName = "Iterations"; 58 private const string TemperatureStartIndexName = "TemperatureStartIndex"; 59 private const string CoolingName = "Cooling"; 60 private const string StartTemperatureName = "StartTemperature"; 61 private const string EndTemperatureName = "EndTemperature"; 62 private const string TemperatureName = "Temperature"; 63 private const string ResultsName = "Results"; 64 private const string TemperatureChartName = "Temperature Chart"; 65 private const string TemperatureAnalyzerName = "Temperature Analyzer"; 66 private const string TemperatureInitializerName = "TemperatureInitializer"; 67 #endregion 68 69 public string Filename { get; set; } 70 71 #region Problem Properties 72 public override Type ProblemType 73 { 74 get { return typeof(ISingleObjectiveHeuristicOptimizationProblem); } 75 } 76 public new ISingleObjectiveHeuristicOptimizationProblem Problem 77 { 78 get { return (ISingleObjectiveHeuristicOptimizationProblem)base.Problem; } 79 set { base.Problem = value; } 80 } 81 #endregion 82 83 #region Parameter Properties 84 private ValueParameter<IntValue> SeedParameter 85 { 86 get { return (ValueParameter<IntValue>)Parameters[SeedName]; } 87 } 88 private ValueParameter<BoolValue> SetSeedRandomlyParameter 89 { 90 get { return (ValueParameter<BoolValue>)Parameters[SetSeedRandomlyName]; } 91 } 92 public IConstrainedValueParameter<IMultiMoveGenerator> MoveGeneratorParameter 93 { 94 get { return (IConstrainedValueParameter<IMultiMoveGenerator>)Parameters[MoveGeneratorName]; } 95 } 96 public IConstrainedValueParameter<IMoveMaker> MoveMakerParameter 97 { 98 get { return (IConstrainedValueParameter<IMoveMaker>)Parameters[MoveMakerName]; } 99 } 100 public IConstrainedValueParameter<ISingleObjectiveMoveEvaluator> MoveEvaluatorParameter 101 { 102 get { return (IConstrainedValueParameter<ISingleObjectiveMoveEvaluator>)Parameters[MoveEvaluatorName]; } 103 } 104 public IConstrainedValueParameter<IDiscreteDoubleValueModifier> AnnealingOperatorParameter 105 { 106 get { return (IConstrainedValueParameter<IDiscreteDoubleValueModifier>)Parameters[AnnealingOperatorName]; } 107 } 108 109 public IConstrainedValueParameter<IReheatingOperator> ReheatingOperatorParameter 110 { 111 get { return (IConstrainedValueParameter<IReheatingOperator>)Parameters[ReheatingOperatorName]; } 112 } 113 public IConstrainedValueParameter<ITemperatureInitializer> TemperatureInitializerParameter 114 { 115 get { return (IConstrainedValueParameter<ITemperatureInitializer>)Parameters[TemperatureInitializerName]; } 116 } 117 118 private ValueParameter<IntValue> MaximumIterationsParameter 119 { 120 get { return (ValueParameter<IntValue>)Parameters[MaximumIterationsName]; } 121 } 122 private ValueParameter<DoubleValue> LowerTemperatureParameter 123 { 124 get { return (ValueParameter<DoubleValue>)Parameters[LowerTemperatureName]; } 125 } 126 private ValueParameter<MultiAnalyzer> AnalyzerParameter 127 { 128 get { return (ValueParameter<MultiAnalyzer>)Parameters[AnalyzerName]; } 129 } 130 #endregion 131 132 #region Properties 133 public IntValue Seed 134 { 135 get { return SeedParameter.Value; } 136 set { SeedParameter.Value = value; } 137 } 138 public BoolValue SetSeedRandomly 139 { 140 get { return SetSeedRandomlyParameter.Value; } 141 set { SetSeedRandomlyParameter.Value = value; } 142 } 143 public IMultiMoveGenerator MoveGenerator 144 { 145 get { return MoveGeneratorParameter.Value; } 146 set { MoveGeneratorParameter.Value = value; } 147 } 148 public IMoveMaker MoveMaker 149 { 150 get { return MoveMakerParameter.Value; } 151 set { MoveMakerParameter.Value = value; } 152 } 153 public ISingleObjectiveMoveEvaluator MoveEvaluator 154 { 155 get { return MoveEvaluatorParameter.Value; } 156 set { MoveEvaluatorParameter.Value = value; } 157 } 158 public IDiscreteDoubleValueModifier AnnealingOperator 159 { 160 get { return AnnealingOperatorParameter.Value; } 161 set { AnnealingOperatorParameter.Value = value; } 162 } 163 164 public IReheatingOperator ReheatingOperator 165 { 166 get { return ReheatingOperatorParameter.Value; } 167 set { ReheatingOperatorParameter.Value = value; } 168 } 169 public ITemperatureInitializer TemperatureInitializer 170 { 171 get { return TemperatureInitializerParameter.Value; } 172 set { TemperatureInitializerParameter.Value = value; } 173 } 174 175 public IntValue MaximumIterations 176 { 177 get { return MaximumIterationsParameter.Value; } 178 set { MaximumIterationsParameter.Value = value; } 179 } 180 public DoubleValue LowerTemperature 181 { 182 get { return LowerTemperatureParameter.Value; } 183 set { LowerTemperatureParameter.Value = value; } 184 } 185 public MultiAnalyzer Analyzer 186 { 187 get { return AnalyzerParameter.Value; } 188 set { AnalyzerParameter.Value = value; } 189 } 190 private RandomCreator RandomCreator 191 { 192 get { return (RandomCreator)OperatorGraph.InitialOperator; } 193 } 194 private SolutionsCreator SolutionsCreator 195 { 196 get { return (SolutionsCreator)RandomCreator.Successor; } 197 } 198 private SimulatedAnnealingMainLoop MainLoop 199 { 200 get { return OperatorGraph.Iterate().OfType<SimulatedAnnealingMainLoop>().First(); } 201 } 202 #endregion 203 204 [StorableConstructor] 205 private SimulatedAnnealing(bool deserializing) : base(deserializing) { } 206 private SimulatedAnnealing(SimulatedAnnealing original, Cloner cloner) 207 : base(original, cloner) 208 { 209 RegisterEventHandlers(); 210 } 211 public SimulatedAnnealing() 212 : base() 213 { 214 Parameters.Add(new ValueParameter<IntValue>(SeedName, "The random seed used to initialize the new pseudo random number generator.", new IntValue(0))); 215 Parameters.Add(new ValueParameter<BoolValue>(SetSeedRandomlyName, "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true))); 216 Parameters.Add(new ConstrainedValueParameter<IMultiMoveGenerator>(MoveGeneratorName, "The operator used to generate moves to the neighborhood of the current solution.")); 217 Parameters.Add(new ConstrainedValueParameter<ISingleObjectiveMoveEvaluator>(MoveEvaluatorName, "The operator used to evaluate a move.")); 218 Parameters.Add(new ConstrainedValueParameter<IMoveMaker>(MoveMakerName, "The operator used to perform a move.")); 219 Parameters.Add(new ConstrainedValueParameter<IDiscreteDoubleValueModifier>(AnnealingOperatorName, "The operator used to cool the temperature.")); 220 Parameters.Add(new ConstrainedValueParameter<IReheatingOperator>(ReheatingOperatorName, "The operator used to reheat the temperature, if necessary.")); 221 Parameters.Add(new ConstrainedValueParameter<ITemperatureInitializer>(TemperatureInitializerName, "The operator used to initialize the temperature.")); 222 Parameters.Add(new ValueParameter<IntValue>(MaximumIterationsName, "The maximum number of generations which should be processed.", new IntValue(10000))); 223 Parameters.Add(new ValueParameter<DoubleValue>(LowerTemperatureName, "The lower bound for the temperature.", new DoubleValue(1e-6))); 224 Parameters.Add(new ValueParameter<MultiAnalyzer>(AnalyzerName, "The operator used to analyze each iteration.", new MultiAnalyzer())); 225 226 var randomCreator = new RandomCreator(); 227 var solutionsCreator = new SolutionsCreator(); 228 var variableCreator = new VariableCreator(); 229 var startTemperatureAssigner = new Assigner(); 230 var endTemperatureAssigner = new Assigner(); 231 var temperatureAssigner = new Assigner(); 232 var resultsCollector = new ResultsCollector(); 233 var mainLoop = new SimulatedAnnealingMainLoop(); 234 OperatorGraph.InitialOperator = randomCreator; 235 236 randomCreator.RandomParameter.ActualName = RandomName; 237 randomCreator.SeedParameter.ActualName = SeedParameter.Name; 238 randomCreator.SeedParameter.Value = null; 239 randomCreator.SetSeedRandomlyParameter.ActualName = SetSeedRandomlyParameter.Name; 240 randomCreator.SetSeedRandomlyParameter.Value = null; 241 randomCreator.Successor = solutionsCreator; 242 243 solutionsCreator.NumberOfSolutions = new IntValue(1); 244 solutionsCreator.Successor = variableCreator; 245 246 variableCreator.Name = "Initialize Variables"; 247 variableCreator.CollectedValues.Add(new ValueParameter<DoubleValue>(InitialTemperatureName, new DoubleValue(Double.PositiveInfinity))); 248 variableCreator.CollectedValues.Add(new ValueParameter<IntValue>(EvaluatedMovesName, new IntValue())); 249 variableCreator.CollectedValues.Add(new ValueParameter<IntValue>(IterationsName, new IntValue(0))); 250 variableCreator.CollectedValues.Add(new ValueParameter<IntValue>(TemperatureStartIndexName, new IntValue(0))); 251 variableCreator.CollectedValues.Add(new ValueParameter<BoolValue>(CoolingName, new BoolValue(true))); 252 253 variableCreator.Successor = startTemperatureAssigner; 254 255 startTemperatureAssigner.Name = "Assign Start Temperature"; 256 startTemperatureAssigner.LeftSideParameter.ActualName = StartTemperatureName; 257 startTemperatureAssigner.RightSideParameter.ActualName = InitialTemperatureName; 258 startTemperatureAssigner.Successor = endTemperatureAssigner; 259 260 endTemperatureAssigner.Name = "Assign End Temperature"; 261 endTemperatureAssigner.LeftSideParameter.ActualName = EndTemperatureName; 262 endTemperatureAssigner.RightSideParameter.ActualName = LowerTemperatureParameter.Name; 263 endTemperatureAssigner.Successor = temperatureAssigner; 264 265 temperatureAssigner.Name = "Initialize Temperature"; 266 temperatureAssigner.LeftSideParameter.ActualName = TemperatureName; 267 temperatureAssigner.RightSideParameter.ActualName = StartTemperatureName; 268 temperatureAssigner.Successor = resultsCollector; 269 270 resultsCollector.CopyValue = new BoolValue(false); 271 resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>(EvaluatedMovesName, null)); 272 resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>(IterationsName, null)); 273 resultsCollector.ResultsParameter.ActualName = ResultsName; 274 resultsCollector.Successor = mainLoop; 275 276 mainLoop.AnalyzerParameter.ActualName = AnalyzerParameter.Name; 277 mainLoop.AnnealingOperatorParameter.ActualName = AnnealingOperatorParameter.Name; 278 mainLoop.CoolingParameter.ActualName = CoolingName; 279 mainLoop.EndTemperatureParameter.ActualName = EndTemperatureName; 280 mainLoop.EvaluatedMovesParameter.ActualName = EvaluatedMovesName; 281 282 mainLoop.IterationsParameter.ActualName = IterationsName; 283 mainLoop.MaximumIterationsParameter.ActualName = MaximumIterationsParameter.Name; 284 mainLoop.MoveEvaluatorParameter.ActualName = MoveEvaluatorParameter.Name; 285 mainLoop.MoveGeneratorParameter.ActualName = MoveGeneratorParameter.Name; 286 mainLoop.MoveMakerParameter.ActualName = MoveMakerParameter.Name; 287 mainLoop.RandomParameter.ActualName = RandomCreator.RandomParameter.ActualName; 288 mainLoop.ResultsParameter.ActualName = ResultsName; 289 mainLoop.StartTemperatureParameter.ActualName = StartTemperatureName; 290 mainLoop.TemperatureStartIndexParameter.ActualName = TemperatureStartIndexName; 291 mainLoop.TemperatureParameter.ActualName = TemperatureName; 292 293 foreach (var op in ApplicationManager.Manager.GetInstances<IReheatingOperator>().OrderBy(x => x.Name)) 294 { 295 296 ReheatingOperatorParameter.ValidValues.Add(op); 297 } 298 299 foreach (var op in ApplicationManager.Manager.GetInstances<IDiscreteDoubleValueModifier>().OrderBy(x => x.Name)) 300 { 301 AnnealingOperatorParameter.ValidValues.Add(op); 302 } 303 304 foreach(var op in ApplicationManager.Manager.GetInstances<ITemperatureInitializer>().OrderBy(x => x.Name)) 305 { 306 TemperatureInitializerParameter.ValidValues.Add(op); 307 } 308 309 UpdateAnalyzers(); 310 311 Parameterize(); 312 313 RegisterEventHandlers(); 314 } 315 316 public override IDeepCloneable Clone(Cloner cloner) 317 { 318 return new SimulatedAnnealing(this, cloner); 319 } 320 321 [StorableHook(HookType.AfterDeserialization)] 322 private void AfterDeserialization() 323 { 324 RegisterEventHandlers(); 325 } 326 327 private void RegisterEventHandlers() 328 { 329 if (Problem != null) 330 { 331 Problem.Evaluator.QualityParameter.ActualNameChanged += Evaluator_QualityParameter_ActualNameChanged; 332 foreach (var op in Problem.Operators.OfType<ISingleObjectiveMoveEvaluator>()) 333 { 334 op.MoveQualityParameter.ActualNameChanged += MoveEvaluator_MoveQualityParameter_ActualNameChanged; 335 } 336 } 337 MoveGeneratorParameter.ValueChanged += MoveGeneratorParameter_ValueChanged; 338 MoveEvaluatorParameter.ValueChanged += MoveEvaluatorParameter_ValueChanged; 339 } 340 341 public override void Prepare() 342 { 343 if (Problem != null && MoveGenerator != null && MoveMaker != null && MoveEvaluator != null) 344 base.Prepare(); 345 } 346 347 #region Events 348 protected override void OnProblemChanged() 349 { 350 foreach (var op in Problem.Operators.OfType<ISingleObjectiveMoveEvaluator>()) 351 { 352 op.MoveQualityParameter.ActualNameChanged += MoveEvaluator_MoveQualityParameter_ActualNameChanged; 353 } 354 UpdateMoveGenerator(); 355 UpdateMoveOperators(); 356 UpdateAnalyzers(); 357 Parameterize(); 358 Problem.Evaluator.QualityParameter.ActualNameChanged += Evaluator_QualityParameter_ActualNameChanged; 359 base.OnProblemChanged(); 360 } 361 protected override void Problem_SolutionCreatorChanged(object sender, EventArgs e) 362 { 363 Parameterize(); 364 base.Problem_SolutionCreatorChanged(sender, e); 365 } 366 protected override void Problem_EvaluatorChanged(object sender, EventArgs e) 367 { 368 Parameterize(); 369 Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged); 370 base.Problem_EvaluatorChanged(sender, e); 371 } 372 protected override void Problem_OperatorsChanged(object sender, EventArgs e) 373 { 374 foreach (var op in Problem.Operators.OfType<ISingleObjectiveMoveEvaluator>()) 375 { 376 op.MoveQualityParameter.ActualNameChanged -= MoveEvaluator_MoveQualityParameter_ActualNameChanged; 377 op.MoveQualityParameter.ActualNameChanged += MoveEvaluator_MoveQualityParameter_ActualNameChanged; 378 } 379 UpdateMoveGenerator(); 380 UpdateMoveOperators(); 381 UpdateAnalyzers(); 382 Parameterize(); 383 base.Problem_OperatorsChanged(sender, e); 384 } 385 private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) 386 { 387 Parameterize(); 388 } 389 private void MoveGeneratorParameter_ValueChanged(object sender, EventArgs e) 390 { 391 UpdateMoveOperators(); 392 } 393 private void MoveEvaluatorParameter_ValueChanged(object sender, EventArgs e) 394 { 395 Parameterize(); 396 } 397 private void MoveEvaluator_MoveQualityParameter_ActualNameChanged(object sender, EventArgs e) 398 { 399 if (sender == MoveEvaluator) Parameterize(); 400 } 401 #endregion 402 403 #region Helpers 404 405 private void UpdateMoveGenerator() 406 { 407 var oldMoveGenerator = MoveGenerator; 408 var defaultMoveGenerator = Problem.Operators.OfType<IMultiMoveGenerator>().FirstOrDefault(); 409 410 MoveGeneratorParameter.ValidValues.Clear(); 411 412 if (Problem != null) 413 { 414 foreach (var generator in Problem.Operators.OfType<IMultiMoveGenerator>().OrderBy(x => x.Name)) 415 MoveGeneratorParameter.ValidValues.Add(generator); 416 } 417 418 if (oldMoveGenerator != null) 419 { 420 var newMoveGenerator = MoveGeneratorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMoveGenerator.GetType()); 421 if (newMoveGenerator != null) MoveGenerator = newMoveGenerator; 422 else oldMoveGenerator = null; 423 } 424 if (oldMoveGenerator == null && defaultMoveGenerator != null) 425 MoveGenerator = defaultMoveGenerator; 426 427 UpdateMoveOperators(); 428 } 429 430 private void UpdateMoveOperators() 431 { 432 var oldMoveMaker = MoveMaker; 433 var oldMoveEvaluator = MoveEvaluator; 434 435 MoveMakerParameter.ValidValues.Clear(); 436 MoveEvaluatorParameter.ValidValues.Clear(); 437 438 if (MoveGenerator != null) 439 { 440 var moveTypes = MoveGenerator.GetType().GetInterfaces().Where(x => typeof(IMoveOperator).IsAssignableFrom(x)).ToList(); 441 foreach (var type in moveTypes.ToList()) 442 { 443 if (moveTypes.Any(t => t != type && type.IsAssignableFrom(t))) 444 moveTypes.Remove(type); 445 } 446 var operators = Problem.Operators.Where(op => moveTypes.Any(m => m.IsInstanceOfType(op))).ToList(); 447 var defaultMoveMaker = operators.OfType<IMoveMaker>().FirstOrDefault(); 448 var defaultMoveEvaluator = operators.OfType<ISingleObjectiveMoveEvaluator>().FirstOrDefault(); 449 450 foreach (var moveMaker in operators.OfType<IMoveMaker>().OrderBy(op => op.Name)) 451 MoveMakerParameter.ValidValues.Add(moveMaker); 452 453 foreach (var moveEvaluator in operators.OfType<ISingleObjectiveMoveEvaluator>().OrderBy(op => op.Name)) 454 MoveEvaluatorParameter.ValidValues.Add(moveEvaluator); 455 456 if (oldMoveMaker != null) 457 { 458 var mm = MoveMakerParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMoveMaker.GetType()); 459 if (mm != null) MoveMaker = mm; 460 else oldMoveMaker = null; 461 } 462 if (oldMoveMaker == null && defaultMoveMaker != null) 463 MoveMaker = defaultMoveMaker; 464 465 if (oldMoveEvaluator != null) 466 { 467 var me = MoveEvaluatorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMoveEvaluator.GetType()); 468 if (me != null) MoveEvaluator = me; 469 else oldMoveEvaluator = null; 470 } 471 if (oldMoveEvaluator == null & defaultMoveEvaluator != null) 472 MoveEvaluator = defaultMoveEvaluator; 473 } 474 } 475 476 private void UpdateAnalyzers() 477 { 478 Analyzer.Operators.Clear(); 479 if (Problem != null) 480 { 481 foreach (var analyzer in Problem.Operators.OfType<IAnalyzer>()) 482 { 483 foreach (var param in analyzer.Parameters.OfType<IScopeTreeLookupParameter>()) 484 param.Depth = 0; 485 Analyzer.Operators.Add(analyzer, analyzer.EnabledByDefault); 486 } 487 } 488 var qualityAnalyzer = new QualityAnalyzer(); 489 var temperatureAnalyzer = new SingleValueAnalyzer { Name = TemperatureAnalyzerName }; 490 Analyzer.Operators.Add(qualityAnalyzer, qualityAnalyzer.EnabledByDefault); 491 Analyzer.Operators.Add(temperatureAnalyzer, temperatureAnalyzer.EnabledByDefault); 492 } 493 494 private void Parameterize() 495 { 496 497 #region IStochasticOperator 498 if (Problem != null) 499 { 500 foreach (var op in Problem.Operators.OfType<IStochasticOperator>()) 501 { 502 op.RandomParameter.ActualName = RandomCreator.RandomParameter.ActualName; 503 op.RandomParameter.Hidden = true; 504 } 505 } 506 #endregion 507 508 #region IIterationBasedOperator 509 if (Problem != null) 510 { 511 foreach (var op in Problem.Operators.OfType<IIterationBasedOperator>()) 512 { 513 op.IterationsParameter.ActualName = IterationsName; 514 op.IterationsParameter.Hidden = true; 515 op.MaximumIterationsParameter.ActualName = MaximumIterationsParameter.Name; 516 op.MaximumIterationsParameter.Hidden = true; 517 } 518 } 519 #endregion 520 521 #region Analyzers 522 523 foreach (var qualityAnalyzer in Analyzer.Operators.OfType<QualityAnalyzer>()) 524 { 525 qualityAnalyzer.ResultsParameter.ActualName = ResultsName; 526 if (Problem != null) 527 { 528 qualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name; 529 qualityAnalyzer.MaximizationParameter.Hidden = true; 530 qualityAnalyzer.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName; 531 qualityAnalyzer.QualityParameter.Depth = 0; 532 qualityAnalyzer.QualityParameter.Hidden = true; 533 qualityAnalyzer.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name; 534 qualityAnalyzer.BestKnownQualityParameter.Hidden = true; 535 } 536 else 537 { 538 qualityAnalyzer.MaximizationParameter.Hidden = false; 539 qualityAnalyzer.QualityParameter.Hidden = false; 540 qualityAnalyzer.BestKnownQualityParameter.Hidden = false; 541 } 542 } 543 544 var temperatureAnalyzer = Analyzer.Operators.OfType<SingleValueAnalyzer>().FirstOrDefault(x => x.Name == TemperatureAnalyzerName); 545 if (temperatureAnalyzer != null) 546 { 547 temperatureAnalyzer.ResultsParameter.ActualName = ResultsName; 548 temperatureAnalyzer.ResultsParameter.Hidden = true; 549 temperatureAnalyzer.ValueParameter.ActualName = TemperatureName; 550 temperatureAnalyzer.ValueParameter.Hidden = true; 551 temperatureAnalyzer.ValuesParameter.ActualName = TemperatureChartName; 552 temperatureAnalyzer.ValuesParameter.Hidden = true; 553 } 554 555 #endregion 556 557 #region SolutionCreator 558 if (Problem != null) 559 { 560 SolutionsCreator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name; 561 SolutionsCreator.SolutionCreatorParameter.ActualName = Problem.SolutionCreatorParameter.Name; 562 } 563 #endregion 564 565 #region Annealing/Reheating Operators 566 foreach (var op in AnnealingOperatorParameter.ValidValues) 567 { 568 op.IndexParameter.ActualName = IterationsName; 569 op.IndexParameter.Hidden = true; 570 op.StartIndexParameter.Value = null; 571 op.StartIndexParameter.ActualName = TemperatureStartIndexName; 572 op.EndIndexParameter.ActualName = MaximumIterationsParameter.Name; 573 op.ValueParameter.ActualName = TemperatureName; 574 op.ValueParameter.Hidden = true; 575 op.StartValueParameter.ActualName = StartTemperatureName; 576 op.StartValueParameter.Hidden = true; 577 op.EndValueParameter.ActualName = LowerTemperatureParameter.Name; 578 op.EndValueParameter.Hidden = true; 579 } 580 foreach (var op in ReheatingOperatorParameter.ValidValues) 581 { 582 op.Parameterize(); 583 } 584 #endregion 585 586 #region Move Operators 587 if (Problem != null) 588 { 589 foreach (var op in Problem.Operators.OfType<IMultiMoveGenerator>()) 590 { 591 op.SampleSizeParameter.Value = new IntValue(1); 592 op.SampleSizeParameter.Hidden = true; 593 } 594 foreach (var op in Problem.Operators.OfType<IMoveMaker>()) 595 { 596 op.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName; 597 op.QualityParameter.Hidden = true; 598 if (MoveEvaluator != null) 599 { 600 op.MoveQualityParameter.ActualName = MoveEvaluator.MoveQualityParameter.ActualName; 601 op.MoveQualityParameter.Hidden = true; 602 } 603 else 604 { 605 op.MoveQualityParameter.Hidden = false; 606 } 607 } 608 foreach (var op in Problem.Operators.OfType<ISingleObjectiveMoveEvaluator>()) 609 { 610 op.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName; 611 op.QualityParameter.Hidden = true; 612 } 613 } 614 #endregion 615 616 #region MainLoop 617 if (Problem != null) 618 { 619 MainLoop.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name; 620 MainLoop.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name; 621 MainLoop.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName; 622 if (MoveEvaluator != null) 623 MainLoop.MoveQualityParameter.ActualName = MoveEvaluator.MoveQualityParameter.ActualName; 624 } 625 #endregion 626 627 } 628 #endregion 629 } 37 namespace HeuristicLab.Algorithms.SimulatedAnnealing { 38 [Item("Simulated Annealing (SA)", "A simulated annealing algorithm.")] 39 [Creatable(CreatableAttribute.Categories.SingleSolutionAlgorithms, Priority = 140)] 40 [StorableClass] 41 public sealed class SimulatedAnnealing : HeuristicOptimizationEngineAlgorithm, IStorableContent { 42 public string Filename { get; set; } 43 44 #region Problem Properties 45 public override Type ProblemType { 46 get { return typeof(ISingleObjectiveHeuristicOptimizationProblem); } 47 } 48 public new ISingleObjectiveHeuristicOptimizationProblem Problem { 49 get { return (ISingleObjectiveHeuristicOptimizationProblem)base.Problem; } 50 set { base.Problem = value; } 51 } 52 #endregion 53 54 #region Parameter Properties 55 private ValueParameter<IntValue> SeedParameter { 56 get { return (ValueParameter<IntValue>)Parameters["Seed"]; } 57 } 58 private ValueParameter<BoolValue> SetSeedRandomlyParameter { 59 get { return (ValueParameter<BoolValue>)Parameters["SetSeedRandomly"]; } 60 } 61 public IConstrainedValueParameter<IMultiMoveGenerator> MoveGeneratorParameter { 62 get { return (IConstrainedValueParameter<IMultiMoveGenerator>)Parameters["MoveGenerator"]; } 63 } 64 public IConstrainedValueParameter<IMoveMaker> MoveMakerParameter { 65 get { return (IConstrainedValueParameter<IMoveMaker>)Parameters["MoveMaker"]; } 66 } 67 public IConstrainedValueParameter<ISingleObjectiveMoveEvaluator> MoveEvaluatorParameter { 68 get { return (IConstrainedValueParameter<ISingleObjectiveMoveEvaluator>)Parameters["MoveEvaluator"]; } 69 } 70 public IConstrainedValueParameter<IDiscreteDoubleValueModifier> AnnealingOperatorParameter { 71 get { return (IConstrainedValueParameter<IDiscreteDoubleValueModifier>)Parameters["AnnealingOperator"]; } 72 } 73 private ValueParameter<IntValue> MaximumIterationsParameter { 74 get { return (ValueParameter<IntValue>)Parameters["MaximumIterations"]; } 75 } 76 private ValueParameter<IntValue> InnerIterationsParameter { 77 get { return (ValueParameter<IntValue>)Parameters["InnerIterations"]; } 78 } 79 private ValueParameter<DoubleValue> StartTemperatureParameter { 80 get { return (ValueParameter<DoubleValue>)Parameters["StartTemperature"]; } 81 } 82 private ValueParameter<DoubleValue> EndTemperatureParameter { 83 get { return (ValueParameter<DoubleValue>)Parameters["EndTemperature"]; } 84 } 85 private ValueParameter<MultiAnalyzer> AnalyzerParameter { 86 get { return (ValueParameter<MultiAnalyzer>)Parameters["Analyzer"]; } 87 } 88 #endregion 89 90 #region Properties 91 public IntValue Seed { 92 get { return SeedParameter.Value; } 93 set { SeedParameter.Value = value; } 94 } 95 public BoolValue SetSeedRandomly { 96 get { return SetSeedRandomlyParameter.Value; } 97 set { SetSeedRandomlyParameter.Value = value; } 98 } 99 public IMultiMoveGenerator MoveGenerator { 100 get { return MoveGeneratorParameter.Value; } 101 set { MoveGeneratorParameter.Value = value; } 102 } 103 public IMoveMaker MoveMaker { 104 get { return MoveMakerParameter.Value; } 105 set { MoveMakerParameter.Value = value; } 106 } 107 public ISingleObjectiveMoveEvaluator MoveEvaluator { 108 get { return MoveEvaluatorParameter.Value; } 109 set { MoveEvaluatorParameter.Value = value; } 110 } 111 public IDiscreteDoubleValueModifier AnnealingOperator { 112 get { return AnnealingOperatorParameter.Value; } 113 set { AnnealingOperatorParameter.Value = value; } 114 } 115 public IntValue MaximumIterations { 116 get { return MaximumIterationsParameter.Value; } 117 set { MaximumIterationsParameter.Value = value; } 118 } 119 public IntValue InnerIterations { 120 get { return InnerIterationsParameter.Value; } 121 set { InnerIterationsParameter.Value = value; } 122 } 123 public DoubleValue StartTemperature { 124 get { return StartTemperatureParameter.Value; } 125 set { StartTemperatureParameter.Value = value; } 126 } 127 public DoubleValue EndTemperature { 128 get { return EndTemperatureParameter.Value; } 129 set { EndTemperatureParameter.Value = value; } 130 } 131 public MultiAnalyzer Analyzer { 132 get { return AnalyzerParameter.Value; } 133 set { AnalyzerParameter.Value = value; } 134 } 135 private RandomCreator RandomCreator { 136 get { return (RandomCreator)OperatorGraph.InitialOperator; } 137 } 138 private SolutionsCreator SolutionsCreator { 139 get { return (SolutionsCreator)RandomCreator.Successor; } 140 } 141 private SimulatedAnnealingMainLoop MainLoop { 142 get { return FindMainLoop(SolutionsCreator.Successor); } 143 } 144 [Storable] 145 private QualityAnalyzer qualityAnalyzer; 146 [Storable] 147 private SingleValueAnalyzer temperatureAnalyzer; 148 #endregion 149 150 [StorableConstructor] 151 private SimulatedAnnealing(bool deserializing) : base(deserializing) { } 152 [StorableHook(HookType.AfterDeserialization)] 153 private void AfterDeserialization() { 154 if (temperatureAnalyzer == null) { 155 temperatureAnalyzer = new SingleValueAnalyzer(); 156 temperatureAnalyzer.Name = "TemperatureAnalyzer"; 157 temperatureAnalyzer.ResultsParameter.ActualName = "Results"; 158 temperatureAnalyzer.ValueParameter.ActualName = "Temperature"; 159 temperatureAnalyzer.ValuesParameter.ActualName = "Temperature Chart"; 160 Analyzer.Operators.Add(temperatureAnalyzer); 161 } 162 Initialize(); 163 } 164 private SimulatedAnnealing(SimulatedAnnealing original, Cloner cloner) 165 : base(original, cloner) { 166 qualityAnalyzer = cloner.Clone(original.qualityAnalyzer); 167 temperatureAnalyzer = cloner.Clone(original.temperatureAnalyzer); 168 Initialize(); 169 } 170 public override IDeepCloneable Clone(Cloner cloner) { 171 return new SimulatedAnnealing(this, cloner); 172 } 173 public SimulatedAnnealing() 174 : base() { 175 Parameters.Add(new ValueParameter<IntValue>("Seed", "The random seed used to initialize the new pseudo random number generator.", new IntValue(0))); 176 Parameters.Add(new ValueParameter<BoolValue>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true))); 177 Parameters.Add(new ConstrainedValueParameter<IMultiMoveGenerator>("MoveGenerator", "The operator used to generate moves to the neighborhood of the current solution.")); 178 Parameters.Add(new ConstrainedValueParameter<ISingleObjectiveMoveEvaluator>("MoveEvaluator", "The operator used to evaluate a move.")); 179 Parameters.Add(new ConstrainedValueParameter<IMoveMaker>("MoveMaker", "The operator used to perform a move.")); 180 Parameters.Add(new ConstrainedValueParameter<IDiscreteDoubleValueModifier>("AnnealingOperator", "The operator used to modify the temperature.")); 181 Parameters.Add(new ValueParameter<IntValue>("MaximumIterations", "The maximum number of generations which should be processed.", new IntValue(100))); 182 Parameters.Add(new ValueParameter<IntValue>("InnerIterations", "The amount of inner iterations (number of moves before temperature is adjusted again).", new IntValue(10))); 183 Parameters.Add(new ValueParameter<DoubleValue>("StartTemperature", "The initial temperature.", new DoubleValue(100))); 184 Parameters.Add(new ValueParameter<DoubleValue>("EndTemperature", "The final temperature which should be reached when iterations reaches maximum iterations.", new DoubleValue(1e-6))); 185 Parameters.Add(new ValueParameter<MultiAnalyzer>("Analyzer", "The operator used to analyze each generation.", new MultiAnalyzer())); 186 187 RandomCreator randomCreator = new RandomCreator(); 188 SolutionsCreator solutionsCreator = new SolutionsCreator(); 189 VariableCreator variableCreator = new VariableCreator(); 190 ResultsCollector resultsCollector = new ResultsCollector(); 191 SimulatedAnnealingMainLoop mainLoop = new SimulatedAnnealingMainLoop(); 192 OperatorGraph.InitialOperator = randomCreator; 193 194 randomCreator.RandomParameter.ActualName = "Random"; 195 randomCreator.SeedParameter.ActualName = SeedParameter.Name; 196 randomCreator.SeedParameter.Value = null; 197 randomCreator.SetSeedRandomlyParameter.ActualName = SetSeedRandomlyParameter.Name; 198 randomCreator.SetSeedRandomlyParameter.Value = null; 199 randomCreator.Successor = solutionsCreator; 200 201 solutionsCreator.NumberOfSolutions = new IntValue(1); 202 solutionsCreator.Successor = variableCreator; 203 204 variableCreator.Name = "Initialize EvaluatedMoves"; 205 variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("EvaluatedMoves", new IntValue())); 206 variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("Iterations", new IntValue(0))); 207 variableCreator.Successor = resultsCollector; 208 209 resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>("Evaluated Moves", null, "EvaluatedMoves")); 210 resultsCollector.ResultsParameter.ActualName = "Results"; 211 resultsCollector.Successor = mainLoop; 212 213 mainLoop.MoveGeneratorParameter.ActualName = MoveGeneratorParameter.Name; 214 mainLoop.MoveEvaluatorParameter.ActualName = MoveEvaluatorParameter.Name; 215 mainLoop.MoveMakerParameter.ActualName = MoveMakerParameter.Name; 216 mainLoop.AnnealingOperatorParameter.ActualName = AnnealingOperatorParameter.Name; 217 mainLoop.MaximumIterationsParameter.ActualName = MaximumIterationsParameter.Name; 218 mainLoop.TemperatureParameter.ActualName = "Temperature"; 219 mainLoop.StartTemperatureParameter.ActualName = StartTemperatureParameter.Name; 220 mainLoop.EndTemperatureParameter.ActualName = EndTemperatureParameter.Name; 221 mainLoop.RandomParameter.ActualName = RandomCreator.RandomParameter.ActualName; 222 mainLoop.ResultsParameter.ActualName = "Results"; 223 mainLoop.AnalyzerParameter.ActualName = AnalyzerParameter.Name; 224 mainLoop.EvaluatedMovesParameter.ActualName = "EvaluatedMoves"; 225 mainLoop.IterationsParameter.ActualName = "Iterations"; 226 227 foreach (IDiscreteDoubleValueModifier op in ApplicationManager.Manager.GetInstances<IDiscreteDoubleValueModifier>().OrderBy(x => x.Name)) 228 AnnealingOperatorParameter.ValidValues.Add(op); 229 ParameterizeAnnealingOperators(); 230 231 qualityAnalyzer = new QualityAnalyzer(); 232 temperatureAnalyzer = new SingleValueAnalyzer(); 233 temperatureAnalyzer.Name = "TemperatureAnalyzer"; 234 ParameterizeAnalyzers(); 235 UpdateAnalyzers(); 236 237 Initialize(); 238 } 239 240 public override void Prepare() { 241 if (Problem != null && MoveGenerator != null && MoveMaker != null && MoveEvaluator != null) 242 base.Prepare(); 243 } 244 245 #region Events 246 protected override void OnProblemChanged() { 247 ParameterizeStochasticOperator(Problem.SolutionCreator); 248 ParameterizeStochasticOperator(Problem.Evaluator); 249 foreach (IOperator op in Problem.Operators.OfType<IOperator>()) ParameterizeStochasticOperator(op); 250 foreach (ISingleObjectiveMoveEvaluator op in Problem.Operators.OfType<ISingleObjectiveMoveEvaluator>()) { 251 op.MoveQualityParameter.ActualNameChanged += new EventHandler(MoveEvaluator_MoveQualityParameter_ActualNameChanged); 252 } 253 ParameterizeSolutionsCreator(); 254 ParameterizeMainLoop(); 255 UpdateMoveGenerator(); 256 UpdateMoveParameters(); 257 UpdateAnalyzers(); 258 ParameterizeMoveEvaluators(); 259 ParameterizeMoveMakers(); 260 ParameterizeMoveGenerators(); 261 ParameterizeAnalyzers(); 262 ParameterizeIterationBasedOperators(); 263 Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged); 264 base.OnProblemChanged(); 265 } 266 protected override void Problem_SolutionCreatorChanged(object sender, EventArgs e) { 267 ParameterizeStochasticOperator(Problem.SolutionCreator); 268 ParameterizeSolutionsCreator(); 269 base.Problem_SolutionCreatorChanged(sender, e); 270 } 271 protected override void Problem_EvaluatorChanged(object sender, EventArgs e) { 272 ParameterizeStochasticOperator(Problem.Evaluator); 273 ParameterizeSolutionsCreator(); 274 ParameterizeMainLoop(); 275 ParameterizeMoveEvaluators(); 276 ParameterizeMoveMakers(); 277 ParameterizeAnalyzers(); 278 Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged); 279 base.Problem_EvaluatorChanged(sender, e); 280 } 281 protected override void Problem_OperatorsChanged(object sender, EventArgs e) { 282 foreach (IOperator op in Problem.Operators.OfType<IOperator>()) ParameterizeStochasticOperator(op); 283 // This may seem pointless, but some operators already have the eventhandler registered, others don't 284 // FIXME: Is there another way to solve this problem? 285 foreach (ISingleObjectiveMoveEvaluator op in Problem.Operators.OfType<ISingleObjectiveMoveEvaluator>()) { 286 op.MoveQualityParameter.ActualNameChanged -= new EventHandler(MoveEvaluator_MoveQualityParameter_ActualNameChanged); 287 op.MoveQualityParameter.ActualNameChanged += new EventHandler(MoveEvaluator_MoveQualityParameter_ActualNameChanged); 288 } 289 UpdateMoveGenerator(); 290 UpdateMoveParameters(); 291 UpdateAnalyzers(); 292 ParameterizeMainLoop(); 293 ParameterizeMoveEvaluators(); 294 ParameterizeMoveMakers(); 295 ParameterizeMoveGenerators(); 296 ParameterizeIterationBasedOperators(); 297 base.Problem_OperatorsChanged(sender, e); 298 } 299 private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) { 300 ParameterizeMainLoop(); 301 ParameterizeMoveEvaluators(); 302 ParameterizeMoveMakers(); 303 ParameterizeAnalyzers(); 304 } 305 private void MoveGeneratorParameter_ValueChanged(object sender, EventArgs e) { 306 UpdateMoveParameters(); 307 } 308 private void MoveEvaluatorParameter_ValueChanged(object sender, EventArgs e) { 309 ParameterizeMainLoop(); 310 ParameterizeMoveEvaluators(); 311 ParameterizeMoveMakers(); 312 } 313 private void MoveEvaluator_MoveQualityParameter_ActualNameChanged(object sender, EventArgs e) { 314 ParameterizeMainLoop(); 315 ParameterizeMoveEvaluators(); 316 ParameterizeMoveMakers(); 317 } 318 #endregion 319 320 #region Helpers 321 private void Initialize() { 322 if (Problem != null) { 323 Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged); 324 foreach (ISingleObjectiveMoveEvaluator op in Problem.Operators.OfType<ISingleObjectiveMoveEvaluator>()) { 325 op.MoveQualityParameter.ActualNameChanged += new EventHandler(MoveEvaluator_MoveQualityParameter_ActualNameChanged); 326 } 327 } 328 MoveGeneratorParameter.ValueChanged += new EventHandler(MoveGeneratorParameter_ValueChanged); 329 MoveEvaluatorParameter.ValueChanged += new EventHandler(MoveEvaluatorParameter_ValueChanged); 330 } 331 private void UpdateMoveGenerator() { 332 IMultiMoveGenerator oldMoveGenerator = MoveGenerator; 333 IMultiMoveGenerator defaultMoveGenerator = Problem.Operators.OfType<IMultiMoveGenerator>().FirstOrDefault(); 334 MoveGeneratorParameter.ValidValues.Clear(); 335 if (Problem != null) { 336 foreach (IMultiMoveGenerator generator in Problem.Operators.OfType<IMultiMoveGenerator>().OrderBy(x => x.Name)) 337 MoveGeneratorParameter.ValidValues.Add(generator); 338 } 339 if (oldMoveGenerator != null) { 340 IMultiMoveGenerator newMoveGenerator = MoveGeneratorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMoveGenerator.GetType()); 341 if (newMoveGenerator != null) MoveGenerator = newMoveGenerator; 342 else oldMoveGenerator = null; 343 } 344 if (oldMoveGenerator == null && defaultMoveGenerator != null) 345 MoveGenerator = defaultMoveGenerator; 346 if (MoveGenerator == null) { 347 ClearMoveParameters(); 348 } 349 } 350 private void ParameterizeAnalyzers() { 351 qualityAnalyzer.ResultsParameter.ActualName = "Results"; 352 if (Problem != null) { 353 qualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name; 354 qualityAnalyzer.MaximizationParameter.Hidden = true; 355 qualityAnalyzer.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName; 356 qualityAnalyzer.QualityParameter.Depth = 0; 357 qualityAnalyzer.QualityParameter.Hidden = true; 358 qualityAnalyzer.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name; 359 qualityAnalyzer.BestKnownQualityParameter.Hidden = true; 360 } else { 361 qualityAnalyzer.MaximizationParameter.Hidden = false; 362 qualityAnalyzer.QualityParameter.Hidden = false; 363 qualityAnalyzer.BestKnownQualityParameter.Hidden = false; 364 temperatureAnalyzer.ResultsParameter.ActualName = "Results"; 365 temperatureAnalyzer.ValueParameter.ActualName = "Temperature"; 366 temperatureAnalyzer.ValuesParameter.ActualName = "Temperature Chart"; 367 } 368 } 369 private void UpdateMoveParameters() { 370 IMoveMaker oldMoveMaker = MoveMaker; 371 ISingleObjectiveMoveEvaluator oldMoveEvaluator = MoveEvaluator; 372 ClearMoveParameters(); 373 374 if (MoveGenerator != null) { 375 List<Type> moveTypes = MoveGenerator.GetType().GetInterfaces().Where(x => typeof(IMoveOperator).IsAssignableFrom(x)).ToList(); 376 foreach (Type type in moveTypes.ToList()) { 377 if (moveTypes.Any(t => t != type && type.IsAssignableFrom(t))) 378 moveTypes.Remove(type); 379 } 380 var operators = Problem.Operators.Where(op => moveTypes.Any(m => m.IsInstanceOfType(op))).ToList(); 381 IMoveMaker defaultMoveMaker = operators.OfType<IMoveMaker>().FirstOrDefault(); 382 ISingleObjectiveMoveEvaluator defaultMoveEvaluator = operators.OfType<ISingleObjectiveMoveEvaluator>().FirstOrDefault(); 383 384 foreach (IMoveMaker moveMaker in operators.OfType<IMoveMaker>().OrderBy(op => op.Name)) 385 MoveMakerParameter.ValidValues.Add(moveMaker); 386 foreach (ISingleObjectiveMoveEvaluator moveEvaluator in operators.OfType<ISingleObjectiveMoveEvaluator>().OrderBy(op => op.Name)) 387 MoveEvaluatorParameter.ValidValues.Add(moveEvaluator); 388 389 if (oldMoveMaker != null) { 390 IMoveMaker mm = MoveMakerParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMoveMaker.GetType()); 391 if (mm != null) MoveMaker = mm; 392 else oldMoveMaker = null; 393 } 394 if (oldMoveMaker == null && defaultMoveMaker != null) 395 MoveMaker = defaultMoveMaker; 396 397 if (oldMoveEvaluator != null) { 398 ISingleObjectiveMoveEvaluator me = MoveEvaluatorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMoveEvaluator.GetType()); 399 if (me != null) MoveEvaluator = me; 400 else oldMoveEvaluator = null; 401 } 402 if (oldMoveEvaluator == null & defaultMoveEvaluator != null) 403 MoveEvaluator = defaultMoveEvaluator; 404 } 405 } 406 private void ClearMoveParameters() { 407 MoveMakerParameter.ValidValues.Clear(); 408 MoveEvaluatorParameter.ValidValues.Clear(); 409 } 410 private void ParameterizeSolutionsCreator() { 411 SolutionsCreator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name; 412 SolutionsCreator.SolutionCreatorParameter.ActualName = Problem.SolutionCreatorParameter.Name; 413 } 414 private void ParameterizeMainLoop() { 415 if (Problem != null) { 416 MainLoop.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name; 417 MainLoop.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name; 418 MainLoop.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName; 419 } 420 if (MoveEvaluator != null) 421 MainLoop.MoveQualityParameter.ActualName = MoveEvaluator.MoveQualityParameter.ActualName; 422 } 423 private void ParameterizeStochasticOperator(IOperator op) { 424 if (op is IStochasticOperator) { 425 IStochasticOperator stOp = (IStochasticOperator)op; 426 stOp.RandomParameter.ActualName = RandomCreator.RandomParameter.ActualName; 427 stOp.RandomParameter.Hidden = true; 428 } 429 } 430 private void ParameterizeMoveEvaluators() { 431 foreach (ISingleObjectiveMoveEvaluator op in Problem.Operators.OfType<ISingleObjectiveMoveEvaluator>()) { 432 op.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName; 433 op.QualityParameter.Hidden = true; 434 } 435 } 436 private void ParameterizeMoveMakers() { 437 foreach (IMoveMaker op in Problem.Operators.OfType<IMoveMaker>()) { 438 op.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName; 439 op.QualityParameter.Hidden = true; 440 if (MoveEvaluator != null) { 441 op.MoveQualityParameter.ActualName = MoveEvaluator.MoveQualityParameter.ActualName; 442 op.MoveQualityParameter.Hidden = true; 443 } else { 444 op.MoveQualityParameter.Hidden = false; 445 } 446 } 447 } 448 private void ParameterizeAnnealingOperators() { 449 foreach (IDiscreteDoubleValueModifier op in AnnealingOperatorParameter.ValidValues) { 450 op.IndexParameter.ActualName = "Iterations"; 451 op.IndexParameter.Hidden = true; 452 op.StartIndexParameter.Value = new IntValue(0); 453 op.EndIndexParameter.ActualName = MaximumIterationsParameter.Name; 454 op.ValueParameter.ActualName = "Temperature"; 455 op.ValueParameter.Hidden = true; 456 op.StartValueParameter.ActualName = StartTemperatureParameter.Name; 457 op.StartValueParameter.Hidden = true; 458 op.EndValueParameter.ActualName = EndTemperatureParameter.Name; 459 op.EndValueParameter.Hidden = true; 460 ParameterizeStochasticOperator(op); 461 } 462 } 463 private void ParameterizeMoveGenerators() { 464 foreach (IMultiMoveGenerator op in Problem.Operators.OfType<IMultiMoveGenerator>()) { 465 op.SampleSizeParameter.ActualName = InnerIterationsParameter.Name; 466 op.SampleSizeParameter.Hidden = true; 467 } 468 } 469 private void ParameterizeIterationBasedOperators() { 470 if (Problem != null) { 471 foreach (IIterationBasedOperator op in Problem.Operators.OfType<IIterationBasedOperator>()) { 472 op.IterationsParameter.ActualName = "Iterations"; 473 op.IterationsParameter.Hidden = true; 474 op.MaximumIterationsParameter.ActualName = MaximumIterationsParameter.Name; 475 op.MaximumIterationsParameter.Hidden = true; 476 } 477 } 478 } 479 private void UpdateAnalyzers() { 480 Analyzer.Operators.Clear(); 481 if (Problem != null) { 482 foreach (IAnalyzer analyzer in Problem.Operators.OfType<IAnalyzer>()) { 483 foreach (IScopeTreeLookupParameter param in analyzer.Parameters.OfType<IScopeTreeLookupParameter>()) 484 param.Depth = 0; 485 Analyzer.Operators.Add(analyzer, analyzer.EnabledByDefault); 486 } 487 } 488 Analyzer.Operators.Add(qualityAnalyzer, qualityAnalyzer.EnabledByDefault); 489 Analyzer.Operators.Add(temperatureAnalyzer, temperatureAnalyzer.EnabledByDefault); 490 } 491 private SimulatedAnnealingMainLoop FindMainLoop(IOperator start) { 492 IOperator mainLoop = start; 493 while (mainLoop != null && !(mainLoop is SimulatedAnnealingMainLoop)) 494 mainLoop = ((SingleSuccessorOperator)mainLoop).Successor; 495 if (mainLoop == null) return null; 496 else return (SimulatedAnnealingMainLoop)mainLoop; 497 } 498 #endregion 499 } 630 500 } -
trunk/sources/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealingImprovementOperator.cs
r15295 r15299 377 377 VariableCreator variableCreator = new VariableCreator(); 378 378 variableCreator.CollectedValues.Add(new ValueParameter<IntValue>(loop.IterationsParameter.ActualName, new IntValue(0))); 379 379 380 380 variableCreator.Successor = loop; 381 381 -
trunk/sources/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealingMainLoop.cs
r15295 r15299 1 1 #region License Information 2 2 /* HeuristicLab 3 * Copyright (C) 2002-201 2Heuristic and Evolutionary Algorithms Laboratory (HEAL)3 * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 4 * 5 5 * This file is part of HeuristicLab. … … 28 28 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 29 29 30 namespace HeuristicLab.Algorithms.SimulatedAnnealing 31 { 32 [Item("SimulatedAnnealingMainLoop", "An operator which represents the main loop of a simulated annealing algorithm.")] 33 [StorableClass] 34 public sealed class SimulatedAnnealingMainLoop : AlgorithmOperator 35 { 36 #region Strings 37 private const string MoveGeneratorName = "MoveGenerator"; 38 private const string MoveEvaluatorName = "MoveEvaluator"; 39 private const string MoveMakerName = "MoveMaker"; 40 private const string AnnealingOperatorName = "AnnealingOperator"; 41 private const string ReheatingOperatorName = "ReheatingOperator"; 42 private const string MaximumIterationsName = "MaximumIterations"; 43 private const string LowerTemperatureName = "LowerTemperature"; 44 private const string AnalyzerName = "Analyzer"; 45 private const string RandomName = "Random"; 46 private const string EvaluatedMovesName = "EvaluatedMoves"; 47 private const string IterationsName = "Iterations"; 48 private const string TemperatureStartIndexName = "TemperatureStartIndex"; 49 private const string CoolingName = "Cooling"; 50 private const string InitialTemperatureName = "InitialTemperature"; 51 private const string StartTemperatureName = "StartTemperature"; 52 private const string EndTemperatureName = "EndTemperature"; 53 private const string TemperatureName = "Temperature"; 54 private const string ResultsName = "Results"; 55 private const string MaximizationName = "Maximization"; 56 private const string QualityName = "Quality"; 57 private const string BestKnownQualityName = "BestKnownQuality"; 58 private const string MoveQualityName = "MoveQuality"; 59 private const string IsAcceptedName = "IsAccepted"; 60 private const string TerminateName = "Terminate"; 61 private const string AcceptanceMemoryName = "AcceptanceMemory"; 62 private const string ConsecutiveRejectedSolutionsCountName = "ConsecutiveRejectedSolutions"; 63 private const string AverageAcceptanceRatioName = "AverageAcceptanceRatio"; 64 private const string LastQualityName = "LastQuality"; 65 private const string UphillMovesMemoryName = "UphillMovesMemory"; 66 private const string TemperatureBeforeReheatName = "TemperatureBeforeReheat"; 67 private const string CurrentRandomWalkStepName = "CurrentRandomWalkStep"; 68 private const string QualitiesBeforeReheatingName = "QualitiesBeforeReheating"; 69 private const string LastAcceptedQualityName = "LastAcceptedQuality"; 70 private const string TemperatureInitializerName = "TemperatureInitializer"; 71 private const string TemperatureInitializedName = "TemperatureInitialized"; 72 73 #endregion 74 75 #region Parameter properties 76 public IValueLookupParameter<IRandom> RandomParameter 77 { 78 get { return (IValueLookupParameter<IRandom>)Parameters[RandomName]; } 79 } 80 public IValueLookupParameter<BoolValue> MaximizationParameter 81 { 82 get { return (IValueLookupParameter<BoolValue>)Parameters[MaximizationName]; } 83 } 84 public ILookupParameter<DoubleValue> QualityParameter 85 { 86 get { return (ILookupParameter<DoubleValue>)Parameters[QualityName]; } 87 } 88 public IValueLookupParameter<DoubleValue> BestKnownQualityParameter 89 { 90 get { return (IValueLookupParameter<DoubleValue>)Parameters[BestKnownQualityName]; } 91 } 92 public IValueLookupParameter<DoubleValue> LastQualityParameter 93 { 94 get { return (IValueLookupParameter<DoubleValue>)Parameters[LastQualityName]; } 95 } 96 public ILookupParameter<DoubleValue> InitialTemperatureParameter 97 { 98 get { return (ILookupParameter<DoubleValue>)Parameters[InitialTemperatureName]; } 99 } 100 public ILookupParameter<DoubleValue> MoveQualityParameter 101 { 102 get { return (ILookupParameter<DoubleValue>)Parameters[MoveQualityName]; } 103 } 104 public ILookupParameter<DoubleValue> TemperatureParameter 105 { 106 get { return (ILookupParameter<DoubleValue>)Parameters[TemperatureName]; } 107 } 108 public IValueLookupParameter<DoubleValue> LowerTemperatureParameter 109 { 110 get { return (IValueLookupParameter<DoubleValue>)Parameters[LowerTemperatureName]; } 111 } 112 public ILookupParameter<IntValue> IterationsParameter 113 { 114 get { return (ILookupParameter<IntValue>)Parameters[IterationsName]; } 115 } 116 public IValueLookupParameter<IntValue> MaximumIterationsParameter 117 { 118 get { return (IValueLookupParameter<IntValue>)Parameters[MaximumIterationsName]; } 119 } 120 public IValueLookupParameter<IOperator> MoveGeneratorParameter 121 { 122 get { return (IValueLookupParameter<IOperator>)Parameters[MoveGeneratorName]; } 123 } 124 public IValueLookupParameter<IOperator> MoveEvaluatorParameter 125 { 126 get { return (IValueLookupParameter<IOperator>)Parameters[MoveEvaluatorName]; } 127 } 128 public IValueLookupParameter<IOperator> MoveMakerParameter 129 { 130 get { return (IValueLookupParameter<IOperator>)Parameters[MoveMakerName]; } 131 } 132 public IValueLookupParameter<IOperator> AnnealingOperatorParameter 133 { 134 get { return (IValueLookupParameter<IOperator>)Parameters[AnnealingOperatorName]; } 135 } 136 public IValueLookupParameter<IOperator> ReheatingOperatorParameter 137 { 138 get { return (IValueLookupParameter<IOperator>)Parameters[ReheatingOperatorName]; } 139 } 140 public IValueLookupParameter<IOperator> AnalyzerParameter 141 { 142 get { return (IValueLookupParameter<IOperator>)Parameters[AnalyzerName]; } 143 } 144 public IValueLookupParameter<VariableCollection> ResultsParameter 145 { 146 get { return (IValueLookupParameter<VariableCollection>)Parameters[ResultsName]; } 147 } 148 public ILookupParameter<IntValue> EvaluatedMovesParameter 149 { 150 get { return (ILookupParameter<IntValue>)Parameters[EvaluatedMovesName]; } 151 } 152 public ILookupParameter<DoubleValue> StartTemperatureParameter 153 { 154 get { return (ILookupParameter<DoubleValue>)Parameters[StartTemperatureName]; } 155 } 156 public ILookupParameter<DoubleValue> EndTemperatureParameter 157 { 158 get { return (ILookupParameter<DoubleValue>)Parameters[EndTemperatureName]; } 159 } 160 public ILookupParameter<IntValue> TemperatureStartIndexParameter 161 { 162 get { return (ILookupParameter<IntValue>)Parameters[TemperatureStartIndexName]; } 163 } 164 public ILookupParameter<BoolValue> CoolingParameter 165 { 166 get { return (ILookupParameter<BoolValue>)Parameters[CoolingName]; } 167 } 168 #endregion 169 170 [StorableConstructor] 171 private SimulatedAnnealingMainLoop(bool deserializing) : base(deserializing) { } 172 private SimulatedAnnealingMainLoop(SimulatedAnnealingMainLoop original, Cloner cloner) 173 : base(original, cloner) 174 { 175 } 176 public override IDeepCloneable Clone(Cloner cloner) 177 { 178 return new SimulatedAnnealingMainLoop(this, cloner); 179 } 180 public SimulatedAnnealingMainLoop() 181 : base() 182 { 183 Initialize(); 184 } 185 186 private void Initialize() 187 { 188 #region Create parameters 189 Parameters.Add(new ValueLookupParameter<IRandom>(RandomName, "A pseudo random number generator.")); 190 Parameters.Add(new ValueLookupParameter<BoolValue>(MaximizationName, "True if the problem is a maximization problem, otherwise false.")); 191 Parameters.Add(new LookupParameter<DoubleValue>(QualityName, "The value which represents the quality of a solution.")); 192 Parameters.Add(new ValueLookupParameter<DoubleValue>(BestKnownQualityName, "The best known quality value found so far.")); 193 Parameters.Add(new LookupParameter<DoubleValue>(MoveQualityName, "The value which represents the quality of a move.")); 194 Parameters.Add(new LookupParameter<DoubleValue>(TemperatureName, "The current temperature.")); 195 Parameters.Add(new ValueLookupParameter<DoubleValue>(LowerTemperatureName, "The lower bound of the temperature.")); 196 Parameters.Add(new LookupParameter<IntValue>(IterationsName, "The number of iterations.")); 197 Parameters.Add(new ValueLookupParameter<IntValue>(MaximumIterationsName, "The maximum number of iterations which should be processed.")); 198 199 Parameters.Add(new ValueLookupParameter<IOperator>(MoveGeneratorName, "The operator that generates the moves.")); 200 Parameters.Add(new ValueLookupParameter<IOperator>(MoveEvaluatorName, "The operator that evaluates a move.")); 201 Parameters.Add(new ValueLookupParameter<IOperator>(MoveMakerName, "The operator that performs a move and updates the quality.")); 202 Parameters.Add(new ValueLookupParameter<IOperator>(AnnealingOperatorName, "The operator that cools the temperature.")); 203 Parameters.Add(new ValueLookupParameter<IOperator>(ReheatingOperatorName, "The operator that reheats the temperature if necessary.")); 204 Parameters.Add(new ValueLookupParameter<IOperator>(TemperatureInitializerName, "The operator that initialized the temperature.")); 205 206 Parameters.Add(new ValueLookupParameter<IOperator>(AnalyzerName, "The operator used to analyze each generation.")); 207 Parameters.Add(new ValueLookupParameter<VariableCollection>(ResultsName, "The variable collection where results should be stored.")); 208 Parameters.Add(new LookupParameter<IntValue>(EvaluatedMovesName, "The number of evaluated moves.")); 209 210 Parameters.Add(new LookupParameter<DoubleValue>(InitialTemperatureName, "The initial temperature.")); 211 Parameters.Add(new LookupParameter<IntValue>(TemperatureStartIndexName, "The index where the annealing or heating was last changed.")); 212 Parameters.Add(new LookupParameter<BoolValue>(CoolingName, "True when the temperature should be cooled, false otherwise.")); 213 Parameters.Add(new LookupParameter<DoubleValue>(StartTemperatureName, "The temperature from which cooling or reheating should occur.")); 214 Parameters.Add(new LookupParameter<DoubleValue>(EndTemperatureName, "The temperature to which should be cooled or heated.")); 215 216 217 #endregion 218 219 #region Create operators 220 var variableCreator = new VariableCreator(); 221 var ssp1 = new SubScopesProcessor(); 222 var analyzer1 = new Placeholder(); 223 var ssp2 = new SubScopesProcessor(); 224 var resultsCollector = new ResultsCollector(); 225 var mainProcessor = new SubScopesProcessor(); 226 var moveGenerator = new Placeholder(); 227 var moveEvaluationProcessor = new SubScopesProcessor(); 228 var moveEvaluator = new Placeholder(); 229 var evaluatedMovesCounter = new IntCounter(); 230 var qualityComparator = new ProbabilisticQualityComparator(); 231 var acceptsQualityBranch = new ConditionalBranch(); 232 var moveMaker = new Placeholder(); 233 var temperatureController = new TemperatureController(); 234 var subScopesRemover = new SubScopesRemover(); 235 var iterationsCounter = new IntCounter(); 236 var iterationsComparator = new Comparator(); 237 var ssp3 = new SubScopesProcessor(); 238 var analyzer2 = new Placeholder(); 239 var iterationsTermination = new ConditionalBranch(); 240 241 variableCreator.Name = "Initialize Memory"; 242 variableCreator.CollectedValues.Add(new ValueParameter<BoolValue>(TemperatureInitializedName, new BoolValue(false))); 243 variableCreator.CollectedValues.Add(new ValueParameter<DoubleValue>(AverageAcceptanceRatioName, new DoubleValue(0d))); 244 variableCreator.CollectedValues.Add(new ValueParameter<IntValue>(ConsecutiveRejectedSolutionsCountName, new IntValue(0))); 245 variableCreator.CollectedValues.Add(new ValueParameter<ItemList<BoolValue>>(AcceptanceMemoryName, new ItemList<BoolValue>())); 246 variableCreator.CollectedValues.Add(new ValueParameter<DoubleValue>(LastQualityName, new DoubleValue(-1))); 247 variableCreator.CollectedValues.Add(new ValueParameter<ItemList<DoubleValue>>(UphillMovesMemoryName, new ItemList<DoubleValue>())); 248 variableCreator.CollectedValues.Add(new ValueParameter<IntValue>(CurrentRandomWalkStepName, new IntValue(0))); 249 variableCreator.CollectedValues.Add(new ValueParameter<DoubleValue>(TemperatureBeforeReheatName, new DoubleValue(0))); 250 variableCreator.CollectedValues.Add(new ValueParameter<ItemList<DoubleValue>>(QualitiesBeforeReheatingName, new ItemList<DoubleValue>())); 251 variableCreator.CollectedValues.Add(new ValueParameter<DoubleValue>(LastAcceptedQualityName, new DoubleValue(-1))); 252 253 analyzer1.Name = "Analyzer"; 254 analyzer1.OperatorParameter.ActualName = AnalyzerParameter.Name; 255 256 moveGenerator.Name = "Move generator"; 257 moveGenerator.OperatorParameter.ActualName = MoveGeneratorParameter.Name; 258 259 moveEvaluator.Name = "Move evaluator"; 260 moveEvaluator.OperatorParameter.ActualName = MoveEvaluatorParameter.Name; 261 262 evaluatedMovesCounter.Name = "EvaluatedMoves++"; 263 evaluatedMovesCounter.ValueParameter.ActualName = EvaluatedMovesParameter.Name; 264 evaluatedMovesCounter.Increment = new IntValue(1); 265 266 qualityComparator.LeftSideParameter.ActualName = MoveQualityParameter.Name; 267 qualityComparator.RightSideParameter.ActualName = QualityParameter.Name; 268 qualityComparator.ResultParameter.ActualName = IsAcceptedName; 269 qualityComparator.DampeningParameter.ActualName = TemperatureParameter.Name; 270 271 acceptsQualityBranch.ConditionParameter.ActualName = IsAcceptedName; 272 273 moveMaker.Name = "Move maker"; 274 moveMaker.OperatorParameter.ActualName = MoveMakerParameter.Name; 275 276 277 subScopesRemover.RemoveAllSubScopes = true; 278 279 iterationsCounter.Name = "Iterations++"; 280 iterationsCounter.Increment = new IntValue(1); 281 iterationsCounter.ValueParameter.ActualName = IterationsParameter.Name; 282 283 iterationsComparator.Name = "Iterations >= MaximumIterations"; 284 iterationsComparator.LeftSideParameter.ActualName = IterationsParameter.Name; 285 iterationsComparator.RightSideParameter.ActualName = MaximumIterationsParameter.Name; 286 iterationsComparator.ResultParameter.ActualName = TerminateName; 287 iterationsComparator.Comparison.Value = ComparisonType.GreaterOrEqual; 288 289 analyzer2.Name = "Analyzer (placeholder)"; 290 analyzer2.OperatorParameter.ActualName = AnalyzerParameter.Name; 291 292 iterationsTermination.Name = "Iterations termination condition"; 293 iterationsTermination.ConditionParameter.ActualName = TerminateName; 294 #endregion 295 296 #region Create operator graph 297 OperatorGraph.InitialOperator = variableCreator; 298 variableCreator.Successor = ssp1; 299 ssp1.Operators.Add(analyzer1); 300 ssp1.Successor = ssp2; 301 analyzer1.Successor = null; 302 ssp2.Operators.Add(resultsCollector); 303 ssp2.Successor = mainProcessor; 304 resultsCollector.Successor = null; 305 mainProcessor.Operators.Add(moveGenerator); 306 mainProcessor.Successor = iterationsCounter; 307 moveGenerator.Successor = moveEvaluationProcessor; 308 moveEvaluationProcessor.Operators.Add(moveEvaluator); 309 moveEvaluationProcessor.Successor = evaluatedMovesCounter; 310 moveEvaluator.Successor = qualityComparator; 311 qualityComparator.Successor = acceptsQualityBranch; 312 acceptsQualityBranch.TrueBranch = moveMaker; 313 acceptsQualityBranch.FalseBranch = null; 314 acceptsQualityBranch.Successor = temperatureController; 315 moveMaker.Successor = null; 316 temperatureController.Successor = null; 317 evaluatedMovesCounter.Successor = subScopesRemover; 318 subScopesRemover.Successor = null; 319 iterationsCounter.Successor = iterationsComparator; 320 iterationsComparator.Successor = ssp3; 321 ssp3.Operators.Add(analyzer2); 322 ssp3.Successor = iterationsTermination; 323 iterationsTermination.TrueBranch = null; 324 iterationsTermination.FalseBranch = mainProcessor; 325 #endregion 326 } 327 328 public override IOperation Apply() 329 { 330 if (MoveGeneratorParameter.ActualValue == null || MoveEvaluatorParameter.ActualValue == null || MoveMakerParameter.ActualValue == null) 331 return null; 332 return base.Apply(); 333 } 334 } 30 namespace HeuristicLab.Algorithms.SimulatedAnnealing { 31 /// <summary> 32 /// An operator which represents a simulated annealing. 33 /// </summary> 34 [Item("SimulatedAnnealingMainLoop", "An operator which represents the main loop of a simulated annealing algorithm.")] 35 [StorableClass] 36 public sealed class SimulatedAnnealingMainLoop : AlgorithmOperator { 37 #region Parameter properties 38 public ValueLookupParameter<IRandom> RandomParameter { 39 get { return (ValueLookupParameter<IRandom>)Parameters["Random"]; } 40 } 41 public ValueLookupParameter<BoolValue> MaximizationParameter { 42 get { return (ValueLookupParameter<BoolValue>)Parameters["Maximization"]; } 43 } 44 public LookupParameter<DoubleValue> QualityParameter { 45 get { return (LookupParameter<DoubleValue>)Parameters["Quality"]; } 46 } 47 public ValueLookupParameter<DoubleValue> BestKnownQualityParameter { 48 get { return (ValueLookupParameter<DoubleValue>)Parameters["BestKnownQuality"]; } 49 } 50 public LookupParameter<DoubleValue> MoveQualityParameter { 51 get { return (LookupParameter<DoubleValue>)Parameters["MoveQuality"]; } 52 } 53 public ILookupParameter<DoubleValue> TemperatureParameter { 54 get { return (ILookupParameter<DoubleValue>)Parameters["Temperature"]; } 55 } 56 public ValueLookupParameter<DoubleValue> StartTemperatureParameter { 57 get { return (ValueLookupParameter<DoubleValue>)Parameters["StartTemperature"]; } 58 } 59 public ValueLookupParameter<DoubleValue> EndTemperatureParameter { 60 get { return (ValueLookupParameter<DoubleValue>)Parameters["EndTemperature"]; } 61 } 62 public ValueLookupParameter<IntValue> InnerIterationsParameter { 63 get { return (ValueLookupParameter<IntValue>)Parameters["InnerIterations"]; } 64 } 65 public LookupParameter<IntValue> IterationsParameter { 66 get { return (LookupParameter<IntValue>)Parameters["Iterations"]; } 67 } 68 public ValueLookupParameter<IntValue> MaximumIterationsParameter { 69 get { return (ValueLookupParameter<IntValue>)Parameters["MaximumIterations"]; } 70 } 71 public ValueLookupParameter<IOperator> MoveGeneratorParameter { 72 get { return (ValueLookupParameter<IOperator>)Parameters["MoveGenerator"]; } 73 } 74 public ValueLookupParameter<IOperator> MoveEvaluatorParameter { 75 get { return (ValueLookupParameter<IOperator>)Parameters["MoveEvaluator"]; } 76 } 77 public ValueLookupParameter<IOperator> MoveMakerParameter { 78 get { return (ValueLookupParameter<IOperator>)Parameters["MoveMaker"]; } 79 } 80 public ValueLookupParameter<IOperator> AnnealingOperatorParameter { 81 get { return (ValueLookupParameter<IOperator>)Parameters["AnnealingOperator"]; } 82 } 83 public ValueLookupParameter<IOperator> AnalyzerParameter { 84 get { return (ValueLookupParameter<IOperator>)Parameters["Analyzer"]; } 85 } 86 public ValueLookupParameter<VariableCollection> ResultsParameter { 87 get { return (ValueLookupParameter<VariableCollection>)Parameters["Results"]; } 88 } 89 public LookupParameter<IntValue> EvaluatedMovesParameter { 90 get { return (LookupParameter<IntValue>)Parameters["EvaluatedMoves"]; } 91 } 92 #endregion 93 94 [StorableConstructor] 95 private SimulatedAnnealingMainLoop(bool deserializing) : base(deserializing) { } 96 private SimulatedAnnealingMainLoop(SimulatedAnnealingMainLoop original, Cloner cloner) 97 : base(original, cloner) { 98 } 99 public override IDeepCloneable Clone(Cloner cloner) { 100 return new SimulatedAnnealingMainLoop(this, cloner); 101 } 102 public SimulatedAnnealingMainLoop() 103 : base() { 104 Initialize(); 105 } 106 107 private void Initialize() { 108 #region Create parameters 109 Parameters.Add(new ValueLookupParameter<IRandom>("Random", "A pseudo random number generator.")); 110 Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, otherwise false.")); 111 Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The value which represents the quality of a solution.")); 112 Parameters.Add(new ValueLookupParameter<DoubleValue>("BestKnownQuality", "The best known quality value found so far.")); 113 Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The value which represents the quality of a move.")); 114 Parameters.Add(new LookupParameter<DoubleValue>("Temperature", "The current temperature.")); 115 Parameters.Add(new ValueLookupParameter<DoubleValue>("StartTemperature", "The initial temperature.")); 116 Parameters.Add(new ValueLookupParameter<DoubleValue>("EndTemperature", "The end temperature.")); 117 Parameters.Add(new ValueLookupParameter<IntValue>("InnerIterations", "The amount of inner iterations (number of moves before temperature is adjusted again).")); 118 Parameters.Add(new LookupParameter<IntValue>("Iterations", "The number of iterations.")); 119 Parameters.Add(new ValueLookupParameter<IntValue>("MaximumIterations", "The maximum number of iterations which should be processed.")); 120 121 Parameters.Add(new ValueLookupParameter<IOperator>("MoveGenerator", "The operator that generates the moves.")); 122 Parameters.Add(new ValueLookupParameter<IOperator>("MoveEvaluator", "The operator that evaluates a move.")); 123 Parameters.Add(new ValueLookupParameter<IOperator>("MoveMaker", "The operator that performs a move and updates the quality.")); 124 Parameters.Add(new ValueLookupParameter<IOperator>("AnnealingOperator", "The operator that modifies the temperature.")); 125 126 Parameters.Add(new ValueLookupParameter<IOperator>("Analyzer", "The operator used to analyze each generation.")); 127 Parameters.Add(new ValueLookupParameter<VariableCollection>("Results", "The variable collection where results should be stored.")); 128 Parameters.Add(new LookupParameter<IntValue>("EvaluatedMoves", "The number of evaluated moves.")); 129 #endregion 130 131 #region Create operators 132 Assigner temperatureInitializer = new Assigner(); 133 ResultsCollector resultsCollector1 = new ResultsCollector(); 134 SubScopesProcessor subScopesProcessor0 = new SubScopesProcessor(); 135 Placeholder analyzer1 = new Placeholder(); 136 SubScopesProcessor sssp = new SubScopesProcessor(); 137 ResultsCollector resultsCollector = new ResultsCollector(); 138 Placeholder annealingOperator = new Placeholder(); 139 UniformSubScopesProcessor mainProcessor = new UniformSubScopesProcessor(); 140 Placeholder moveGenerator = new Placeholder(); 141 UniformSubScopesProcessor moveEvaluationProcessor = new UniformSubScopesProcessor(); 142 Placeholder moveEvaluator = new Placeholder(); 143 SubScopesCounter subScopesCounter = new SubScopesCounter(); 144 ProbabilisticQualityComparator qualityComparator = new ProbabilisticQualityComparator(); 145 ConditionalBranch improvesQualityBranch = new ConditionalBranch(); 146 Placeholder moveMaker = new Placeholder(); 147 SubScopesRemover subScopesRemover = new SubScopesRemover(); 148 IntCounter iterationsCounter = new IntCounter(); 149 Comparator iterationsComparator = new Comparator(); 150 SubScopesProcessor subScopesProcessor1 = new SubScopesProcessor(); 151 Placeholder analyzer2 = new Placeholder(); 152 ConditionalBranch iterationsTermination = new ConditionalBranch(); 153 154 temperatureInitializer.LeftSideParameter.ActualName = TemperatureParameter.ActualName; 155 temperatureInitializer.RightSideParameter.ActualName = StartTemperatureParameter.Name; 156 157 resultsCollector1.CollectedValues.Add(new LookupParameter<IntValue>(IterationsParameter.Name)); 158 resultsCollector1.ResultsParameter.ActualName = ResultsParameter.Name; 159 160 analyzer1.Name = "Analyzer (placeholder)"; 161 analyzer1.OperatorParameter.ActualName = AnalyzerParameter.Name; 162 163 annealingOperator.Name = "Annealing operator (placeholder)"; 164 annealingOperator.OperatorParameter.ActualName = AnnealingOperatorParameter.Name; 165 166 moveGenerator.Name = "Move generator (placeholder)"; 167 moveGenerator.OperatorParameter.ActualName = MoveGeneratorParameter.Name; 168 169 moveEvaluator.Name = "Move evaluator (placeholder)"; 170 moveEvaluator.OperatorParameter.ActualName = MoveEvaluatorParameter.Name; 171 172 subScopesCounter.Name = "Increment EvaluatedMoves"; 173 subScopesCounter.ValueParameter.ActualName = EvaluatedMovesParameter.Name; 174 175 qualityComparator.LeftSideParameter.ActualName = MoveQualityParameter.Name; 176 qualityComparator.RightSideParameter.ActualName = QualityParameter.Name; 177 qualityComparator.ResultParameter.ActualName = "IsBetter"; 178 qualityComparator.DampeningParameter.ActualName = "Temperature"; 179 180 improvesQualityBranch.ConditionParameter.ActualName = "IsBetter"; 181 182 moveMaker.Name = "Move maker (placeholder)"; 183 moveMaker.OperatorParameter.ActualName = MoveMakerParameter.Name; 184 185 subScopesRemover.RemoveAllSubScopes = true; 186 187 iterationsCounter.Name = "Increment Iterations"; 188 iterationsCounter.Increment = new IntValue(1); 189 iterationsCounter.ValueParameter.ActualName = IterationsParameter.Name; 190 191 iterationsComparator.Name = "Iterations >= MaximumIterations"; 192 iterationsComparator.LeftSideParameter.ActualName = IterationsParameter.Name; 193 iterationsComparator.RightSideParameter.ActualName = MaximumIterationsParameter.Name; 194 iterationsComparator.ResultParameter.ActualName = "Terminate"; 195 iterationsComparator.Comparison.Value = ComparisonType.GreaterOrEqual; 196 197 analyzer2.Name = "Analyzer (placeholder)"; 198 analyzer2.OperatorParameter.ActualName = AnalyzerParameter.Name; 199 200 iterationsTermination.Name = "Iterations termination condition"; 201 iterationsTermination.ConditionParameter.ActualName = "Terminate"; 202 #endregion 203 204 #region Create operator graph 205 OperatorGraph.InitialOperator = temperatureInitializer; 206 temperatureInitializer.Successor = resultsCollector1; 207 resultsCollector1.Successor = subScopesProcessor0; 208 subScopesProcessor0.Operators.Add(analyzer1); 209 subScopesProcessor0.Successor = sssp; 210 analyzer1.Successor = null; 211 sssp.Operators.Add(resultsCollector); 212 sssp.Successor = annealingOperator; 213 resultsCollector.Successor = null; 214 annealingOperator.Successor = mainProcessor; 215 mainProcessor.Operator = moveGenerator; 216 mainProcessor.Successor = iterationsCounter; 217 moveGenerator.Successor = moveEvaluationProcessor; 218 moveEvaluationProcessor.Operator = moveEvaluator; 219 moveEvaluationProcessor.Successor = subScopesCounter; 220 moveEvaluator.Successor = qualityComparator; 221 qualityComparator.Successor = improvesQualityBranch; 222 improvesQualityBranch.TrueBranch = moveMaker; 223 improvesQualityBranch.FalseBranch = null; 224 improvesQualityBranch.Successor = null; 225 moveMaker.Successor = null; 226 subScopesCounter.Successor = subScopesRemover; 227 subScopesRemover.Successor = null; 228 iterationsCounter.Successor = iterationsComparator; 229 iterationsComparator.Successor = subScopesProcessor1; 230 subScopesProcessor1.Operators.Add(analyzer2); 231 subScopesProcessor1.Successor = iterationsTermination; 232 iterationsTermination.TrueBranch = null; 233 iterationsTermination.FalseBranch = annealingOperator; 234 #endregion 235 } 236 237 [StorableHook(HookType.AfterDeserialization)] 238 private void AfterDeserialization() { 239 // BackwardsCompatibility3.3 240 #region Backwards compatible code (remove with 3.4) 241 if (!Parameters.ContainsKey("Iterations")) 242 Parameters.Add(new LookupParameter<IntValue>("Iterations", "The number of iterations.")); 243 if (!Parameters.ContainsKey("Temperature")) 244 Parameters.Add(new LookupParameter<DoubleValue>("Temperature", "The current temperature.")); 245 #endregion 246 } 247 248 public override IOperation Apply() { 249 if (MoveGeneratorParameter.ActualValue == null || MoveEvaluatorParameter.ActualValue == null || MoveMakerParameter.ActualValue == null) 250 return null; 251 return base.Apply(); 252 } 253 } 335 254 }
Note: See TracChangeset
for help on using the changeset viewer.