/// <summary>
 /// Creates SimulatedAnnealing algorithm instance
 /// </summary>
 /// <param name="graph">Graph on which algorithm will operate</param>
 /// <param name="problem">Problem for which algorithm will attempt to find solution</param>
 /// <param name="setup">Setup for algorithm's cooling process</param>
 //TODO: Introduce SavedState complex type
 public SimulatedAnnealing(Graph graph, IProblem problem, CoolingSetup setup, double? currentTemperature = null, Guid? id = null) : base(graph, problem, id)
 {
     if (setup == null)
         throw new ArgumentNullException(nameof(setup));
     if (!setup.IsValid())
         throw new ArgumentException("Setup is invalid", nameof(setup));
     CoolingSetup = setup;
     if (currentTemperature.HasValue)
         CurrentTemperature = currentTemperature.Value;
     else
         CurrentTemperature = setup.InitialTemperature;
 }
 /// <summary>
 /// Creates SimulatedAnnealing algorithm instance
 /// </summary>
 /// <param name="graph">Graph on which algorithm will operate</param>
 /// <param name="problem">Problem for which algorithm will attempt to find solution</param>
 /// <param name="setup">Setup for algorithm's cooling process</param>
 //TODO: Introduce SavedState complex type
 public SimulatedAnnealing(Graph graph, IProblem problem, CoolingSetup setup, double?currentTemperature = null, Guid?id = null) : base(graph, problem, id)
 {
     if (setup == null)
     {
         throw new ArgumentNullException(nameof(setup));
     }
     if (!setup.IsValid())
     {
         throw new ArgumentException("Setup is invalid", nameof(setup));
     }
     CoolingSetup = setup;
     if (currentTemperature.HasValue)
     {
         CurrentTemperature = currentTemperature.Value;
     }
     else
     {
         CurrentTemperature = setup.InitialTemperature;
     }
 }