Ejemplo n.º 1
0
def get_itinerary(addresses):

    #return nothing if no input
    if len(addresses) == 1 and addresses[0] == "":
        return []

    # if fails vertices is -1 and D is the address for which there is a format error
    D, vertices = construct_matrix(addresses)

    if vertices == -1:
        return ["Format Error: " + str(D)]

    path = solve_tsp(D, optim_steps=10)

    ordered_addresses = []
    for entry in path:
        ordered_addresses.append(vertices[entry].geoloc.address)

    return ordered_addresses
Ejemplo n.º 2
0
def main(cities, origin_address, origin_coordinates, search_limit=1):
    SEARCH_LIMIT = 1
    if search_limit != 1:
        SEARCH_LIMIT = search_limit
    # coordinates of locations
    locations = []
    # User-friendly Addresses
    prettyLocations = []

    locations.append(origin_coordinates)
    prettyLocations.append(['Origin',origin_address])

    counter = 0
    # Get list of top restaurants in each city
    for city in cities:
       try:
           response = yelp.query_api('bars', city, SEARCH_LIMIT)
           for item in response:
               locations.append(str(item.get('location').get('coordinate').get('latitude')) + ',' +
                                str(item.get('location').get('coordinate').get('longitude')))
               # Save restaurant name and address
               prettyName = ""
               if len(item.get('location').get('display_address')) > 0:
                   prettyName += item.get('location').get('display_address')[0]
               if len(item.get('location').get('display_address')) > 1:
                   prettyName += ", "+item.get('location').get('display_address')[1]
               if len(item.get('location').get('display_address')) > 2:
                   prettyName += ", "+item.get('location').get('display_address')[2]
               prettyLocations.append([item.get('name'),prettyName])
       except urllib2.HTTPError as error:
           sys.exit('Encountered HTTP error {0}. Abort program.'.format(error.code))

    # ------
    # STEP 2 - Get distances between each restaurant
    # ------
    # Generate list of locations to visit in order
    url = 'https://maps.googleapis.com/maps/api/directions/json'

    # Create 2D array to keep track of pairs of locations - USE NUMPY LATER
    pairs = [[0]*len(locations) for x in xrange(len(locations))]
    distances_matrix = [[0]*len(locations) for x in xrange(len(locations))]

    # Numbers to indicate progress
    lookupNum = 0
    for i in range(len(locations) - 1):
        lookupNum += (i+1)
    counter = 0

    for i in range(0, len(locations)):
       for j in range(0, len(locations)):
           # Skip over duplicate pairs of locations to reduce requests
           if pairs[i][j] != 1 and i != j:
               # Set parameters
               params = dict(
                   origin = locations[i],
                   destination = locations[j],
                   key = get_server_key()
               )

               # Set to 1 to skip later
               pairs[i][j] = 1
               pairs[j][i] = 1

               # Send request to Google Maps
               time.sleep(0.1)
               resp = requests.get(url=url, params=params)
               data = json.loads(resp.text)
               if (data.get('status') == 'ZERO_RESULTS'):
                   return {"status": 500,
                           "message": "Directions not found from " + prettyLocations[i][1]
                                         + " to " + prettyLocations[j][1]}
               else:
                   # Storing distances in matrix for tsp_solver
                   distances_matrix[i][j] = data.get('routes')[0].get('legs')[0].get('distance').get('value')
                   distances_matrix[j][i] = data.get('routes')[0].get('legs')[0].get('distance').get('value')
                   counter += 1
                   sys.stdout.write("\rGetting Distances...%d%%" % int((float(counter)/lookupNum) * 100))
                   sys.stdout.flush()

    # ------
    # STEP 3 - Algorithm to find shortest path
    # ------
    # Returns route cycle

    cities_index = tsp_solver.solve_tsp(distances_matrix, 3)

    # Start and end cycle at start location
    route_distance = 0
    previous = 0
    for index, city in enumerate(cities_index):
        route_distance += distances_matrix[previous][city]
        previous = city
    route_distance += distances_matrix[cities_index[-1]][0]

    print('\nDone!')
    route_dict = {"origin_coordinates":{"lat": float(origin_coordinates.split(",")[0]),
                                        "lng": float(origin_coordinates.split(",")[1])},
                  "route_coordinates":[],
                  "route_names":[],
                  "route_addresses":[],
                  "status": 200}
    for item in cities_index:
        coordinates = locations[item].split(",")
        coordict = {"lat": float(coordinates[0]),
                    "lng": float(coordinates[1])}
        route_dict["route_coordinates"].append(coordict)
        route_dict["route_names"].append(prettyLocations[item][0])
        route_dict["route_addresses"].append(prettyLocations[item][1])

    return route_dict
Ejemplo n.º 3
0
           # Storing distances in matrix for tsp_solver
           distances_matrix[i][j] = data.get('routes')[0].get('legs')[0].get('distance').get('value')
           distances_matrix[j][i] = data.get('routes')[0].get('legs')[0].get('distance').get('value')
           counter += 1
           sys.stdout.write("\rGetting Distances...%d%%" % int((float(counter)/lookupNum) * 100))
           sys.stdout.flush()

print('\n' + ('-' * 50))

# ------
# STEP 3 - Algorithm to find shortest path
# ------
print('Calculating shortest route...')
# Returns route cycle
cities_index = tsp_solver.solve_tsp(distances_matrix, 3)

# Start and end cycle at start location
print('\nRoute:')
route_distance = 0
previous = 0
for index, city in enumerate(cities_index):
    route_distance += distances_matrix[previous][city]
    print("%d miles driven - %s\n%s\n" % (int(route_distance*0.00062137), prettyLocations[city][0], prettyLocations[city][1]))
    previous = city
route_distance += distances_matrix[cities_index[-1]][0]
print("%d miles driven - %s\n%s\n" % (int(route_distance*0.00062137), prettyLocations[0][0], prettyLocations[0][1]))
print("Total Distance Traveled: %d miles" % int(route_distance*0.00062137))

print('\nDone!')