Exemple #1
0
        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);
                }
            }
        }
Exemple #2
0
        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));
        }
Exemple #3
0
        /// <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);
                }
            }
        }