Ejemplo n.º 1
0
        public async Task <IActionResult> GetForAll()
        {
            // get stores
            var stores = this.storeFinder.GetStoresToServe().ToList();
            var fleets = this.droneService.GetDroneFleets().ToList();

            var clientAddresses = await this.locationFinder.GetAllClientLocationAsync();

            var result = new List <RouteSettings>();

            if (!stores.AnySafe() || !fleets.AnySafe() || !clientAddresses.AnySafe())
            {
                return(null);
            }

            var calc = new DistanceCalculator();

            var fleetStoreDistanceArr = new List <List <double> >();
            var line = new LinkedList <double>();

            foreach (var fleet in fleets)
            {
                line.Clear();
                foreach (var store in stores)
                {
                    line.AddLast(calc.Calculate(fleet.Coordinates, store.Coordinates));
                }

                fleetStoreDistanceArr.Add(line.ToList());
            }

            var ways     = new List <BestWay>();
            var distance = new List <double>();
            var bestWay  = new BestWay();

            foreach (var client in clientAddresses)
            {
                distance.Clear();
                foreach (var store in stores)
                {
                    distance.Add(calc.Calculate(client.Coordinates, store.Coordinates));
                }

                bestWay = new BestWay
                {
                    Distance   = double.MaxValue,
                    FleetIndex = 0,
                    StoreIndex = 0,
                    Client     = client
                };

                var availableDrones = await this.droneService.GetAvailableDronesAsync();

                for (var i = 0; i < fleetStoreDistanceArr.Count; i++)
                {
                    // for loop bellow fleetStoreDistanceArr line length will be the same for all lines,
                    // so we don't need to calculate it for every line
                    for (var j = 0; j < fleetStoreDistanceArr[0].Count; j++)
                    {
                        if (availableDrones.Any(
                                x => x.AddressLine.Equals(
                                    fleets[i].AddressLine,
                                    StringComparison.InvariantCultureIgnoreCase)))
                        {
                            if (fleetStoreDistanceArr[i][j] + distance[j] < bestWay.Distance)
                            {
                                bestWay.Distance   = fleetStoreDistanceArr[i][j] + distance[j];
                                bestWay.FleetIndex = i;
                                bestWay.StoreIndex = j;
                            }
                        }
                    }
                }

                ways.Add(bestWay);
            }

            foreach (var way in ways)
            {
                result.Add(
                    BuildRouteHelper.BuildRouteSettings(
                        calc,
                        new RouteDistance
                {
                    LocationFrom        = fleets[way.FleetIndex].AddressLine,
                    LocationFromAddress = fleets[way.FleetIndex],
                    LocationTo          = stores[way.StoreIndex].AddressLine,
                    LocationToAddress   = stores[way.StoreIndex]
                },
                        new RouteDistance
                {
                    LocationFrom        = stores[way.StoreIndex].AddressLine,
                    LocationFromAddress = stores[way.StoreIndex],
                    LocationTo          = way.Client.AddressLine,
                    LocationToAddress   = way.Client
                },
                        way.Distance));
            }

            return(this.Ok(result));
        }
Ejemplo n.º 2
0
        public async Task <IActionResult> GetForAll()
        {
            var resultTask = Task <List <RouteSettings> > .Factory.StartNew(() =>
            {
                // get stores
                var stores          = this.storeFinder.GetStoresToServe().ToList();
                var fleets          = this.droneService.GetDroneFleets().ToList();
                var clientAddresses = clientLocations.Value;

                var result = new List <RouteSettings>();

                if (!stores.AnySafe() || !fleets.AnySafe() || !clientAddresses.AnySafe())
                {
                    return(result);
                }

                var calc = new DistanceCalculator();

                var fleetStoreDistance = new List <RouteDistance>();
                foreach (var fleet in fleets)
                {
                    foreach (var store in stores)
                    {
                        fleetStoreDistance.Add(new RouteDistance
                        {
                            LocationFrom        = fleet.AddressLine,
                            LocationFromAddress = fleet,
                            LocationTo          = store.AddressLine,
                            LocationToAddress   = store,
                            Distance            = calc.Calculate(fleet.Coordinates, store.Coordinates)
                        });
                    }
                }

                // get distance from client to store
                var storeToClientDistances = new LinkedList <RouteDistance>();
                foreach (var client in clientAddresses)
                {
                    foreach (var store in stores)
                    {
                        storeToClientDistances.AddLast(
                            new RouteDistance
                        {
                            LocationFrom        = store.AddressLine,
                            LocationFromAddress =
                                new Address {
                                AddressLine = store.AddressLine, Coordinates = store.Coordinates
                            },
                            LocationTo        = client.AddressLine,
                            LocationToAddress =
                                new Address {
                                AddressLine = client.AddressLine, Coordinates = client.Coordinates
                            },
                            Distance = calc.Calculate(client.Coordinates, store.Coordinates)
                        });
                    }

                    var availableDrones = this.droneService.GetAvailableDrones();
                    var nearestStore    = storeToClientDistances.OrderBy(x => x.Distance).FirstOrDefault();

                    var nearestFleet = fleetStoreDistance
                                       .Where(x => x.LocationTo.Equals(nearestStore.LocationFrom, StringComparison.InvariantCultureIgnoreCase))
                                       .OrderBy(x => x.Distance)
                                       .FirstOrDefault();

                    var availableDroneNearby = availableDrones.FirstOrDefault(x => x.AddressLine.Equals(
                                                                                  nearestFleet.LocationFrom,
                                                                                  StringComparison.InvariantCultureIgnoreCase));

                    if (availableDroneNearby == null)
                    {
                        var availableDronesDistance = fleetStoreDistance
                                                      .Where(x => !x.LocationFrom.Equals(nearestFleet.LocationFrom, StringComparison.InvariantCultureIgnoreCase))
                                                      .ToList();

                        nearestFleet = availableDronesDistance
                                       .OrderBy(x => x.Distance)
                                       .FirstOrDefault();
                    }

                    result.Add(BuildRouteHelper.BuildRouteSettings(calc, nearestFleet, nearestStore));

                    storeToClientDistances.Clear();
                }

                return(result);
            });

            return(this.Ok(await resultTask));
        }
Ejemplo n.º 3
0
        public async Task <IActionResult> Get(string address)
        {
            // get stores
            var stores        = this.storeFinder.GetStoresToServe().ToList();
            var fleets        = this.droneService.GetAvailableDrones().ToList();
            var clientAddress = await this.locationFinder.GetAddressCoordinatesAsync(address);

            if (!stores.AnySafe() || !fleets.AnySafe() || clientAddress == null)
            {
                return(null);
            }

            var calc = new DistanceCalculator();

            var fleetStoreDistanceArr = new List <List <double> >();
            var line = new LinkedList <double>();

            foreach (var fleet in fleets)
            {
                line.Clear();
                foreach (var store in stores)
                {
                    line.AddLast(calc.Calculate(fleet.Coordinates, store.Coordinates));
                }

                fleetStoreDistanceArr.Add(line.ToList());
            }

            var distance = new List <double>();

            foreach (var store in stores)
            {
                distance.Add(calc.Calculate(clientAddress.Coordinates, store.Coordinates));
            }

            var bestWay = new BestWay
            {
                Distance   = double.MaxValue,
                FleetIndex = 0,
                StoreIndex = 0,
                Client     = clientAddress
            };

            for (var i = 0; i < fleetStoreDistanceArr.Count; i++)
            {
                // for loop bellow fleetStoreDistanceArr line length will be the same for all lines,
                // so we don't need to calculate it for every line
                for (var j = 0; j < fleetStoreDistanceArr[0].Count; j++)
                {
                    if (fleetStoreDistanceArr[i][j] + distance[j] < bestWay.Distance)
                    {
                        bestWay.Distance   = fleetStoreDistanceArr[i][j] + distance[j];
                        bestWay.FleetIndex = i;
                        bestWay.StoreIndex = j;
                    }
                }
            }

            return(this.Ok(BuildRouteHelper.BuildRouteSettings(
                               calc,
                               new RouteDistance
            {
                LocationFrom = fleets[bestWay.FleetIndex].AddressLine,
                LocationFromAddress = fleets[bestWay.FleetIndex],
                LocationTo = stores[bestWay.StoreIndex].AddressLine,
                LocationToAddress = stores[bestWay.StoreIndex]
            },
                               new RouteDistance
            {
                LocationFrom = stores[bestWay.StoreIndex].AddressLine,
                LocationFromAddress = stores[bestWay.StoreIndex],
                LocationTo = bestWay.Client.AddressLine,
                LocationToAddress = bestWay.Client
            },
                               bestWay.Distance)));
        }
Ejemplo n.º 4
0
        public async Task <IActionResult> Get(string address)
        {
            var resultTask = Task <RouteSettings> .Factory.StartNew(
                () =>
            {
                // get stores
                var stores = this.storeFinder.GetStoresToServe().ToList();
                var drones = this.droneService.GetAvailableDrones().ToList();

                var clientAddress = this.locationFinder.GetAddressCoordinates(address);

                if (!stores.AnySafe() || !drones.AnySafe() || clientAddress == null)
                {
                    return(null);
                }

                var calc = new DistanceCalculator();

                var storeClientDistance = new List <RouteDistance>();
                foreach (var store in stores)
                {
                    storeClientDistance.Add(new RouteDistance
                    {
                        LocationFrom        = store.AddressLine,
                        LocationFromAddress = store,
                        LocationTo          = clientAddress.AddressLine,
                        LocationToAddress   = clientAddress,
                        Distance            = calc.Calculate(store.Coordinates, clientAddress.Coordinates)
                    });
                }

                var nearestStore = storeClientDistance.OrderBy(x => x.Distance).FirstOrDefault();

                var droneStoreDistance = new List <RouteDistance>();
                foreach (var fleet in drones)
                {
                    foreach (var store in stores)
                    {
                        if (store.AddressLine.Equals(nearestStore.LocationFrom, StringComparison.InvariantCultureIgnoreCase))
                        {
                            droneStoreDistance.Add(
                                new RouteDistance
                            {
                                LocationFrom        = fleet.AddressLine,
                                LocationFromAddress = fleet,
                                LocationTo          = store.AddressLine,
                                LocationToAddress   = store,
                                Distance            = calc.Calculate(fleet.Coordinates, store.Coordinates)
                            });
                            break;
                        }
                    }
                }

                var nearestFleet = droneStoreDistance
                                   .Where(x => x.LocationTo.Equals(nearestStore.LocationFrom, StringComparison.CurrentCultureIgnoreCase))
                                   .OrderBy(x => x.Distance)
                                   .FirstOrDefault();

                return(BuildRouteHelper.BuildRouteSettings(calc, nearestFleet, nearestStore));
            });

            return(this.Ok(await resultTask));
        }