public void AddModel(Model model)
 {
     if (_storage.ContainsKey(model.Segment) == false)
         _storage.Add(model.Segment, model);
     else
         _storage[model.Segment] = model;
 }
예제 #2
0
        /// <summary>
        /// Performs analysis of the travel times on the specific segment and creates it's model
        /// </summary>
        /// <param name="travelTimes"></param>
        /// <param name="segment"></param>
        /// <returns></returns>
        public Model Analyze(IEnumerable<TravelTime> travelTimes, SegmentInfo segment)
        {
            List<TravelTime> filteredTravelTimes = new List<TravelTime>();
            foreach (var tt in travelTimes) {
                if (tt.Stops.Where(stop => stop.Length.TotalMinutes > Properties.Settings.Default.MaximalAllowedStopLength).Count() > 0)
                    continue;

                filteredTravelTimes.Add(tt);
            }

            if (filteredTravelTimes.Count < Properties.Settings.Default.FreeflowMinimalCount)
                return null;

            Model result = new Model();
            result.Segment = segment;

            // Free-flow time
            result.FreeFlowTravelTime = EstimateFreeFlowTime(filteredTravelTimes);

            // traffic signals delay
            if (_map.Nodes[segment.NodeToID].Tags.ContainsTag("highway") && _map.Nodes[segment.NodeToID].Tags["highway"].Value == "traffic_signals") {
                result.TrafficSignalsDelay = EstimateTafficSignalsDelay(filteredTravelTimes, segment);
            }

            // traffic delay
            EstimateTrafficDelay(filteredTravelTimes, result);

            return result;
        }
예제 #3
0
        /// <summary>
        /// Estimates traffic delay from the collection of travel times
        /// </summary>
        /// <param name="travelTimes"></param>
        /// <param name="model"></param>
        void EstimateTrafficDelay(IEnumerable<TravelTime> travelTimes, Model model)
        {
            List<TravelTimeDelay> delays = new List<TravelTimeDelay>();
            foreach (var traveltime in travelTimes) {
                double delay = 0;
                if (model.TrafficSignalsDelay.Probability > 0 && traveltime.Stops.Count > 0)
                    delay = traveltime.TotalTravelTime.TotalSeconds - model.FreeFlowTravelTime - traveltime.Stops.Last().Length.TotalSeconds;
                else
                    delay = traveltime.TotalTravelTime.TotalSeconds - model.FreeFlowTravelTime;

                delay = Math.Max(0, delay);
                delays.Add(new TravelTimeDelay() { TravelTime = traveltime, Delay = delay });
            }

            // avg delay as median of delays
            delays.Sort(new Comparison<TravelTimeDelay>((TravelTimeDelay td1, TravelTimeDelay td2) => td1.Delay.CompareTo(td2.Delay)));
            model.AvgDelay = delays[delays.Count / 2].Delay;

            TrafficDelayMap delaysMap = new TrafficDelayMap(Properties.Settings.Default.ModelResolution, model.FreeFlowTravelTime);

            List<List<TravelTimeDelay>> travelTimeClusters = null;
            DBScan<TravelTimeDelay> clusterAnalyzer = new DBScan<TravelTimeDelay>(new DBScan<TravelTimeDelay>.FindNeighbours(FindNeighbours));
            for (int i = _parameters.Length -1; i >= 0; i--) {
                _parametersIndex = i;

                int desiredClusterSize = (int)Math.Max(Properties.Settings.Default.MinimalClusterSize, travelTimes.Count() * Properties.Settings.Default.ClusterSizePercentage / 100.0);
                int clusterSize = Math.Min(travelTimes.Count(), desiredClusterSize);
                travelTimeClusters = clusterAnalyzer.ClusterAnalysis(delays, clusterSize);

                foreach (var cluster in travelTimeClusters) {
                    TrafficDelayInfo delayInfo = new TrafficDelayInfo();
                    if (_parameters[_parametersIndex].Dates == DatesHandling.Any)
                        delayInfo.AppliesTo = DayOfWeek.Any;
                    else if (_parameters[_parametersIndex].Dates == DatesHandling.WeekendWorkdays)
                        delayInfo.AppliesTo = (DayOfWeek.Workday & DayOfWeekHelper.FromDate(cluster[0].TravelTime.TimeStart)) > 0 ? DayOfWeek.Workday : DayOfWeek.Weekend;
                    else
                        delayInfo.AppliesTo = DayOfWeekHelper.FromDate(cluster[0].TravelTime.TimeStart);

                    cluster.Sort(new Comparison<TravelTimeDelay>((TravelTimeDelay td1, TravelTimeDelay td2) => td1.Delay.CompareTo(td2.Delay)));

                    delayInfo.Delay = cluster.Sum(tt => tt.Delay) / cluster.Count;
                    delayInfo.From = cluster.Min(tt => tt.TravelTime.TimeStart.TimeOfDay).Subtract(new TimeSpan(0, _parameters[_parametersIndex].MembersTimeDifference / 2, 0));
                    if (delayInfo.From < new TimeSpan(0))
                        delayInfo.From = new TimeSpan(0);

                    delayInfo.To = cluster.Max(tt => tt.TravelTime.TimeEnd.TimeOfDay).Add(new TimeSpan(0, _parameters[_parametersIndex].MembersTimeDifference / 2, 0));
                    if (delayInfo.To > new TimeSpan(23, 59, 59)) {
                        delayInfo.To = new TimeSpan(23, 59, 59);
                    }
                    delaysMap.AddDelay(delayInfo.From, delayInfo.To, delayInfo.AppliesTo, delayInfo.Delay);
                }

                if (travelTimeClusters.Sum(cluster => cluster.Count) > Properties.Settings.Default.ClusterAnalysisStopPercentage * delays.Count / 100)
                    break;
            }

            model.TrafficDelay.AddRange(delaysMap.GetDelays());
        }
        private void ReadModel()
        {
            SegmentInfo segment = new SegmentInfo();

            string attFrom = _xmlReader.GetAttribute("node-from");
            if (attFrom == null)
                throw new XmlException("Attribute 'from' is missing.");
            segment.NodeFromID = int.Parse(attFrom);

            string attTo = _xmlReader.GetAttribute("node-to");
            if (attTo == null)
                throw new XmlException("Attribute 'to' is missing.");
            segment.NodeToID = int.Parse(attTo);

            string attWay = _xmlReader.GetAttribute("way");
            if (attFrom == null)
                throw new XmlException("Attribute 'way' is missing.");
            segment.WayID = int.Parse(attWay);

            Model model = new Model();
            model.Segment = segment;

            string attFreeFlow = _xmlReader.GetAttribute("freeflow");
            if(attFreeFlow == null)
                throw new XmlException("Attribute 'freeflow' is missing.");
            model.FreeFlowTravelTime = double.Parse(attFreeFlow, System.Globalization.CultureInfo.InvariantCulture);

            string attAvgDelay = _xmlReader.GetAttribute("avg-delay");
            if (attAvgDelay == null)
                throw new XmlException("Attribute 'avg-delay' is missing.");
            model.AvgDelay = double.Parse(attAvgDelay, System.Globalization.CultureInfo.InvariantCulture);

            string attSignalsDelay = _xmlReader.GetAttribute("signals-delay");
            string attSignalProbability = _xmlReader.GetAttribute("signals-prob");
            if (attSignalsDelay != null && attSignalProbability != null)
                model.TrafficSignalsDelay = new TrafficSignalsDelayInfo() {
                    Length = double.Parse(attSignalsDelay, System.Globalization.CultureInfo.InvariantCulture),
                    Probability = double.Parse(attSignalProbability, System.Globalization.CultureInfo.InvariantCulture)
                  };

            if (false == _xmlReader.IsEmptyElement) {
                _xmlReader.Read();

                while (_xmlReader.NodeType != XmlNodeType.EndElement) {
                    switch (_xmlReader.NodeType) {
                        case XmlNodeType.Element:
                            switch (_xmlReader.Name) {
                                case "traffic-delay":
                                    model.TrafficDelay.Add(ReadTrafficDelay());
                                    continue;
                                default:
                                    _xmlReader.Skip();
                                    continue;
                            }
                        default:
                            _xmlReader.Skip();
                            break;
                    }
                }
            }

            _storage.Add(segment, model);
            _xmlReader.Skip();
        }