Python实现最短路问题常见求解算法——A*算法
基于python语言,实现A*算法对最短路问题(Shortest Path Problem)进行求解。
目录
- 1. 适用场景
- 2. 测试网络
- 3. 代码实现
- 参考
1. 适用场景
- 无负环网络
- 起点与终点间至少存在一条可行路径
2. 测试网络
这里以Tempe ASU网络为测试数据集,网络如下图所示,可通过osm2gmns工具包获取。
3. 代码实现
(1)定义数据结构
class Network():def __init__(self):self.source_node_id=Noneself.sink_node_id=Noneself.node_id_list=[]self.node_x_coord={}self.node_y_coord={}self.node_neighbors={}self.number_of_nodes=0self.link_list=[]self.link_cost={}
(2)读取csv网络文件
def read_data(node_file,link_file,net):#读取node文件with open(node_file) as f:node_reader = csv.reader(f)next(node_reader)for row in node_reader:net.node_id_list.append(int(row[0]))net.node_x_coord[int(row[0])]=float(row[1])net.node_y_coord[int(row[0])]=float(row[2])net.node_neighbors[int(row[0])]=[]#读取link文件with open(link_file) as f:link_reader=csv.reader(f)next(link_reader)for row in link_reader:from_node_id=int(row[1])to_node_id=int(row[2])cost=float(row[3])net.node_neighbors[from_node_id].append(to_node_id)net.link_list.append([from_node_id,to_node_id])net.link_cost[from_node_id,to_node_id]=costnet.number_of_nodes=len(net.node_id_list)
(3)评估函数
def evaluate_remaining_distance(current,net):return abs(net.node_x_coord[current]-net.node_x_coord[net.sink_node_id])\+abs(net.node_y_coord[current]-net.node_y_coord[net.sink_node_id])
(4)最短路径可视化函数
def show_shortest_path(net,path_node_id_list):for from_node_id,to_node_id in net.link_list:x_coords=[net.node_x_coord[from_node_id],net.node_x_coord[to_node_id]]y_coords=[net.node_y_coord[from_node_id],net.node_y_coord[to_node_id]]plt.plot(x_coords,y_coords,color='black',linewidth=0.5)path_x_coord=[]path_y_coord=[]for node_id in path_node_id_list:path_x_coord.append(net.node_x_coord[node_id])path_y_coord.append(net.node_y_coord[node_id])plt.plot(path_x_coord,path_y_coord,color='b')plt.xlabel('x_coord')plt.ylabel('y_coord')plt.show()
(5)最短路搜索
def find_shortest_path(net):frontier = PriorityQueue()frontier.put((net.source_node_id,0))came_from = {}cost_so_far = {}came_from[net.source_node_id] = Nonecost_so_far[net.source_node_id] = 0while not frontier.empty():current=frontier.get()[0]if current == net.sink_node_id:breakfor next_node in net.node_neighbors[current]:new_cost = cost_so_far[current] + net.link_cost[current, next_node]if next_node not in cost_so_far or new_cost < cost_so_far[next_node]:cost_so_far[next_node] = new_costpriority = new_cost + evaluate_remaining_distance(next_node,net)frontier.put((next_node,priority))came_from[next_node] = currentpath_node_id_list=[net.sink_node_id]pre_node_id=came_from[net.sink_node_id]path_cost=0while pre_node_id!=net.source_node_id:path_node_id_list.insert(0,pre_node_id)path_cost+=net.link_cost[path_node_id_list[0],path_node_id_list[1]]pre_node_id=came_from[pre_node_id]path_node_id_list.insert(0,net.source_node_id)path_cost += net.link_cost[path_node_id_list[0], path_node_id_list[1]]path='-'.join( [ str(i) for i in path_node_id_list] )print("the trave cost from node id=%s to node id=%s is: %s"%(net.source_node_id,net.sink_node_id,path_cost))print("the shortest path from node id=%s to node id=%s is: %s"%(net.source_node_id,net.sink_node_id,path))show_shortest_path(net,path_node_id_list)
(6)主函数
if __name__=='__main__':net=Network()net.source_node_id=4298net.sink_node_id=169read_data('./node.csv','./link.csv',net)if net.source_node_id not in net.node_id_list:print(" %s not found"%net.source_node_id)sys.exit(0)if net.sink_node_id not in net.node_id_list:print(" %s not found"%net.sink_node_id)sys.exit(0)find_shortest_path(net)
(7)求解结果
(8)样例数据集代码文件
https://github.com/PariseC/Shortest_Path_Algorithm/tree/master/A%20star
参考
- https://www.redblobgames.com/pathfinding/a-star/introduction.html
Python实现最短路问题常见求解算法——A*算法相关推荐
- 【上篇】Python实现最短路问题常见求解算法——Label Correcting Algorithm(deque)
基于python语言,实现deque label correcting 算法对最短路问题(Shortest Path Problem)进行求解. 目录 1. 适用场景 2. 算法说明 3. 测试网络 ...
- Python实现最短路问题常见求解算法1——Label Correcting Algorithm(deque)
原文链接 1. 适用场景 无负环网络 起点与终点间至少存在一条可行路径 可求解单一起点到多点的最短路径 2. 算法说明 应用标号法求解最短路问题时有两种选择,一是采用 label setting 策略 ...
- 【下篇】Python实现最短路问题常见求解算法——Label Correcting Algorithm(deque)
基于python语言,实现deque label correcting 算法对最短路问题(Shortest Path Problem)进行求解,可以识别网络中是否含有负环. 目录 1. 适用场景 2. ...
- Python实现最短路问题常见求解算法2——Label Correcting Algorithm(deque)
原文链接 1. 适用场景 可识别网络中存在的负环 起点与终点间至少存在一条可行路径 可求解单一起点到多点的最短路径 2. 负环识别方法 在介绍网络负环识别方法之前,先定义几个符号: nnn :网络节点 ...
- Python实现VRP常见求解算法——蚁群算法(ACO)
基于python语言,实现经典蚁群算法(ACO)对车辆路径规划问题(CVRP)进行求解. 目录 优质资源 1. 适用场景 2. 求解效果 3. 问题分析 4. 数据格式 5. 分步实现 6. 完整代码 ...
- Python实现VRP常见求解算法——差分进化算法(DE)
基于python语言,实现经典差分进化算法(DE)对车辆路径规划问题(CVRP)进行求解. 目录 1. 适用场景 2. 求解效果 3. 问题分析 4. 数据格式 5. 分步实现 6. 完整代码 参考 ...
- 【进阶二】Python实现VRPTW常见求解算法——差分进化算法(DE)
基于python语言,实现经典差分进化算法(DE)对带有时间窗的车辆路径规划问题( VRPTW )进行求解. 目录 往期优质资源 1. 适用场景 2. 求解效果 3. 代码分析 4. 数据格式 5. ...
- Python实现VRP常见求解算法——离散量子行为粒子群算法(DQPSO)
基于python语言,实现经典离散量子行为粒子群算法(DQPSO)对车辆路径规划问题(CVRP)进行求解. 目录 优质资源 1. 适用场景 2. 求解效果 3. 问题分析 4. 数据格式 5. 分步实 ...
- 【改进篇】Python实现VRP常见求解算法——禁忌搜索算法(TS)
基于python语言,实现经典禁忌搜索算法(TS)对车辆路径规划问题(CVRP)进行求解, 优化代码结构,改进Split函数 目录 往期优质资源 1. 适用场景 2. 改进效果对比 3. 求解结果 4 ...
最新文章
- 比特币的扩容问题:千军万马过独木桥!
- do while(false)
- ios请求php接口失败,laravel,php_iOS调用Laravel接口返回错误信息,laravel,php,ios - phpStudy...
- 【解析】人人网:我的青春小鸟一样不回来
- mysql数据库引擎博客_mysql 数据库引擎常识全集
- 用C语言写的迅雷看看XV文件提取器及C语言源代码
- Sending HTML content in an email using PHP
- 快速实现一个室内空气质量检测仪
- 如何将数据仓库从 AWS Redshift 迁移到阿里云 AnalyticDB for PostgreSQL
- Serverless会使 SaaS 商业模式过时,而开源将成为新的王者
- java获取http文件大小_Java开发网 - 关于通过HTTPUrlConnection获取一个文件的大小?...
- 疫情可视化--2.爬虫--百度迁徙的疫情数据(各省市各个时间段迁入迁出比例)
- 根据IP获取国家地区
- 张云雷的《探清水河》登上央视,为什么蔡国庆可以随心所欲地唱
- 【c++】C语言之输入行数,输出实心菱形和空心菱形
- 莘城苑:面包种类选择
- 印象笔记(evernote)支持MarkDown语法
- 下载或移除 Chrome 主题背景
- Java Web项目性能测试 - JMeter测试网站吞吐量、反应时间百分比、流量
- 14.4 设计新闻发布系统
热门文章
- Stm32F103RC驱动ili9488 LCD TFT 3.5寸液晶屏
- Drools workbench kie-server部署和简单使用(全流程)
- N皇后问题——Acwing
- 07版cad插件express怎么下载_AutoCAD安装完成以后怎么加载Express Tools?
- 计算机二级考试就业前景,大学四年别“混日子”,有三类证书“最值钱”,考取将提高就业率...
- matlab微积分计算
- canal 监听同步指定数据库,刷新redis缓存
- Vue(二)vue 指令及用法举例
- 【31. 走迷宫(BFS)】
- 玩客云折腾之路 - (Armbian/Armv7l) 搭建Gitea - 通过二进制文件安装