/// <summary>
        /// Given a list of points, return the points, each with an orderId.
        /// </summary>
        /// <param name="points"></param>
        /// <returns></returns>
        private IEnumerable <OrderPoint> GetOrderPoints(IEnumerable <Point> points)
        {
            if (points.Count() > MaxClusterSize)
            {
                return(points.Select((p, i) => new OrderPoint()
                {
                    PointId = p.PointId,
                    Name = p.Name,
                    HorizontalDisplacement = p.HorizontalDisplacement,
                    VerticalDisplacement = p.VerticalDisplacement,
                    OrderId = i
                }));
            }
            var vertices = TourBridge.GetVertices(points);
            var matrix   = TourBridge.GetMatrix(points);

            var tourProvider   = new TourProvider(vertices, matrix);
            var solvedVertices = tourProvider.Solve();
            var orderedPoints  = TourBridge.GetPoints(points, solvedVertices);

            return(orderedPoints.Select((p, i) => new OrderPoint()
            {
                PointId = p.PointId,
                Name = p.Name,
                HorizontalDisplacement = p.HorizontalDisplacement,
                VerticalDisplacement = p.VerticalDisplacement,
                OrderId = i
            }));
        }
        public void SolveTest()
        {
            var vertices = new [] { 0, 1, 2, 3 };
            var matrix   = new double[, ]
            {
                { 0, 10, 15, 20 },
                { 5, 0, 9, 10 },
                { 6, 13, 0, 12 },
                { 8, 8, 9, 0 }
            };

            var expectedRoute = new [] { 0, 1, 3, 2, 0 };

            var DynamicProgramming = new TourProvider(vertices, matrix);
            var route = DynamicProgramming.Solve();

            Assert.IsTrue(ListComparer.Compare(expectedRoute, route.ToArray()));
        }