public TConfiguration Apply(TConfiguration configuration)
        {
            var newConfigurations = new List <SimulatedAnnealingConfiguration>();

            for (int i = 0; i < Chains.Count; i++)
            {
                newConfigurations.Add(SimulatedAnnealingConfiguration.GetDefaultConfiguration());
            }

            var copy = configuration.SmartClone();

            copy.Chains = Chains;
            copy.SimulatedAnnealingConfiguration = new SimulatedAnnealingConfigurationProvider(newConfigurations);
            return(copy);
        }
 // TODO: should configuration be null by default?
 public SimulatedAnnealingEvolver(IChainBasedLayoutOperations <TLayout, TNode> layoutOperations, SimulatedAnnealingConfiguration configuration = null, bool addNodesGreedilyBeforeEvolve = false)
 {
     LayoutOperations = layoutOperations ?? throw new ArgumentNullException(nameof(layoutOperations));
     Configuration    = configuration ?? SimulatedAnnealingConfiguration.GetDefaultConfiguration();
     this.addNodesGreedilyBeforeEvolve = addNodesGreedilyBeforeEvolve;
 }