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

python寻路算法:A* 算法实现 python寻路算法:A* 算法实现A* 算法简介关键代码介绍保存基本信息的地图类搜索到的节点类算法主函数介绍代码的初始化完整代码 A* 算法简介 A* 算法需要维护两个数据结构:OPEN 集和 CLOSED 集。OPEN 集包含所有已搜索到的待检测节点。初始状态,OPEN集仅包含一个元素:开始节点。CLOSED集包含已检测的节点。初始状态,CLOSED集为空。每个节点还包含一个指向父节点的指针,... 阅读详情

基于python语言,实现A*算法对最短路问题(Shortest Path Problem)进行求解。

1. 适用场景

  • 无负环网络
  • 起点与终点间至少存在一条可行路径

2. 测试网络

这里以Tempe ASU网络为测试数据集,网络如下图所示,可通过osm2gmns工具包获取。

在这里插入图片描述

3. 代码实现

(1)定义数据结构

class Network():
    def __init__(self):
        self.source_node_id=None
        self.sink_node_id=None

        self.node_id_list=[]
        self.node_x_coord={}
        self.node_y_coord={}
        self.node_neighbors={}
        self.number_of_nodes=0
        self.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]=cost
    net.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] = None
    cost_so_far[net.source_node_id] = 0

    while not frontier.empty():
        current=frontier.get()[0]

        if current == net.sink_node_id:
            break

        for 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_cost
                priority = new_cost + evaluate_remaining_distance(next_node,net)
                frontier.put((next_node,priority))
                came_from[next_node] = current

    path_node_id_list=[net.sink_node_id]
    pre_node_id=came_from[net.sink_node_id]
    path_cost=0
    while 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=4298
    net.sink_node_id=169
    read_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
【路径规划】(2) A* 算法求解最短路,附python完整代码 A* 算法主要用在静态且周围环境已知的情况下,是建立在 Dijkstra 和BFS 基础上的启发式遍历搜索算法,在路径规划时不仅要考虑自身与最近节点位置的距离(Dijkstra 实现),还需要考虑自身位置与目标点的距离(BFS 实现)。 阅读详情

相关推荐

A*算法求解迷宫问题(算法讲解与证明、python实现与可视化)

A*算法是一种有序搜索算法,其特点在于对估价函数的定义上。对于一般的有序搜索,总是选择f值最小的节点作为扩展节点。因此,f是根据需要找到一条最小代价路径的观点来估算节点的,所以,可考虑每个节点n的估价函数值f(n)有两个分量:从起始节点到节点n的代价g(n)以及从节点n到达目标节点的代价h(n),即f(n)=g(n)+h(n)。 迷宫问题是实验心理学中一个古典问题。迷宫从入口到出口可能有若干条通路,本实验要求求出从入口到出口的最短路径。

m0_51653200的博客 1万+

A*算法详解一看就懂(python)

定义 A*算法,A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。 定义解析 A*算法是一个“搜索算法”,实质上是广度优先搜索算法(BFS)的优化。从起点开始,首先遍历起点周围邻近的点,然后再遍历已经遍历过的点邻近的点,逐步的向外扩散,直到找到终点。 A*算法的作用是“求解最短路径”,如在一张有障碍物的图上移动到目标点,以及八数码问题(从一个状态到另一个状态的最短途径) A*算法的思路类似图

孔艺菲的博客 6万+

Python A*算法的简单实现

总起 A*算法常用于游戏的寻路中,用于求解静态路网中的最短路径,是最有效的直接搜索方法。 这次正好花了几天时间学习了一下Python,便拿这个算法做了一下练习。这篇文章也会对其思路做一个简单介绍。 文章中的源码可以在 GitHub - anguangzhihen/PythonTest 中的AStarTest.py找到。 算法思路 A*算法实际是由广度优先遍历和Dijkstra算法演变而来的: 1.广度优先遍历主要是通过从起点依次遍历周围的点而寻找最优的路径; 2.Dijkstra基

暗光之痕的博客 1万+

Python实现A*(Astar)算法寻找最短路径

使用 for item in M: 只可获取副本,无法改变M中值 应使用 for index, item in enumerate(M): 改变item即可改变M中值 import math a = 5 # 矩阵长度 b = 5 # 矩阵宽度 def init(listx): # a=int(input("x of target:")) # b=int(input("y of target:")) for i in range(0, a):

zao_yu的博客 4012

最短路径python实现—(Dijstra算法和A*算法)

前言:这个是我人工智能导论的作业(作业报告),参考了网上一些资料。写的不太全。两个算法的思路我没写,具体写的是代码实现思路和用Python的细节。 一,Dijstra算法 案例:求从Arad到Bucharest两地的最短距离 代码: # -*- coding: utf-8 -*- """ Created on Mon Aug 16 18:02:58 2021 @author: mxp """ from collections import deque #使用宏定义第一个最大值inf..

weixin_50573361的博客 5223

python调用gurobi求解最短路问题

文章目录最短路问题Shortest Path Problem一、数学模型二、使用步骤1.引入库2.读入数据总结 最短路问题Shortest Path Problem 最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 copytright@baidu 一、数学模型 min⁡∑(i,j)∈Acijxij∑(j,i)∈Axij−∑(i,j)xji=bi,∀i∈V,bi={−1,if  i=s,0,if  i≠s  and  i≠t,1,if  i=t, \

zaowuyingshu的博客 6405

用Python搞定迷宫最短路径:BFS算法实战(附Educoder通关代码)

本文详细介绍了如何使用Python实现BFS(宽度优先搜索)算法解决迷宫最短路径问题,并提供了适配Educoder平台的完整通关代码。通过工程实现细节和平台适配技巧的讲解,帮助读者掌握从问题分析到代码落地的全流程,特别适合算法学习者和技术面试准备者。

weixin_30698297的博客 406

使用A*算法求迷宫最短路径问题

原创文章,转载请联系作者 时光只解催人老,不信多情,长恨离亭,泪滴春衫酒易醒。 前言 最近接触了一个挺有意思的小课题,跟大家分享一下。就是利用A*算法,来计算迷宫可行路径。有关这个算法的知识,大家可以看看A*算法维基百科以及A星算法详解来稍作了解。代码地址在此Maze,喜欢Python的小可爱们可以拿去练练手。 提要说明 本题中的迷宫,是以宫格类型呈现的,在代码中的呈现为二维...

HappyAndroidi的博客 8474

使用A*算法求最短路径

图论中最短路径的求解之A*算法实现 代码链接 利用A*算法找到从A城市到B城市的最短路径,以及代价,其中A *算法中的h也就是从当前点到目标点的距离已经给出。程序要有通用性,即其中城市A、B可以为下图中任意的两个城市 在做这个作业时我感觉数据给的不完整,说真的二维图论搜索基本是上按照两点之间的距离作为启发式函数,数据里只给了其他点到一个点直线距离,所以如果城市增多,那么我的这个启发式函数就可...

lxxnb666的博客 1万+

Python实现A*寻路算法

算法评估每个节点的代价,这个代价包括起点到该节点的实际距离和从该节点到终点的估计距离。通过评估所有节点的代价,A*算法可以找到最小代价的路径。该代码输出的结果为[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)],表示寻找到的最佳路径。其中get_neighbors函数用于获取当前节点的相邻节点,get_distance函数用于计算两个节点之间的距离。其中f表示节点的总代价,parent表示当前节点的父节点,is_obstacle表示该节点是否为障碍物。

带你成为别人眼中的大佬! 1287

Python:最短路

如下图所示,GG 是一个无向图,其中蓝色边的长度是 11、橘色边的长度是 22、绿色边的长度是 33。

炒茄子的博客 605

A*算法的实现(Python)

前言 关于A*算法的实现是很早之前的一次开发中的成果,并做了一些改进。当然,在这里就不记录改进部分了,因为其中还有一些争议。这里仅是对A*算法的理解和使用Python实现。 定义 (百度百科)A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快 一个真正的A*算法必须包含以下对象:开启列表、关闭列表、G、H 分析 估价函数F(n)=G(n)+H(n) 其中 1 1 估价函数

zhj_1121的博客 2万+

蚂蚁群算法求解最短路径问题(Python&Matlab实现)

目录 1 知识点 1.1蚁群算法步骤 1.2蚁群算法程序 2 蚂蚁算法求解最短路径问题——Python实现 2.1 源码实现 2.2 ACA_TSP实现 3蚂蚁算法求解最短路径问题——Matlab实现 3.1 流程图 3.2 代码实现 3.3 结果 1 知识点 详细知识点见:智能优化算法—蚁群算法(Python实现) 我们这一节知识点只讲蚁群算法求解最短路径步骤及流程。 1.1蚁群算法步骤 设蚂蚁的数量为m,地点的数量为n,地点i与地点j之...

weixin_46039719的博客 8395

python实现Dijkstra算法求解最短路径问题(Shortest Path Problem)

python实现Dijkstra算法求解最短路径问题(Shortest Path Problem)

南军Opt的博客 5476

手把手教你用Node.js模拟大麦APP下单请求(含滑块验证处理)

本文详细解析了如何使用Node.js模拟大麦APP下单请求的全流程,包括接口逆向、滑块验证处理和签名算法逆向等关键技术。通过实战案例和代码示例,帮助开发者掌握移动端API调用的核心要素,如动态参数构造、安全验证突破等,提升自动化下单的成功率和效率。

weixin_42569329的博客 355

从URDF到Gazebo:一个完整的ROS2机械臂仿真项目实战与避坑指南

本文提供了一个完整的ROS2机械臂仿真项目实战指南,详细讲解了从URDF建模、ROS2 Control配置、MoveIt2集成到Gazebo仿真的全流程。文章重点分享了URDF惯性参数设置、Gazebo插件选择、MoveIt2配置修正等关键步骤的避坑经验,帮助开发者快速搭建可用的六轴机械臂仿真环境,实现从静态模型到物理仿真的跨越。

weixin_29279153的博客 275

A*算法求解迷宫寻路问题实验

A* 搜索算法是一种启发式搜索算法。所谓启发式搜索算法,就是在盲目搜索算法中加入一个启发函数,在当前节点搜索完毕后,通过这个启发函数来进行计算,选择代价最少的节点作为下一步搜索的节点。通过这样的方式就能够找到最优解。DFSBFS这两种搜索方式都属于盲目的搜索方式,它不会在选择下一个节点的时候进行代价计算,而是按照一个固定的方式选择,这样在运气不好的情况,会对所有节点进行遍历。A* 搜索算法的核心就在于如何设计一个好的启发函数,启发函数的表达形式为:f(n)=g(n)+h(n)。

power_function的博客 2723

【CMU-自主导航与规划】Autonomous Exploration Development Environment 实战:从环境搭建到多场景测试

本文详细介绍了CMU开源自主导航开发环境(Autonomous Exploration Development Environment)的实战部署与测试。内容涵盖从Ubuntu与ROS环境搭建、仿真场景配置,到核心导航模块(地形分析、局部避障、航点跟踪)的深度解析,并演示了如何集成TARE探索与FAR规划等上层算法,最终指导连接真实SLAM与实车部署,完成多场景性能评估。

weixin_29215391的博客 706

03-0002 Python实现A*算法

Python实现A*算法1.算法描述2.问题描述3.算法原理4.算法源码5.算法输出6.总结 1.算法描述 A*搜寻算法俗称A星算法,是比较流行的启发式搜索算法之一,被广泛应用于路径优化领域。它的独特之处是检查最短路径中每个可能的节点时引入了全局信息,对当前节点距终点的距离做出估计,并作为评价该节点处于最短路线上的可能性的量度。 A*改变它自己行为的能力基于启发式代价函数,启发式函数在游戏中非常有...

雯饰太一的博客 5875

39-高级优化技术:指令调度与乱序执行 - 手把手教你手写CPU

本文介绍了现代处理器设计中提高指令级并行性(ILP)的两种关键技术:指令调度和乱序执行。指令调度分为静态调度(由编译器完成)和动态调度(由硬件完成),后者能更好适应运行时情况但复杂度更高。乱序执行通过动态重排指令顺序提高硬件利用率,其核心组件包括重排序缓冲区、保留站和寄存器重命名。文章提供了保留站的Verilog实现示例,并分析了不同优化技术在性能、硬件开销和功耗方面的权衡。最终指出,CPU设计需根据性能、功耗等需求选择合适的优化技术。

2301_79143213的博客 86

070、人脸AE实战:基于人脸检测的亮度优先与背光补偿算法

本文分享了基于人脸检测的亮度优先与背光补偿算法的实战经验。针对逆光自拍场景下人脸过曝问题,作者提出了动态平衡方案: 通过内缩20%的人脸核心区域提取亮度,避免背景干扰 创新性地采用"亮度差+置信度"的背光判定机制 设计动态权重分配策略,人脸权重可在30%-70%间调整 引入平滑处理防止亮度跳变,补偿增益限制在1.5倍以内 关键点在于:不是简单提亮人脸,而是通过分析人脸与背景亮度差,在80-110目标亮度范围内动态调整,实现自然的人脸曝光效果。算法已在实际项目中验证,解决了传统AE在逆光场景下的失效问题。

zzfmlxs的博客 34

【Python】A*八数码问题_求解思路与代码实现

A*八数码,求解思路与代码实现

I_no_know_answer的博客 4193

[QMT和ptrade量化交易小白入门]-121、如何用K-means聚类,每月自动筛选高流动性ETF

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 828
上一篇: Python实现分配问题常见求解算法——竞拍算法(Auction Algorithm)
下一篇: 【上篇】Python实现最短路问题常见求解算法——Label Correcting Algorithm(deque)
Better.C
博客等级 码龄9年 1万+粉丝 72原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值