예제 #1
0
 public override string ToString()
 {
     return($"FromStop = {FromStop}, ToStop = {ToStop} @ {TimeHelpers.UnixTimeToDateTime(DateTime)}.");
 }
예제 #2
0
        static void Main(string[] args)
        {
            var random = new Random();
            var ts     = new TransportSystem("TransportSystem");

            const int noOfTests   = 500; // no of test to conduct
            const int minSpeed    = 1;
            const int maxSpeed    = 12;  // max speed for heuresutic
            int       validTestNo = 0;

            Console.WriteLine("Så kører vi");

            var fs = new FileStream(@"C:\Dropbox\CSS\TransportSystem\Heurestics.csv", FileMode.Create);

            using (var writer = new StreamWriter(fs, Encoding.UTF8))
            {
                writer.Write("Test no; From Stop; To Stop; Date Time; Day;Distance;rute time;lowest Speed; min speed; min iter; 0-routeTime;0-time;");
                for (int i = minSpeed; i <= maxSpeed; i++)
                {
                    writer.Write($"{i} -routeTime; {i} -time;");
                }
                writer.WriteLine();

                for (int i = 0; i < noOfTests; i++)
                {
                    // first find arbitrary stop points and time!
                    TestData thisTest = new TestData
                    {
                        FromStop = GetStopNo(105, 10946),
                        ToStop   = GetStopNo(105, 10946),
                        //DateTime = (int)UTCHelpers.Parse ()   // giver "DateTime_Now" i datasættet
                        DateTime = random.Next(1461546000, 1462155600)
                    };
                    thisTest.TestDatas = new List <Test>();
                    var referenceTest = ConductTest(thisTest.FromStop, thisTest.ToStop, thisTest.DateTime, 0);
                    Console.WriteLine(thisTest + "Distance = " + referenceTest.Distance + " m. Tid brugt = " + referenceTest.TimeUsed);

                    thisTest.PathFound = !(referenceTest.Path == null);
                    if (!thisTest.PathFound)
                    {
                        continue;                       // no path found, skipping rest of test!
                    }
                    Console.WriteLine($"Path found for test # {i}");

                    referenceTest.Valid = true;  // speed = 0 => Dijkstra Algorithm.
                    thisTest.TestDatas.Add(referenceTest);

                    Console.WriteLine($"Reference test = {referenceTest.Iterations}. Route Time = {referenceTest.RouteTime.ToTime()}.");
                    validTestNo++;
                    for (int j = minSpeed; j <= maxSpeed; j++)
                    {
                        var newTest = ConductTest(thisTest.FromStop, thisTest.ToStop, thisTest.DateTime, j);
                        newTest.Valid = ComparteTests(referenceTest.Path, newTest.Path);
                        Console.WriteLine($"Test med Speed = {j} m/s, {newTest.Iterations} iterationer, er {newTest.Valid}. Tid brugt = {newTest.TimeUsed}. Route længde = {newTest.RouteTime.ToTime()}");
                        thisTest.TestDatas.Add(newTest);
                    }

                    var dateTime = TimeHelpers.UnixTimeToDateTime(thisTest.DateTime);
                    writer.Write($"{validTestNo};{thisTest.FromStop};{thisTest.ToStop};{dateTime.ToTime()};{dateTime.ToDayOfWeek()};{thisTest.TestDatas[0].Distance};{thisTest.TestDatas[0].RouteTime.ToTime()};");

                    int           minInterations     = Int32.MaxValue - 1;
                    int           speedMinIterations = 0;
                    int           lowestSpeed        = Int32.MaxValue - 1;
                    StringBuilder s = new StringBuilder();
                    for (int t = 0; t < thisTest.TestDatas.Count; t++)
                    {
                        var test = thisTest.TestDatas[t];
                        s.Append($"{test.RouteTime.ToTime()};");
                        if (test.Valid)
                        {
                            s.Append($"{test.TimeUsed};");
                            if (test.Iterations < minInterations)
                            {
                                minInterations     = test.Iterations;
                                speedMinIterations = test.Speed;
                            }
                            if ((test.Speed < lowestSpeed) & t > 0)  // Dijkstra not to be included!
                            {
                                lowestSpeed = test.Speed;
                            }
                        }
                        else
                        {
                            s.Append($"0;");
                        }
                    }
                    writer.Write($"{lowestSpeed};{speedMinIterations};{speedMinIterations};");
                    writer.Write(s.ToString());
                    writer.WriteLine();
                }
                writer.Flush();
            }

            if (fs != null)
            {
                fs.Close();
                fs.Dispose();
            }

            Console.WriteLine("Tryk en tast..");
            Console.ReadKey();



            int GetStopNo(int min, int max)
            {
                int stopFound = 0;

                while (stopFound == 0)
                {
                    int r = random.Next(min, max);
                    stopFound = ts.NetworkNodes.Where(s => s.StopId == r).Select(s => s.StopId).SingleOrDefault();
                }
                return(stopFound);
            }

            Test ConductTest(int a, int b, int time, int speed)
            {
                var AStar = new AStar(ts);

                var test = new Test {
                    Speed = speed, Valid = false
                };

                test.Distance = AStar.DistanceAB(a, b);
                if (speed == 0)
                {
                    AStar.StandardSpeed = 0;
                }
                else
                {
                    AStar.StandardSpeed = speed;
                }
                test.Path       = AStar.FindPath(a, b, time, true);
                test.Iterations = AStar.Iterations;
                test.TimeUsed   = AStar.StopWatch;
                test.RouteTime  = CalculateRouteTime(test.Path);
                return(test);
            }

            Boolean ComparteTests(List <PathItem> refList, List <PathItem> list)
            {
                if (list == null)
                {
                    return(false);
                }
                if (refList.Count != list.Count)
                {
                    return(false);
                }
                for (var i = 0; i < refList.Count; i++)
                {
                    if (!refList[i].Equals(list[i]))
                    {
                        return(false);
                    }
                }
                return(true);
            }

            long CalculateRouteTime(List <PathItem> refList)
            {
                if (refList == null)
                {
                    return(0);
                }
                long     startTime, endTime, walkTime = 0;
                int      i    = 0;
                PathItem item = refList[i];

                //  TimeTableId == -1 => Walking distance
                while ((item.TimeTableId == -1) & (i < refList.Count - 1))
                {
                    walkTime += ts.Edges.Where(x => x.EdgeId == item.EdgeId).FirstOrDefault().DistanceWalk;
                    i++;
                    item = refList[i];  // take next in list
                }
                var t = ts.TimeTables.Where(y => y.TimeTableId == item.TimeTableId).FirstOrDefault();

                if (t == null)
                {
                    return(0);            // invalid path!
                }
                startTime = t.DepartureTime - walkTime;

                walkTime = 0;
                i        = refList.Count - 1;
                item     = refList[i];
                while ((item.TimeTableId == -1) & (i > 0))
                {
                    walkTime += ts.Edges.Where(x => x.EdgeId == item.EdgeId).First().DistanceWalk;
                    i--;
                    item = refList[i];
                }
                t       = ts.TimeTables.Where(y => y.TimeTableId == item.TimeTableId).FirstOrDefault();
                endTime = t.ArrivalTime + walkTime;
                return(endTime - startTime);
            }
        }