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.");
}