Beispiel #1
0
 public GraphFlight(FlightModel flight, RouteModel route, DepartureDays departureDay, TimeSpan flightTime)
     : base(flight.FlightNumber, flight.DepartureTime, flight.ArrivalTime)
 {
     DispatchCity = route.DispatchCity;
     ArrivalCity  = route.ArrivalCity;
     DepartureDay = departureDay;
     FlightTime   = flightTime;
 }
        public (DepartureDays arrivalDay, TimeSpan arrivalTime) TakeArrivalDate(DepartureDays departureDay)
        {
            var time = DepartureTime + TakeTimeInAir();

            if (time.Days > 0)
            {
                departureDay = departureDay.Next();
                time        -= new TimeSpan(time.Days, 0, 0, 0);
            }

            return(departureDay, time);
        }
        public (FlightModel Flight, TimeSpan FlightTime) FindBestFlight(DepartureDays dayOfDeparture, TimeSpan timeOfDeparture)
        {
            var minTime           = TimeSpan.MaxValue;
            var flightWithMinTime = new FlightModel();


            foreach (var flight in Flights)
            {
                var timeUntilEndOfFlight = TimeUntilEndOfFlight(flight, dayOfDeparture, timeOfDeparture);
                if (timeUntilEndOfFlight < minTime)
                {
                    minTime           = timeUntilEndOfFlight;
                    flightWithMinTime = flight;
                }
            }
            return(flightWithMinTime, minTime);
        }
        private TimeSpan TimeUntilEndOfFlight(FlightModel flight, DepartureDays dayOfDeparture, TimeSpan timeOfDeparture)
        {
            int           daysUntilFlight  = default;
            DepartureDays nearestFlightDay = dayOfDeparture;

            if (timeOfDeparture >= flight.DepartureTime)
            {
                GoToNextDay(ref nearestFlightDay, ref daysUntilFlight);
            }

            while (!flight.DeparturesDays.Contains(nearestFlightDay))
            {
                GoToNextDay(ref nearestFlightDay, ref daysUntilFlight);
            }

            return(new TimeSpan(daysUntilFlight, 0, 0, 0) + (flight.DepartureTime - timeOfDeparture) + flight.TakeTimeInAir());
        }
Beispiel #5
0
        public void SearchRoute(string dispatchCity, string arrivalCity, DepartureDays departureDay, TimeSpan departureTime)
        {
            var node = graph.FindWaysDijkstra(dispatchCity, arrivalCity, departureDay, departureTime);

            Console.WriteLine($"Рассчёт пути из {dispatchCity} до {arrivalCity}!");
            Console.WriteLine($"Дань возможного вылета: {departureDay}, время возможного вылета: {departureTime}!");

            if (node == null)
            {
                Console.WriteLine();
                Console.WriteLine($"Невозможно проложить путь!!!");
                return;
            }

            if (node.TimeOfRoute != TimeSpan.Zero)
            {
                Console.WriteLine(
                    $"Общее время в пути: " +
                    $"Дней - {node.TimeOfRoute.Days}, " +
                    $"Часов - {node.TimeOfRoute.Hours}, " +
                    $"Минут - {node.TimeOfRoute.Minutes}, " +
                    $"Секунд - {node.TimeOfRoute.Seconds}");
            }
            else
            {
                Console.WriteLine("Время не определено");
            }

            Console.WriteLine();
            Console.WriteLine($"Построенный маршрут:");

            foreach (var element in node.RouteToTheNode)
            {
                Console.WriteLine(
                    $"Вылет из { element.DispatchCity} " +
                    $"Прибытие в { element.ArrivalCity} ");

                Console.WriteLine(
                    $"День вылета - { element.DepartureDay} " +
                    $"Время вылета - { element.DepartureTime} " +
                    $"Время прибытия - { element.ArrivalTime}");

                Console.WriteLine();
            }
        }
Beispiel #6
0
        private void BuildWaysFromNode(string dispatchCity, DepartureDays departureDay, TimeSpan departureTime)
        {
            var currentNode = Nodes.Find(node => node.Name == dispatchCity);

            currentNode.IsChecked = true;

            var flightsFromNode = Flights.FindAll(route => route.DispatchCity == dispatchCity);

            foreach (var route in flightsFromNode)
            {
                var bestFlight  = route.FindBestFlight(departureDay, departureTime);
                var arrivalNode = Nodes.Find(node => node.Name == route.ArrivalCity);

                if (arrivalNode.TimeOfRoute > currentNode.TimeOfRoute + bestFlight.FlightTime)
                {
                    /*Костыль с поиском дня следующего вылета*/
                    var timeUntilFlight  = bestFlight.FlightTime - bestFlight.Flight.TakeTimeInAir();
                    var timeOfDeparture  = departureTime + timeUntilFlight;
                    var nextDepartureDay = departureDay;

                    for (var i = 0; i < timeOfDeparture.Days; i++)
                    {
                        nextDepartureDay = nextDepartureDay.Next();
                    }
                    /*--------------------------------------------*/

                    arrivalNode.TimeOfRoute    = currentNode.TimeOfRoute + bestFlight.FlightTime;
                    arrivalNode.RouteToTheNode = new List <GraphFlight>(currentNode.RouteToTheNode);
                    arrivalNode.RouteToTheNode.Add(new GraphFlight(bestFlight.Flight, route, nextDepartureDay, bestFlight.FlightTime));
                }

                Flights.RemoveAll(flights => flights.DispatchCity == currentNode.Name && flights.ArrivalCity == route.ArrivalCity);
                Flights.RemoveAll(flights => flights.DispatchCity == route.ArrivalCity && flights.ArrivalCity == currentNode.Name);
            }

            var nextNode = TakeNodeWithMinTimeOfRoute();

            if (nextNode != null)
            {
                var previousNode  = nextNode.RouteToTheNode[nextNode.RouteToTheNode.Count - 1];
                var departureDate = previousNode.TakeArrivalDate((DepartureDays)previousNode.DepartureDay);
                BuildWaysFromNode(nextNode.Name, departureDate.arrivalDay, departureDate.arrivalTime);
            }
        }
Beispiel #7
0
        public GraphNode FindWaysDijkstra(string dispatchCity, string arrivalCity, DepartureDays departureDay, TimeSpan departureTime)
        {
            var firstNode = Nodes.Find(node => node.Name == dispatchCity);

            if (firstNode == null)
            {
                return(null);
            }

            firstNode.TimeOfRoute = TimeSpan.Zero;

            BuildWaysFromNode(dispatchCity, departureDay, departureTime);
            Nodes.ForEach(node =>
            {
                if (node.TimeOfRoute == TimeSpan.MaxValue)
                {
                    node.TimeOfRoute = TimeSpan.Zero;
                }
            });

            return(Nodes.Find(node => node.Name == arrivalCity));
        }
 private void GoToNextDay(ref DepartureDays nearestFlightDay, ref int daysUntilFlight)
 {
     nearestFlightDay = nearestFlightDay.Next();
     ++daysUntilFlight;
 }