当前位置: 首页 > news >正文

使用 Dijkstra 算法 和 旅行商问题(TSP) 规划快递员配送路线(python)

  1. 使用 Dijkstra 算法 计算各个配送点之间的最短路径。
  2. 结合 TSP 寻找配送点之间的最短配送路线。

假设我们的配送员需要从某个起点出发,按最短路径依次到达每个配送点,最后返回起点。

步骤

  1. Dijkstra 算法 用于计算单源最短路径。
  2. 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()

代码解析

  1. locations: 存储了配送起点和各个客户的经纬度信息,格式为 {'地点名称': '经度,纬度'}。你可以根据实际需要更改这些坐标。
  2. get_distance: 通过调用高德的 API 获取两个地点之间的行车距离。
  3. dijkstra: 使用 Dijkstra 算法构建一个城市之间的最短路径矩阵。此函数会计算所有配送点之间的距离。
  4. tsp: 用于解决旅行商问题,找出一条最短路径,包含起点(仓库),按最短距离依次访问所有客户,最后回到起点。
  5. main: 主函数,调用 dijkstra 和 tsp,并输出最短配送路径。

输出示例

最短配送路线: 仓库 -> 客户A -> 客户B -> 客户C -> 仓库 最短路径总距离: 25000 米

注意事项

  1. API 限制:高德地图 API 每日调用次数有限制,免费账户有一定次数限制,务必注意。
  2. 性能优化:TSP 问题是 NP-hard 问题,时间复杂度为 O(n!),对于城市数量较多时,计算量会非常大。如果城市数量很多,建议使用启发式算法(如模拟退火、遗传算法等)来近似求解。
  3. 路径计算:Dijkstra 算法在本例中用于计算单源最短路径。如果配送点之间距离较远,可能需要处理更复杂的算法来优化计算。

扩展思路

  1. 动态调整:可以在实际配送过程中,动态调整路径规划,根据交通状况或订单变化实时计算路径。
  2. 多个配送员:如果有多个配送员,可以通过调整算法,计算最优的配送员路线分配。
http://www.dtcms.com/a/297807.html

相关文章:

  • Qwen3-235B-A22B-Thinking-2507 - 开源思维推理模型的新标杆
  • ClickHouse 常用的使用场景
  • Java学习第七十四部分——Elasticsearch(ES)
  • 订单数据解密:从数据来源到状态分析的SQL实战指南
  • 【Python】一些PEP提案(四):scandir、类型约束,异步asyncawait
  • 工业缺陷检测的计算机视觉方法总结
  • Linux文件系统权限
  • 【基于CKF的IMM】MATLAB例程,CV和CT两个模型下的IMM,二维,滤波使用CKF(容积卡尔曼滤波),附下载链接
  • 基于ENMeval包的MaxEnt模型参数优化总结
  • C#索引器、接口、泛型
  • 构建跨平台远程医疗系统中的视频通路技术方案探究
  • Java 反射机制详解:从基础到实战,彻底掌握 Class、Method、Field 的动态操作
  • 免模型控制
  • 解决笔记本合盖开盖DPI缩放大小变 (异于网传方法,Win11 24H2)
  • TCP模型,mqtt协议01 day41
  • 全国产8通道250M AD FMC子卡
  • C语言————原码 补码 反码 (试图讲清楚版)
  • 基于粒子群优化的PID控制在药液流量控制系统中的应用
  • 数组相关学习
  • IP证书:构建数字世界知识产权安全防线的基石
  • Jenkins构建间代码变更记录追踪方案
  • JAVA知识点(四):SpringBoot与分布式、微服务架构
  • 从huggingface上下载模型
  • 前端学习日记(十三)
  • Qt 网络编程进阶:HTTP 客户端实现
  • Microsoft-DNN NTLM暴露漏洞复现(CVE-2025-52488)
  • 使用Python绘制金融数据可视化工具
  • ISIS高级特性LSP的分片扩展
  • k8s下springboot-admin 监控服务部署,客户端接入
  • MYSQL高可用集群搭建--docker