Exemplo n.º 1
0
 private static void inheritLegacy(TaxiRunningStatistics heritor, TaxiRunningStatistics legacy)
 {
     if (legacy != null)
     {
         heritor.EmptyRunningDistance  += legacy.EmptyRunningDistance;
         heritor.EmptyRunningDuration  += legacy.EmptyRunningDuration;
         heritor.LoadedRunningDistance += legacy.LoadedRunningDistance;
         heritor.LoadedRunningDuration += legacy.LoadedRunningDuration;
         Console.WriteLine("----预估空车行驶时间:" + legacy.EmptyRunningDuration + "s");
         Console.WriteLine("----预估空车行驶距离:" + legacy.EmptyRunningDistance + "m");
         Console.WriteLine("----预估重车行驶时间:" + legacy.LoadedRunningDuration + "s");
         Console.WriteLine("----预估重车行驶距离:" + legacy.LoadedRunningDistance + "m");
         Console.WriteLine();
     }
 }
Exemplo n.º 2
0
        public static List <List <TaxiRunningStatistics> > analyse(TaxiRunningSnapshot[] snapshots)
        {
            List <List <TaxiRunningStatistics> > result = new List <List <TaxiRunningStatistics> >();
            int i = 0;

            while (i < snapshots.Length)
            {
                List <TaxiRunningStatistics> statisticInOneDay = new List <TaxiRunningStatistics>();
                DateTime currentDay = snapshots[i].Timestamp.Date, nextDay = currentDay.AddDays(1);
                TaxiRunningStatistics lastHourLegacy = null; Boolean hasLegacy = false;
                while (i < snapshots.Length && between(snapshots[i].Timestamp, currentDay, nextDay))
                {
                    TaxiRunningStatistics statisticInOneHour = new TaxiRunningStatistics();
                    DateTime[]            floorAndCeiling    = GetFloorAndCeiling(snapshots[i].Timestamp);
                    statisticInOneHour.TaxiId    = snapshots[i].TaxiId;
                    statisticInOneHour.StartTime = floorAndCeiling[0];
                    statisticInOneHour.EndTime   = floorAndCeiling[1];
                    Console.WriteLine("开始统计:" + statisticInOneHour.StartTime + "到" + statisticInOneHour.EndTime + "的空驶率...");
                    if (hasLegacy)
                    {
                        inheritLegacy(statisticInOneHour, lastHourLegacy);
                        hasLegacy = false;
                    }
                    TaxiRunningSnapshot lastSnapshot = null, currentSnapshot = null;
                    while (i < snapshots.Length && between(snapshots[i].Timestamp, statisticInOneHour.StartTime, statisticInOneHour.EndTime))
                    {
                        currentSnapshot = snapshots[i];
                        if (lastSnapshot != null)
                        {
                            double duration = currentSnapshot.Timestamp.Subtract(lastSnapshot.Timestamp).TotalSeconds;
                            double distance = DistanceCalculator.Measure(lastSnapshot.Location, currentSnapshot.Location);
                            if (lastSnapshot.TaxiState == TaxiState.Empty)
                            {
                                statisticInOneHour.EmptyRunningDuration += duration;
                                statisticInOneHour.EmptyRunningDistance += distance;
                            }
                            else
                            {
                                statisticInOneHour.LoadedRunningDuration += duration;
                                statisticInOneHour.LoadedRunningDistance += distance;
                            }
                            printMessage(lastSnapshot.TaxiState, duration, distance);
                        }
                        lastSnapshot = currentSnapshot;
                        i++;
                    }
                    if (i < snapshots.Length)
                    {
                        //currentSnapshot为一个新小时的开始,对上一个小时的末尾进行预测
                        currentSnapshot = snapshots[i];
                        if (currentSnapshot.Timestamp.Subtract(lastSnapshot.Timestamp).TotalSeconds <= Config.GetPredictableRange())
                        {
                            Console.WriteLine("正在预估行驶时间和行驶距离...");
                            lastHourLegacy = new TaxiRunningStatistics();
                            double extraInDuration  = statisticInOneHour.EndTime.Subtract(lastSnapshot.Timestamp).TotalSeconds;
                            double duration         = currentSnapshot.Timestamp.Subtract(lastSnapshot.Timestamp).TotalSeconds;
                            double legacyInDuration = duration - extraInDuration;
                            double distance         = DistanceCalculator.Measure(lastSnapshot.Location, currentSnapshot.Location);
                            double legacyInDistance = distance * legacyInDuration / duration;
                            double extraInDistance  = distance * extraInDuration / duration;
                            if (lastSnapshot.TaxiState == TaxiState.Empty)
                            {
                                statisticInOneHour.EmptyRunningDuration += extraInDuration;
                                statisticInOneHour.EmptyRunningDistance += extraInDistance;
                                lastHourLegacy.EmptyRunningDuration      = legacyInDuration;
                                lastHourLegacy.EmptyRunningDistance      = legacyInDistance;
                            }
                            else
                            {
                                statisticInOneHour.LoadedRunningDuration += extraInDuration;
                                statisticInOneHour.LoadedRunningDistance += extraInDistance;
                                lastHourLegacy.LoadedRunningDuration      = legacyInDuration;
                                lastHourLegacy.LoadedRunningDistance      = legacyInDistance;
                            }
                            printMessage(lastSnapshot.TaxiState, extraInDuration, extraInDistance);
                            hasLegacy = true;
                        }
                    }
                    Console.WriteLine(statisticInOneHour.StartTime + "到" + statisticInOneHour.EndTime + "的数据统计完毕:");
                    Console.WriteLine(statisticInOneHour);
                    Console.WriteLine();
                    statisticInOneDay.Add(statisticInOneHour);
                }
                result.Add(statisticInOneDay);
            }
            return(result);
        }