public void Remove()
        {
            var tourProviders = new SourceList <TourProvider>();

            var allTours = tourProviders.Connect().TransformMany(tourProvider => tourProvider.Tours).AsObservableList();

            var tour1_1 = new Tour("Tour 1.1");
            var tour2_1 = new Tour("Tour 2.1");
            var tour2_2 = new Tour("Tour 2.2");
            var tour3_1 = new Tour("Tour 3.1");

            var tp1 = new TourProvider("Tour provider 1", new[] { tour1_1 });
            var tp2 = new TourProvider("Tour provider 2", new[] { tour2_1, tour2_2 });
            var tp3 = new TourProvider("Tour provider 3", null);

            tourProviders.AddRange(new[] { tp1, tp2, tp3 });

            allTours.Items.Should().BeEquivalentTo(tour1_1, tour2_1, tour2_2);

            tp3.Tours.Add(tour3_1);
            allTours.Items.Should().BeEquivalentTo(tour1_1, tour2_1, tour2_2, tour3_1);

            tp2.Tours.Remove(tour2_1);
            allTours.Items.Should().BeEquivalentTo(tour1_1, tour2_2, tour3_1);

            tp2.Tours.Add(tour2_1);
            allTours.Items.Should().BeEquivalentTo(tour1_1, tour2_1, tour2_2, tour3_1);
        }
        /// <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()));
        }