使用 Dijkstra 算法 和 旅行商问题(TSP) 规划快递员配送路线(python)
- 使用 Dijkstra 算法 计算各个配送点之间的最短路径。
- 结合 TSP 寻找配送点之间的最短配送路线。
假设我们的配送员需要从某个起点出发,按最短路径依次到达每个配送点,最后返回起点。
步骤
- Dijkstra 算法 用于计算单源最短路径。
- TSP 算法 用于计算一组站点(配送点)之间的最短路径。
安装依赖
pip install requests
pip install numpy
import requests
import numpy as np
import itertools# 高德 API Key
API_KEY = '你的高德API Key'# 配送站点的经纬度(示例,包含起点和配送点)
locations = {'仓库': '39.990912,116.481913', # 起点(仓库)'客户A': '39.992912,116.485913','客户B': '39.993912,116.489913','客户C': '39.991912,116.487913',
}# 获取两点之间的距离(单位:米)
def get_distance(origin, destination):url = f'https://restapi.amap.com/v3/direction/driving'params = {'key': API_KEY,'origin': origin,'destination': destination,'strategy': 0, # 最快捷路径'extensions': 'base' # 获取基础信息}response = requests.get(url, params=params)if response.status_code == 200:result = response.json()if result['status'] == '1':distance = result['route']['paths'][0]['distance'] # 距离(米)return distancereturn float('inf') # 如果没有路径,返回无穷大# 使用 Dijkstra 算法计算城市之间的最短路径
def dijkstra(locations):location_names = list(locations.keys())n = len(location_names)# 创建城市之间的距离矩阵distance_matrix = np.zeros((n, n))for i in range(n):for j in range(i + 1, n):distance = get_distance(locations[location_names[i]], locations[location_names[j]])distance_matrix[i][j] = distancedistance_matrix[j][i] = distancereturn distance_matrix, location_names# 计算旅行商问题(TSP)的最短路径
def tsp(distance_matrix):n = len(distance_matrix)all_permutations = itertools.permutations(range(1, n)) # 路径排列,不包括起点min_path = Nonemin_distance = float('inf')for perm in all_permutations:# 计算路径长度current_distance = 0current_path = [0] + list(perm) + [0] # 起点到终点for i in range(n):current_distance += distance_matrix[current_path[i]][current_path[i + 1]]if current_distance < min_distance:min_distance = current_distancemin_path = current_pathreturn min_path, min_distancedef main():# 获取配送点之间的最短路径矩阵distance_matrix, location_names = dijkstra(locations)# 解决配送员的旅行商问题path, distance = tsp(distance_matrix)# 输出结果print("最短配送路线: ", " -> ".join([location_names[i] for i in path]))print("最短路径总距离: ", distance, "米")if __name__ == '__main__':main()
代码解析
- locations: 存储了配送起点和各个客户的经纬度信息,格式为
{'地点名称': '经度,纬度'}
。你可以根据实际需要更改这些坐标。 - get_distance: 通过调用高德的 API 获取两个地点之间的行车距离。
- dijkstra: 使用 Dijkstra 算法构建一个城市之间的最短路径矩阵。此函数会计算所有配送点之间的距离。
- tsp: 用于解决旅行商问题,找出一条最短路径,包含起点(仓库),按最短距离依次访问所有客户,最后回到起点。
- main: 主函数,调用
dijkstra
和tsp
,并输出最短配送路径。
输出示例
最短配送路线: 仓库 -> 客户A -> 客户B -> 客户C -> 仓库 最短路径总距离: 25000 米
注意事项
- API 限制:高德地图 API 每日调用次数有限制,免费账户有一定次数限制,务必注意。
- 性能优化:TSP 问题是 NP-hard 问题,时间复杂度为 O(n!),对于城市数量较多时,计算量会非常大。如果城市数量很多,建议使用启发式算法(如模拟退火、遗传算法等)来近似求解。
- 路径计算:Dijkstra 算法在本例中用于计算单源最短路径。如果配送点之间距离较远,可能需要处理更复杂的算法来优化计算。
扩展思路
- 动态调整:可以在实际配送过程中,动态调整路径规划,根据交通状况或订单变化实时计算路径。
- 多个配送员:如果有多个配送员,可以通过调整算法,计算最优的配送员路线分配。