private static DPNProblemContext GenerateProblemContext()
        {
            RnsmWorkspace     wor  = GenerateWorkspace();
            DPNProblemContext _ctx = new DPNProblemContext(wor)
            {
                TransferThreshold = 3,
                Vot             = 1,
                ControlInterval = 3,
                PriceLevelList  = new List <decimal> {
                    0.9m, 1, 1.1m
                },
                BasicPriceDic = new Dictionary <IServiceSegment, decimal>()
                {
                    { wor.RailwayTimeTable.TrainTrips.First().ServiceSegments.First(), 20m },
                    { wor.RailwayTimeTable.TrainTrips.First().ServiceSegments.Last(), 20m },
                    { wor.RailwayTimeTable.TrainTrips.Last().ServiceSegments.First(), 20m }
                },
                Pal = new CustomerArrivalChain()
                {
                    new CustomerArrival()
                    {
                        ArriveTime = new DateTime(1991, 7, 5, 0, 0, 1),
                        QueueOrder = 1,
                        Customer   = new CustomerInfo()
                        {
                            MarSegID = 3
                        }
                    },
                    new CustomerArrival()
                    {
                        ArriveTime = new DateTime(1991, 7, 5, 0, 2, 0),
                        QueueOrder = 2,
                        Customer   = new CustomerInfo()
                        {
                            MarSegID = 3
                        }
                    },
                },
                StartTime = new DateTime(1991, 7, 5, 0, 0, 0),
                EndTime   = new DateTime(1991, 7, 5, 0, 10, 0),
                SitaDic   = new Dictionary <int, decimal>()
            };

            _ctx.SetParameter("BigM", 9999m);
            _ctx.SetParameter("Resolution", 1);
            _ctx.SetParameter("WaitingCost", 0.1);
            return(_ctx);
        }
        public void Case1_Mix2()//5:5
        {
            DPNProblemContext ctx    = GenerateProblemContext1();
            DpnSolver         solver = new DpnSolver(ctx);

            ctx.SetParameter("ObjectiveType", "MinTotalCost_MaxRevenue_Mix");
            ctx.SetParameter("MinTotalCost_weight", 0.5m);
            ctx.SetParameter("MaxRevenue_weight", 0.5m);
            solver.Logger = Console.Out;
            Console.WriteLine($"旅客到达信息:");
            foreach (CustomerArrival arr in ctx.Pal)
            {
                Console.WriteLine($"旅客{arr.QueueOrder}:{arr.ArriveTime.ToLongTimeString()}(" +
                                  $"{ctx.Wor.Mar.ConvertToInttime(arr.ArriveTime)}),市场:{arr.Customer.MarSegID}");
            }

            solver.OnFeasibleSolutionGenerated = (a, b) =>
            {
                foreach (string str in a)
                {
                    Console.WriteLine(str);
                }
                foreach (string str in b)
                {
                    Console.WriteLine(str);
                }
            };
            solver.OnIterationFinished = (s) =>
            {
            };

            Console.WriteLine($"计算开始:");

            solver.Work();

            Assert.IsTrue(true);
        }
        public void Case0_MinTravelTime()
        {
            DPNProblemContext ctx = GenerateProblemContext0();

            ctx.SetParameter("ObjectiveType", "MinTravelTimeCost");
            DpnSolverV4 solver = new DpnSolverV4(ctx);

            solver.Logger = Console.Out;
            Console.WriteLine($"旅客到达信息:");
            foreach (CustomerArrival arr in ctx.Pal)
            {
                Console.WriteLine($"旅客{arr.QueueOrder}:{arr.ArriveTime.ToLongTimeString()}(" +
                                  $"{ctx.Wor.Mar.ConvertToInttime(arr.ArriveTime)}),市场:{arr.Customer.MarSegID}");
            }
            solver.OnLowerBoundSolutionGenerated = (a) =>
            {
                foreach (string str in a)
                {
                    Console.WriteLine(str);
                }
            };
            solver.OnFeasibleSolutionGenerated = (a, b) =>
            {
                foreach (string str in a)
                {
                    Console.WriteLine(str);
                }
                foreach (string str in b)
                {
                    Console.WriteLine(str);
                }
            };
            solver.OnIterationFinished = (s) =>
            {
                Console.WriteLine(s);
            };

            Console.WriteLine($"计算开始:");

            solver.Work();

            Assert.AreEqual(6.5m + 6.5m + 4m + 8.5m, Math.Round(solver.ObjValue, 1));
        }
        private static DPNProblemContext GenerateProblemContext1()
        {
            IRnsmWorkspace    wor  = GenerateWorkspace1();
            DPNProblemContext _ctx = new DPNProblemContext(wor)
            {
                TransferThreshold = 60,
                Vot             = 0.1m,
                ControlInterval = 4,
                PriceLevelList  = new List <decimal> {
                    0.8m, 1, 1.2m
                },
                BasicPriceDic = new Dictionary <IServiceSegment, decimal>()
                {
                    { wor.RailwayTimeTable.Trains.First().ServiceSegments.First(), 100m },
                    { wor.RailwayTimeTable.Trains.First().ServiceSegments.Last(), 100m },
                    { wor.RailwayTimeTable.Trains.Last().ServiceSegments.First(), 100m },
                    { wor.RailwayTimeTable.Trains.Last().ServiceSegments.Last(), 100m }
                },
                Pal = new CustomerArrivalChain()
                {
                    new CustomerArrival()
                    {
                        QueueOrder = 1,
                        ArriveTime = new DateTime(1991, 7, 5, 0, 0, 1),
                        Customer   = new CustomerInfo()
                        {
                            MarSegID = 2
                        }
                    },
                    new CustomerArrival()
                    {
                        QueueOrder = 2,
                        ArriveTime = new DateTime(1991, 7, 5, 0, 1, 0),
                        Customer   = new CustomerInfo()
                        {
                            MarSegID = 3
                        }
                    },
                    new CustomerArrival()
                    {
                        QueueOrder = 3,
                        ArriveTime = new DateTime(1991, 7, 5, 0, 2, 0),
                        Customer   = new CustomerInfo()
                        {
                            MarSegID = 2
                        }
                    },
                    new CustomerArrival()
                    {
                        QueueOrder = 4,
                        ArriveTime = new DateTime(1991, 7, 5, 0, 2, 1),
                        Customer   = new CustomerInfo()
                        {
                            MarSegID = 3
                        }
                    },
                    new CustomerArrival()
                    {
                        QueueOrder = 5,
                        ArriveTime = new DateTime(1991, 7, 5, 0, 2, 2),
                        Customer   = new CustomerInfo()
                        {
                            MarSegID = 2
                        }
                    },
                    new CustomerArrival()
                    {
                        QueueOrder = 6,
                        ArriveTime = new DateTime(1991, 7, 5, 0, 2, 3),
                        Customer   = new CustomerInfo()
                        {
                            MarSegID = 3
                        }
                    },
                    new CustomerArrival()
                    {
                        QueueOrder = 7,
                        ArriveTime = new DateTime(1991, 7, 5, 0, 2, 4),
                        Customer   = new CustomerInfo()
                        {
                            MarSegID = 2
                        }
                    },
                    new CustomerArrival()
                    {
                        QueueOrder = 8,
                        ArriveTime = new DateTime(1991, 7, 5, 0, 2, 5),
                        Customer   = new CustomerInfo()
                        {
                            MarSegID = 3
                        }
                    },
                    new CustomerArrival()
                    {
                        QueueOrder = 9,
                        ArriveTime = new DateTime(1991, 7, 5, 0, 5, 1),
                        Customer   = new CustomerInfo()
                        {
                            MarSegID = 1
                        }
                    },
                    new CustomerArrival()
                    {
                        QueueOrder = 10,
                        ArriveTime = new DateTime(1991, 7, 5, 0, 9, 7),
                        Customer   = new CustomerInfo()
                        {
                            MarSegID = 3
                        }
                    },
                },
                StartTime = new DateTime(1991, 7, 5, 0, 0, 0),
                EndTime   = new DateTime(1991, 7, 5, 0, 10, 0),
                SitaDic   = new Dictionary <int, decimal>()
            };

            foreach (var marketseg in _ctx.Wor.Mar as IEnumerable <IRailwayMarketSegment> )
            {
                _ctx.SitaDic.Add(marketseg.MSID, 50m);
            }
            _ctx.SetParameter("TerminalFactor", 0.0001);
            _ctx.SetParameter("Iteration", 50);
            _ctx.SetParameter("Resolution", 1);
            _ctx.SetParameter("WaitingCost", 0.1m);
            _ctx.SetParameter("InitMultiper", 0.1m);

            return(_ctx);
        }