Пример #1
0
        private static void TestSerailDataVisits(string serialDataName, int numberOfRuns = 5)
        {
            var solverInputData = Deserialize(serialDataName);
            // solverInputData.DayDuration = solverInputData.DayDuration.Select(d => (int)(d / 0.7)).ToArray();
            double mip_gap = 0;

            for (int i = 1; i <= numberOfRuns; i++)
            {
                var sw     = Stopwatch.StartNew();
                var solver = new ClusteringILPSolver(solverInputData);
                solver.Solve(mip_gap, 10 * 60 * 1000);
                var routeResult = solver.GetResult();
                sw.Stop();
                ConsoleExt.WriteLine($"{i}/{numberOfRuns}: Elapsed s: {sw.ElapsedMilliseconds / 1000}", InfoColor);

                Console.WriteLine();
                Console.WriteLine();
                var routes = routeResult.Waypoints
                             .Cast <List <Waypoint> >()
                             .Select(wp => wp.Aggregate("",
                                                        (carry, n) => carry + Environment.NewLine + solverInputData.VisitNames[n.Visit]));


                int ctr = 0;
                foreach (var route in routes)
                {
                    File.WriteAllText($"R{ctr}_{mip_gap}.csv", $"Address{Environment.NewLine}{route}");
                    ConsoleExt.WriteLine(ctr.ToString(), ResultColor);
                    ConsoleExt.WriteLine(route, ResultColor);
                    ctr++;
                }
            }
        }
        public void TestConnectedGraph()
        {
            bool[,] santas = new bool[1, 1] {
                { true }
            };
            int[] visitsDuration = new int[5] {
                1, 1, 1, 1, 1
            };
            VisitState[,] visitStates = new VisitState[1, 5] {
                {
                    VisitState.Default, VisitState.Default, VisitState.Default, VisitState.Default, VisitState.Default
                }
            };

            int[,] distances = new int[5, 5]
            {
                { 0, 2, 4, 5, 5 },
                { 2, 0, 2, 3, 3 },
                { 4, 2, 0, 1, 1 },
                { 5, 3, 1, 0, 1 },
                { 5, 3, 1, 1, 0 }
            };

            //     5 - 4
            //     \_3_/
            //       |
            //       |
            //       2
            //       |
            //       |
            //       1

            int[] dayDuration = new int[1] {
                17
            };

            var solverInputData = new SolverInputData(santas, visitsDuration, visitStates, distances, dayDuration, null)
            {
                VisitIds = new long[] { 0, 1, 2, 3, 4, 5 }
            };
            var solver = new ClusteringILPSolver(solverInputData);

            solver.Solve(0, 60000);
            var result = solver.GetResult();

            Assert.IsNotNull(result);
            Assert.AreEqual(5, result.Waypoints[0, 0].Count);
        }
Пример #3
0
        private void TestFakeData()
        {
            const int numberOfDays   = 1;
            const int numberOfSantas = 2;
            const int numberOfVisits = 5;
            var       santas         = new bool[numberOfDays, numberOfSantas]
            {
                { true, true },
                // { true, true }
            };

            var visitsDuration = new int[numberOfVisits] {
                0, 3, 3, 3, 3
            };

            var t      = VisitState.Default;
            var visits = new VisitState[numberOfDays, numberOfVisits]
            {
                { t, t, t, t, t },
                //   { t, t, t, t, t},
            };


            var distances = new int[numberOfVisits, numberOfVisits]
            {
                { 0, 2, 2, 2, 2 },
                { 2, 0, 1, 3, 4 },
                { 2, 1, 0, 2, 3 },
                { 2, 3, 2, 0, 1 },
                { 2, 4, 3, 1, 0 },
            };
            var dayDuration = new int[numberOfDays]
            {
                10,
                //10
            };

            var santaBreaks = new int[numberOfSantas][]
            {
                new int[] {},
                new int[] {}
            };

            var solverInputData = new SolverInputData(santas, visitsDuration, visits, distances, dayDuration, santaBreaks);
            var solver          = new ClusteringILPSolver(solverInputData);

            solver.Solve(0, 60 * 1000);
        }
        public void TestConnectedMultipleSantaGraph()
        {
            const int numberOfDays   = 2;
            const int numberOfVisit  = 9;
            const int numberOfSantas = 1;

            bool[,] santas = new bool[numberOfDays, numberOfSantas] {
                { true }, { true }
            };
            int[] visitsDuration = new int[numberOfVisit] {
                1, 1, 1, 1, 1, 1, 1, 1, 1
            };
            VisitState[,] visitStates = new VisitState[numberOfDays, numberOfVisit] {
                { VisitState.Default, VisitState.Default, VisitState.Default, VisitState.Default, VisitState.Default, VisitState.Default, VisitState.Default, VisitState.Default, VisitState.Default },
                { VisitState.Default, VisitState.Default, VisitState.Default, VisitState.Default, VisitState.Default, VisitState.Default, VisitState.Default, VisitState.Default, VisitState.Default }
            };

            int[,] distances = new int[numberOfVisit, numberOfVisit]
            {
                { 0, 2, 4, 5, 5, 2, 4, 5, 5 },   // v0
                { 2, 0, 2, 3, 3, 4, 6, 7, 7 },   // v1
                { 4, 2, 0, 1, 1, 6, 8, 9, 9 },   // v2
                { 5, 3, 1, 0, 1, 7, 9, 10, 10 }, // v3
                { 5, 3, 1, 1, 0, 7, 9, 10, 10 }, // v4
                { 2, 4, 6, 7, 7, 0, 2, 3, 3 },   // v5
                { 4, 6, 8, 9, 9, 2, 0, 1, 1 },   // v6
                { 5, 7, 9, 10, 10, 3, 1, 0, 1 }, // v7
                { 5, 7, 9, 10, 10, 3, 1, 1, 0 }, // v8
            };

            //     4 - 3
            //     \_2_/
            //       |
            //       |
            //       1
            //       |
            //       |
            //       0 V0
            //       |
            //       |
            //       5
            //       |
            //       |
            //      _6_
            //     /   \
            //     8 - 7

            int[] dayDuration = new int[numberOfDays] {
                17, 17
            };

            var solverInputData = new SolverInputData(santas, visitsDuration, visitStates, distances, dayDuration, null)
            {
                VisitIds = new long[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 }
            };
            var solver = new ClusteringILPSolver(solverInputData);

            solver.Solve(0, 60000);
            var result = solver.GetResult();

            Assert.IsNotNull(result);
            var possibleRoutes = new[] {
                "0 | 0;5 | 1;6 | 2;7 | 3;8 | 4",
                "0 | 0;5 | 1;6 | 2;8 | 3;7 | 4",

                "0 | 0;1 | 1;2 | 2;3 | 3;4 | 4",
                "0 | 0;1 | 1;2 | 2;4 | 3;3 | 4",
            };

            var route1 = string.Join(";", result.Waypoints[0, 0]);
            var route2 = string.Join(";", result.Waypoints[0, 1]);

            Assert.IsTrue(possibleRoutes.Contains(route1));
            Assert.IsTrue(possibleRoutes.Contains(route2));
            Assert.AreNotEqual(route1, route2);
        }