public static void buildUnitRoute(SquareGrid grid, List <Order> GlobalOrders, Truck truck) { var orders = new List <Order>(); orders.AddRange(GlobalOrders); while (orders.Count() > 0) { if (Settings.TrafficScore == 0) { Truck.adjustTruckSpeed(truck.time); } if (truck.status.Equals(Status.Ready)) { var availableDrones = truck.drones.Where(drone => drone.status.Equals(Status.Available)).ToList(); var routeSheets = selectDronesOrders(availableDrones, orders); List <Location> truckRoute = new List <Location>(); truckRoute.Add(truck.currentPosition); foreach (var sheet in routeSheets) { sheet.drone.status = Status.Preparing; truckRoute.Add(sheet.meetingPoint); } if (routeSheets.Count() == 0) { truckRoute.Add(new Location(orders.First().x, orders.First().y, 0)); } for (int i = 0; i < truckRoute.Count() - 1; i++) { var awaitingDrones = truck.drones.Where(drone => drone.status.Equals(Status.Awaitng) && drone.currentPosition.Equals(truck.currentPosition)).ToList(); Vehicle.compareAndUpdateTime(awaitingDrones, truck); Drone.retrieveDrones(truck, awaitingDrones); Truck.doTruckDelivery(ViewModel.groundGrid, truck, truckRoute[i], truckRoute[i + 1]); //Truck.doTruckDelivery(grid, truck, truckRoute[i], truckRoute[i + 1]); var deliveredOrder = orders.Find(order => order.x == truckRoute[i + 1].x && order.y == truckRoute[i + 1].y); orders.Remove(deliveredOrder); foreach (var sheet in routeSheets) { Drone.loadDrones(truck, sheet.drone); Drone.doDroneDelivery(sheet, grid); deliveredOrder = orders.Find(order => order.x == sheet.deliveryPoint.x && order.y == sheet.deliveryPoint.y); orders.Remove(deliveredOrder); } routeSheets.Clear(); } Order.sortOrders(ref orders, truck.currentPosition); } } }
private string doTruck(Location depot, List <Order> truckOrders, Truck truck) { if (truckOrders is null) { return(string.Empty); } if (Settings.TrafficScore != 0) { Truck.adjustTruckSpeed(); } List <List <Location> > truckPaths = new List <List <Location> >(); List <Location> path; AStarSearch astar = new AStarSearch(groundGrid, depot, new Location(truckOrders.First().x, truckOrders.First().y, 0)); path = astar.ReconstructPath(depot, new Location(truckOrders.First().x, truckOrders.First().y, 0), astar.cameFrom); truckPaths.Add(path); truck.currentPosition = new Location(truckOrders.First().x, truckOrders.First().y, 0); var pathLength = path.Count * BaseConstants.PolygonSize; var deliveryTime = pathLength / BaseConstants.TruckSpeed + BaseConstants.DropDeliveryTime; truck.time += deliveryTime; truck.status = Status.OnMission; truck.log.Add(new Log(truck.id, truck.currentPosition, orders.Where(x => (x.x == truck.currentPosition.x && x.y == truck.currentPosition.y)).First().address, truck.time, truck.status, "Delivery finished")); for (int i = 0; i < truckOrders.Count - 1; i++) { if (Settings.TrafficScore != 0) { Truck.adjustTruckSpeed(truck.time); } var start = new Location(truckOrders[i].x, truckOrders[i].y, 0); var deliveryLocation = new Location(truckOrders[i + 1].x, truckOrders[i + 1].y, 0); astar = new AStarSearch(groundGrid, start, deliveryLocation); path = astar.ReconstructPath(start, deliveryLocation, astar.cameFrom); truckPaths.Add(path); pathLength = path.Count * BaseConstants.PolygonSize; deliveryTime = pathLength / BaseConstants.TruckSpeed + BaseConstants.DropDeliveryTime; truck.currentPosition = deliveryLocation; truck.time += deliveryTime; truck.status = Status.OnMission; truck.log.Add(new Log(truck.id, truck.currentPosition, orders.Where(x => (x.x == truck.currentPosition.x && x.y == truck.currentPosition.y)).First().address, truck.time, truck.status, "Delivery finished")); } //astar = new AStarSearch(groundGrid, new Location(truckOrders.Last().x, truckOrders.Last().y, 0), Depot); //path = astar.ReconstructPath(new Location(truckOrders.Last().x, truckOrders.Last().y, 0), Depot, astar.cameFrom); //truckPaths.Add(path); return(Truck.truckStatusUpdate(truckPaths, TruckTime)); }
/// <summary> /// Performs delivery depending on wether deliveries are scheduled or not, based on settings value /// </summary> /// <param name="truck"></param> private void performDelivery(Truck truck) { if (Settings.TrafficScore != 0) { Truck.adjustTruckSpeed(); } if (!Settings.DeliveryInterval) { Order.sortOrders(ref orders, Depot); var ordersString = string.Empty; foreach (var o in orders) { ordersString += $"{o.address}\t--\t{o.x}.{o.y}\n"; } FSTSPRouting.buildUnitRoute(grid, orders, truck); } else { var timeClusteredOrders = new List <List <Order> >(); var intervals = new DeliveryIntervals(); foreach (var interval in intervals.Intervals) { var ordersInInterval = orders.Where(x => x.dueTime.Equals(interval.Key)).ToList(); timeClusteredOrders.Add(ordersInInterval); } for (int i = 0; i < timeClusteredOrders.Count(); i++) { if (truck.time < intervals.Intervals.ToArray()[i].Value.start) { truck.status = Status.Idle; truck.log.Add(new Log(truck.id, truck.currentPosition, orders.Where(x => (x.x == truck.currentPosition.x && x.y == truck.currentPosition.y)).First().address, truck.time, truck.status, "success")); truck.time = intervals.Intervals.ToArray()[i].Value.start; truck.status = Status.Ready; foreach (var drone in truck.drones) { drone.status = Status.Idle; drone.log.Add(new Log(drone.id, drone.currentPosition, orders.Where(x => (x.x == truck.currentPosition.x && x.y == truck.currentPosition.y)).First().address, drone.time, drone.status, "success")); drone.time = intervals.Intervals.ToArray()[i].Value.start; drone.status = Status.Available; } } var timedOrders = timeClusteredOrders.ElementAt(i); Order.sortOrders(ref timedOrders, truck.currentPosition); FSTSPRouting.buildUnitRoute(grid, timedOrders, truck); } } }