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()); }
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(); } }
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); } }
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; }