Exemplo n.º 1
0
        static private void GetStartData()
        {
            try
            {
                /* Считать данные с консоли*/
                Console.WriteLine("Введите название города отправления");
                dispatchCity = Console.ReadLine();

                Console.WriteLine("Введите название города прибытия");
                arrivalCity = Console.ReadLine();

                Console.WriteLine("Введите день отправления цифрой");
                departureDay = default;
                bool parseStatus = Enum.TryParse(Console.ReadLine(), out departureDay);

                Console.WriteLine("Введите время отправления");
                departureTime = TimeSpan.Parse(Console.ReadLine());
            }
            catch (Exception e)
            {
                Console.WriteLine($"Допущена ошибка: {e.Message}");
                Console.WriteLine("Введите данные повторно");
                GetStartData();
            }
        }
Exemplo n.º 2
0
 private static void GoToNextDay(ref DepartureDay nearestFlightDay, ref int daysUntilFlight)
 {
     /*
      * Добавить день недели и увеличить количество дней в пути на 1
      */
     nearestFlightDay = Next(nearestFlightDay);
     ++daysUntilFlight;
 }
Exemplo n.º 3
0
        static private void BuildWaysFromNode(string dispatchCity, DepartureDay departureDay, TimeSpan departureTime)
        {
            /*
             * Получить город в который попали
             * Пометить как посещённый
             * Получить все связанные города
             *  Для каждого найти лучший рейс
             *  Для каждого города проверить лучше ли новый путь чем прошлые
             *  Если лучше, то:
             *      Записать Новое лучшее время пути для данного города
             *      Записать путь по которому это время достигается
             *  После проверки каждого города удалить маршруты соеденяюющие города из графа (Для облегчения графа)
             * Запустить рекурсию для непосещённых городов
             */
            var currentNode = Graph.Nodes.Find(node => node.Name == dispatchCity);

            currentNode.IsChecked = true;

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

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

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

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

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

                Graph.Flights.RemoveAll(flights => flights.DispatchCity == currentNode.Name && flights.ArrivalCity == route.ArrivalCity);
                Graph.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 = TakeArrivalDate(previousNode, (DepartureDay)previousNode.DepartureDay);
                BuildWaysFromNode(nextNode.Name, departureDate.arrivalDay, departureDate.arrivalTime);
            }
        }
Exemplo n.º 4
0
 public GraphFlight(FlightModel flight, RouteModel route, DepartureDay departureDay, TimeSpan flightTime)
 {
     DispatchCity  = route.DispatchCity;
     ArrivalCity   = route.ArrivalCity;
     DepartureDay  = departureDay;
     FlightTime    = flightTime;
     FlightNumber  = flight.FlightNumber;
     DepartureTime = flight.DepartureTime;
     ArrivalTime   = flight.ArrivalTime;
 }
Exemplo n.º 5
0
        public static (DepartureDay arrivalDay, TimeSpan arrivalTime) TakeArrivalDate(GraphFlight flight, DepartureDay departureDay)
        {
            /*
             * На основании дня вылета и рейса определить день прибытия
             */
            var time = flight.DepartureTime + TakeTimeInAir(flight.DepartureTime, flight.ArrivalTime);

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

            return(departureDay, time);
        }
Exemplo n.º 6
0
        private static TimeSpan TimeUntilEndOfFlight(FlightModel flight, DepartureDay dayOfDeparture, TimeSpan timeOfDeparture)
        {
            /*
             * Найти ближайший день вылета
             * Посчить время оставшие до вылета
             * Посчитать время в полёте
             * Вернуть общее время до прибытия в пункт назначения
             */
            int          daysUntilFlight  = default;
            DepartureDay 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) + TakeTimeInAir(flight.DepartureTime, flight.ArrivalTime));
        }
Exemplo n.º 7
0
 public static void PrintStartInfo(string dispatchCity, string arrivalCity, DepartureDay departureDay, TimeSpan departureTime)
 {
     /* Вывести стартовые данные введёные пользователем*/
     Console.WriteLine($"Рассчёт пути из {dispatchCity} до {arrivalCity}!");
     Console.WriteLine($"Дань возможного вылета: {departureDay}, время возможного вылета: {departureTime}!");
 }
Exemplo n.º 8
0
        public static (FlightModel Flight, TimeSpan FlightTime) FindBestFlight(List <FlightModel> flights, DepartureDay 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);
        }
Exemplo n.º 9
0
        static private GraphNode FindWaysDijkstra(string dispatchCity, string arrivalCity, DepartureDay departureDay, TimeSpan departureTime)
        {
            /*
             * Найти город отправления
             * Установить время полёта в ноль
             * Проложить кротчайшие пути до всех связанных городов
             * Получить путь до города назначения
             */
            var firstNode = Graph.Nodes.Find(node => node.Name == dispatchCity);

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

            firstNode.TimeOfRoute = TimeSpan.Zero;

            BuildWaysFromNode(dispatchCity, departureDay, departureTime);

            return(Graph.Nodes.Find(node => node.Name == arrivalCity));
        }