Пример #1
0
        //eventHandler for DepartureEndStationEvent
        public override void handleEvent()
        {
            int      estimatedTravelTime = Simulation.getTravelTime(departureStation, tram.direction);
            TimeSpan etaNextStation      = TimeSpan.FromSeconds(eventTime.TotalSeconds + estimatedTravelTime);

            //set track A last departure time
            if (tram.direction == Direction.Uithof)
            {
                departureStation.lastDepartureTrackA = eventTime;
                //Check if not faster than last tram
                if (etaNextStation < departureStation.lastEtaTrackA)
                {
                    etaNextStation = TimeSpan.FromSeconds(departureStation.lastEtaTrackA.TotalSeconds + 1);
                }
                departureStation.lastEtaTrackA = etaNextStation;
            }
            //set Track B last departure time
            if (tram.direction == Direction.UtrechtCentraal)
            {
                departureStation.lastDepartureTrackB = eventTime;
                //Check if not faster than last tram
                if (etaNextStation < departureStation.lastEtaTrackB)
                {
                    etaNextStation = TimeSpan.FromSeconds(departureStation.lastEtaTrackB.TotalSeconds + 1);
                }
                departureStation.lastEtaTrackB = etaNextStation;
            }

            // Push new event to queue. checks if end or sub Station
            if (departureStation.getNextStation(tram.direction) is SubStation)
            {
                // subStation event
                // gen. eta event & enqueue to eventQueue.
                expectedArrivalSubtStation etaEvent = new expectedArrivalSubtStation(etaNextStation, (SubStation)departureStation.getNextStation(tram.direction), tram);
                Simulation.priorityQueue.Enqueue(etaEvent);
            }
            else if (departureStation.getNextStation(tram.direction) is EndStation)
            {
                // endStation event
                // gen. eta event & enqueue to eventQueue.
                expectedArrivalEndStation etaEvent = new expectedArrivalEndStation(etaNextStation, (EndStation)departureStation.getNextStation(tram.direction), tram);
                Simulation.priorityQueue.Enqueue(etaEvent);
            }
        }
Пример #2
0
        public expectedArrivalEndStation initTram(int i, int j, string[][] rates)
        {
            if (String.IsNullOrWhiteSpace(rates[i][j]))
            {
                return(initTram(i, (j + 1), rates));
            }
            else
            {
                Tram t = new Tram(i);

                //get all departures
                for (int k = j; k < rates[0].Length; k++)
                {
                    if (String.IsNullOrWhiteSpace(rates[i][k]))
                    {
                        //nothing..
                    }
                    else
                    {
                        string   str         = rates[i][k];
                        int      h           = int.Parse(str.Substring(0, 2));
                        int      m           = int.Parse(str.Substring(3, 2));
                        int      s           = int.Parse(str.Substring(6, 2));
                        TimeSpan tmpTimespan = (new TimeSpan(0, h, m, s, 0));
                        if (rates[0][k] == "Vertrektijd CS")
                        {
                            t.departures.Enqueue(new DepartureEndStation(tmpTimespan, d.centraal, t));
                        }
                        else if (rates[0][k] == "Vertrektijd P&R")
                        {
                            t.departures.Enqueue(new DepartureEndStation(tmpTimespan, d.uithof, t));
                        }
                    }
                }
                //return event
                TimeSpan desiredArrival     = TimeSpan.FromMinutes(t.departures.Peek().eventTime.TotalMinutes - 3);
                expectedArrivalEndStation a = new expectedArrivalEndStation(desiredArrival, t.departures.Peek().departureStation, t);
                return(a);
            }
        }
Пример #3
0
        public override void handleEvent()
        {
            TimeSpan arrivalTime;

            if (tram.departures.Count() != 0)
            {
                //remove from track if next departure is in more than 30 mins
                if (tram.departures.Peek().eventTime.TotalMinutes > eventTime.TotalMinutes + 30)
                {
                    expectedArrivalEndStation resumeWork = new expectedArrivalEndStation(TimeSpan.FromMinutes(tram.departures.Peek().eventTime.TotalMinutes - 3), arrivalStation, tram);
                    Simulation.priorityQueue.Enqueue(resumeWork);
                }
                else
                {
                    if (arrivalStation.numberOfTrams >= 2)
                    {
                        arrivalTime = TimeSpan.FromSeconds(arrivalStation.nextDeparture.TotalSeconds + SAFETY_MEASURE);
                    }
                    else
                    {
                        arrivalTime = TimeSpan.FromSeconds(Math.Max(arrivalStation.lastDeparture.TotalSeconds + SAFETY_MEASURE, eventTime.TotalSeconds));
                    }

                    //generate doorblock
                    if (Simulation.doorBlockEnabled)
                    {
                        int rand = Simulation.random.Next(0, 100);
                        if (100 - Simulation.probabilityX < rand)
                        {
                            arrivalTime = TimeSpan.FromSeconds(arrivalTime.TotalSeconds + 60);
                        }
                    }

                    arrivalEndStation arrival = new arrivalEndStation(arrivalTime, arrivalStation, tram);
                    Simulation.priorityQueue.Enqueue(arrival);
                }
            }
        }