基于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

参考

  1. https://www.redblobgames.com/pathfinding/a-star/introduction.html

Python实现最短路问题常见求解算法——A*算法相关推荐

  1. 【上篇】Python实现最短路问题常见求解算法——Label Correcting Algorithm(deque)

    基于python语言,实现deque label correcting 算法对最短路问题(Shortest Path Problem)进行求解. 目录 1. 适用场景 2. 算法说明 3. 测试网络 ...

  2. Python实现最短路问题常见求解算法1——Label Correcting Algorithm(deque)

    原文链接 1. 适用场景 无负环网络 起点与终点间至少存在一条可行路径 可求解单一起点到多点的最短路径 2. 算法说明 应用标号法求解最短路问题时有两种选择,一是采用 label setting 策略 ...

  3. 【下篇】Python实现最短路问题常见求解算法——Label Correcting Algorithm(deque)

    基于python语言,实现deque label correcting 算法对最短路问题(Shortest Path Problem)进行求解,可以识别网络中是否含有负环. 目录 1. 适用场景 2. ...

  4. Python实现最短路问题常见求解算法2——Label Correcting Algorithm(deque)

    原文链接 1. 适用场景 可识别网络中存在的负环 起点与终点间至少存在一条可行路径 可求解单一起点到多点的最短路径 2. 负环识别方法 在介绍网络负环识别方法之前,先定义几个符号: nnn :网络节点 ...

  5. Python实现VRP常见求解算法——蚁群算法(ACO)

    基于python语言,实现经典蚁群算法(ACO)对车辆路径规划问题(CVRP)进行求解. 目录 优质资源 1. 适用场景 2. 求解效果 3. 问题分析 4. 数据格式 5. 分步实现 6. 完整代码 ...

  6. Python实现VRP常见求解算法——差分进化算法(DE)

    基于python语言,实现经典差分进化算法(DE)对车辆路径规划问题(CVRP)进行求解. 目录 1. 适用场景 2. 求解效果 3. 问题分析 4. 数据格式 5. 分步实现 6. 完整代码 参考 ...

  7. 【进阶二】Python实现VRPTW常见求解算法——差分进化算法(DE)

    基于python语言,实现经典差分进化算法(DE)对带有时间窗的车辆路径规划问题( VRPTW )进行求解. 目录 往期优质资源 1. 适用场景 2. 求解效果 3. 代码分析 4. 数据格式 5. ...

  8. Python实现VRP常见求解算法——离散量子行为粒子群算法(DQPSO)

    基于python语言,实现经典离散量子行为粒子群算法(DQPSO)对车辆路径规划问题(CVRP)进行求解. 目录 优质资源 1. 适用场景 2. 求解效果 3. 问题分析 4. 数据格式 5. 分步实 ...

  9. 【改进篇】Python实现VRP常见求解算法——禁忌搜索算法(TS)

    基于python语言,实现经典禁忌搜索算法(TS)对车辆路径规划问题(CVRP)进行求解, 优化代码结构,改进Split函数 目录 往期优质资源 1. 适用场景 2. 改进效果对比 3. 求解结果 4 ...

最新文章

  1. 比特币的扩容问题:千军万马过独木桥!
  2. do while(false)
  3. ios请求php接口失败,laravel,php_iOS调用Laravel接口返回错误信息,laravel,php,ios - phpStudy...
  4. 【解析】人人网:我的青春小鸟一样不回来
  5. mysql数据库引擎博客_mysql 数据库引擎常识全集
  6. 用C语言写的迅雷看看XV文件提取器及C语言源代码
  7. Sending HTML content in an email using PHP
  8. 快速实现一个室内空气质量检测仪
  9. 如何将数据仓库从 AWS Redshift 迁移到阿里云 AnalyticDB for PostgreSQL
  10. Serverless会使 SaaS 商业模式过时,而开源将成为新的王者
  11. java获取http文件大小_Java开发网 - 关于通过HTTPUrlConnection获取一个文件的大小?...
  12. 疫情可视化--2.爬虫--百度迁徙的疫情数据(各省市各个时间段迁入迁出比例)
  13. 根据IP获取国家地区
  14. 张云雷的《探清水河》登上央视,为什么蔡国庆可以随心所欲地唱
  15. 【c++】C语言之输入行数,输出实心菱形和空心菱形
  16. 莘城苑:面包种类选择
  17. 印象笔记(evernote)支持MarkDown语法
  18. 下载或移除 Chrome 主题背景
  19. Java Web项目性能测试 - JMeter测试网站吞吐量、反应时间百分比、流量
  20. 14.4 设计新闻发布系统

热门文章

  1. Stm32F103RC驱动ili9488 LCD TFT 3.5寸液晶屏
  2. Drools workbench kie-server部署和简单使用(全流程)
  3. N皇后问题——Acwing
  4. 07版cad插件express怎么下载_AutoCAD安装完成以后怎么加载Express Tools?
  5. 计算机二级考试就业前景,大学四年别“混日子”,有三类证书“最值钱”,考取将提高就业率...
  6. matlab微积分计算
  7. canal 监听同步指定数据库,刷新redis缓存
  8. Vue(二)vue 指令及用法举例
  9. 【31. 走迷宫(BFS)】
  10. 玩客云折腾之路 - (Armbian/Armv7l) 搭建Gitea - 通过二进制文件安装