public override string ToString() { return($"FromStop = {FromStop}, ToStop = {ToStop} @ {TimeHelpers.UnixTimeToDateTime(DateTime)}."); }
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); } }