public async Task Solve()

in Source/Extensions/TSP Resources/BaseTspAlgorithm.cs [69:140]


        public async Task<TspResult> Solve(List<SimpleWaypoint> waypoints, TravelModeType? travelMode, TspOptimizationType? tspOptimization, DateTime? departureTime, string bingMapsKey)
        {
            if(waypoints == null && waypoints.Count > 0)
            {
                //Ensure that unique waypoints are in the list. This will reduce the number of cells generated in the distance matrix, thus lower cost.
                waypoints = waypoints.Distinct().ToList();
            }

            if (tspOptimization == null || !tspOptimization.HasValue)
            {
                tspOptimization = TspOptimizationType.TravelTime;
            }

            DistanceMatrix dm = null;

            if (tspOptimization.Value == TspOptimizationType.StraightLineDistance)
            {
                //Calculate a distance matrix based on straight line distances (haversine). 

                dm = await DistanceMatrix.CreateStraightLineNxNMatrix(waypoints, DistanceUnitType.Kilometers, bingMapsKey).ConfigureAwait(false);
            }
            else 
            {
                if (travelMode == null || !travelMode.HasValue)
                {
                    //Default to driving if not specified.
                    travelMode = TravelModeType.Driving;
                }

                var distanceMatrixRequest = new DistanceMatrixRequest()
                {
                    TravelMode = travelMode.Value,
                    BingMapsKey = bingMapsKey
                };                

                if (departureTime.HasValue &&
                    (distanceMatrixRequest.TravelMode == TravelModeType.Driving && waypoints.Count <= 10 || 
                    distanceMatrixRequest.TravelMode == TravelModeType.Truck))
                {
                    distanceMatrixRequest.StartTime = departureTime.Value;
                }

                distanceMatrixRequest.Origins = waypoints;

                var r = await distanceMatrixRequest.Execute().ConfigureAwait(false);

                if (r != null)
                {
                    if (r.ErrorDetails != null && r.ErrorDetails.Length > 0)
                    {
                        throw new Exception(String.Join("", r.ErrorDetails));
                    }

                    if (r.ResourceSets != null && r.ResourceSets.Length > 0 && r.ResourceSets[0] != null &&
                        r.ResourceSets[0].Resources != null && r.ResourceSets.Length > 0 && r.ResourceSets[0].Resources[0] != null &&
                        r.ResourceSets[0].Resources[0] is DistanceMatrix)
                    {
                        dm = r.ResourceSets[0].Resources[0] as DistanceMatrix;
                    }
                }
            }

            if(dm != null)
            {
                var solution = await Solve(dm, tspOptimization.Value).ConfigureAwait(false);
                solution.TspOptimization = tspOptimization.Value;
                solution.TravelMode = travelMode.Value;
                return solution;
            }

            throw new Exception("Unable to calculate distance matrix.");
        }