/// <summary>
        /// Create problem from list of nodes
        /// </summary>
        /// <param name="nodes">list of nodes defining TSP problem instance</param>
        /// <returns>Generated TSP problem</returns>
        public static TravelingSalesmanProblem FromNodes(List <INode> nodes)
        {
            if (nodes == null)
            {
                throw new ArgumentNullException("nodes");
            }

            var nodeProvider        = new NodeListBasedNodeProvider(nodes);
            var edgeProvider        = new NodeBasedEdgeProvider(nodes);
            var edgeWeightsProvider = new FunctionBasedWeightProviderWithCaching(new Euclidean());
            var fixedEdgesProvider  = new EdgeListBasedFixedEdgesProvider(new EdgesCollection());

            return(new TravelingSalesmanProblem(nodes.Count + " city TSP problem", "Generated", ProblemType.ATSP, nodeProvider, edgeProvider, edgeWeightsProvider, fixedEdgesProvider));
        }
        /// <summary>
        /// Create problem from list of nodes
        /// </summary>
        /// <param name="nodes">list of nodes defining TSP problem instance</param>
        /// <returns>Generated TSP problem</returns>
        public static TravelingSalesmanProblem FromNodes(List<INode> nodes)
        {
            if (nodes == null)
            {
                throw new ArgumentNullException("nodes");
            }

            var nodeProvider = new NodeListBasedNodeProvider(nodes);
            var edgeProvider = new NodeBasedEdgeProvider(nodes);
            var edgeWeightsProvider = new FunctionBasedWeightProviderWithCaching(new Euclidean());
            var fixedEdgesProvider = new EdgeListBasedFixedEdgesProvider(new EdgesCollection());
            return new TravelingSalesmanProblem(nodes.Count + " city TSP problem", "Generated", ProblemType.ATSP, nodeProvider, edgeProvider, edgeWeightsProvider, fixedEdgesProvider);
        }