/// <summary> /// Get the nearest open order available for pickup from the current location /// </summary> /// <param name="vehicle"></param> /// <returns></returns> public Tuple <Order, Vertex <VertexInfo, EdgeInfo> > GetNearestOpenOrder(VehicleInstance vehicle) { var nearestBaseStation = GetNearestBaseStationWithOpenOrder(vehicle); var order = OpenOrders.FirstOrDefault(o => o.Start == nearestBaseStation); return(Tuple.Create(order, nearestBaseStation)); }
/// <summary> /// Get the nearest base station to the current position that has open orders available /// </summary> /// <param name="vehicle">The vehicle</param> /// <returns></returns> public Vertex <VertexInfo, EdgeInfo> GetNearestBaseStationWithOpenOrder(VehicleInstance vehicle) { var nearestBaseStation = Parameters.Graph .Where(x => x.Info.Type == VertexType.Base || x.Info.Type == VertexType.Both) .Where(x => OpenOrders.Any(y => y.Start.Info == x.Info && Parameters.Graph.FindShortestPath(Parameters.Graph, y.Start, y.Target, vehicle.TravelMode).Item2 <= vehicle.GetMaximumTravelDistance(y.PayloadWeight, vehicle.CurrentFuelLoaded))) .Select(x => Tuple.Create(Parameters.Graph.FindShortestPath(Parameters.Graph, vehicle.CurrentVertexPosition, x, vehicle.TravelMode).Item2, x)) .OrderBy(x => x.Item1) .FirstOrDefault(); return(nearestBaseStation?.Item2); }